使用运行Oracle单记录更新/插入的绑定变量是否有优势?

防弹少年团

我被Oracle管理员困扰,告诉我,如果我使用绑定变量而不是内联,Oracle可以优化更好的请求。代码为C#,并使用Devart Oracle提供程序Oracle12c +。我了解,如果您运行select-缓存统计信息,则下一个类似的命令会更好。.但是单行插入/更新会有所影响。我不相信。

任何人都可以给出明智的答案吗?

例:

update x set a = 0 where id = 100

vs 

update x set a = :a where id = :id

编辑:未绑定的值仅是数字,因此SQL注入不在问题范围内

防弹少年团

绝对的答案促使我进行了基准测试。它模仿生产服务器的确切条件。

30000次迭代的结果(相差6.5%):

Inline vars: 00:01:09.7444764
Bound  vars: 00:01:05.4454827
static void Main(string[] args)
{
    var LEN = 30000;
    var cmd = new OracleCommand();
    var sql = "update some_table set progress={0} where id=100";
    var rnd = new Random((int)DateTime.Now.Ticks);

    //

    var sw = new Stopwatch();
    sw.Start();

    for (int i = 0; i < LEN; i++)
    {
        using(var cnn = new OracleConnection("xxx"))
        {
            sql = string.Format(sql, rnd.Next());
            cmd.CommandText = sql;
            cmd.Connection = cnn;

            cnn.Open();
            cmd.ExecuteNonQuery();
        }
    }

    sw.Stop();

    Console.WriteLine("Inline vars: {0}", sw.Elapsed);

    //

    sw.Restart();

    sql = "update tm_fnet set progress=:p where id=:i";

    for (int i = 0; i < LEN; i++)
    {
        using (var cnn = new OracleConnection("xxx"))
        {
            cmd.CommandText = sql;
            cmd.Connection = cnn;
                        cmd.Parameters.Clear();
            cmd.Parameters.AddWithValue("i", 100);
            cmd.Parameters.AddWithValue("p", rnd.Next());

            cnn.Open();
            cmd.ExecuteNonQuery();
        }
    }

    sw.Stop();

    Console.WriteLine("Bound vars: {0}", sw.Elapsed);

    //

    Console.ReadKey(false);
}

结论-除非您必须关心SQL注入,否则它并不那么重要(但这与我的情况无关)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

CX_Oracle使用绑定变量/函数插入数据并返回记录ID

来自分类Dev

Oracle更新现有记录或插入新记录

来自分类Dev

使用env为子shell设置变量是否有优势?

来自分类Dev

在C ++中使用const成员变量是否有优势

来自分类Dev

使用全局变量而不是指针是否有优势?

来自分类Dev

在C ++中使用const成员变量是否有优势

来自分类Dev

使用类型而不是记录有优势吗?

来自分类Dev

使用类型而不是记录有优势吗?

来自分类Dev

是否可以使用绑定变量创建Oracle视图?

来自分类Dev

Windows7(+)是否具有env或等效版本?(用于单次运行的环境变量)

来自分类Dev

插入后,Oracle触发该更新记录

来自分类Dev

如果不是为了延迟初始化,那么使用方法而不是静态类成员来构建单例是否有任何优势?

来自分类Dev

使用传递的变量更新记录

来自分类Dev

是否可以从视图中对多条记录运行单条记录报告?

来自分类Dev

错误的绑定变量触发器,用于更新和插入

来自分类Dev

使用无点标识功能代替通配符是否有优势?

来自分类Dev

通过增加Pk使用单记录将多条记录插入表中

来自分类Dev

Toad for Oracle使用IN子句绑定变量

来自分类Dev

如何使用JOOQ在PostgreSQL中插入带有JSON列的可更新记录?

来自分类Dev

在WiredTiger中对MongoDb文档执行部分更新是否比完整文档更新有任何优势?

来自分类Dev

Oracle不会对具有绑定变量的regex_replace使用基于函数的索引

来自分类Dev

使用变量更新活动记录的属性

来自分类Dev

使用子查询Oracle更新多个记录

来自分类Dev

django插入或更新记录

来自分类Dev

绑定大插入或更新的更有效方法?

来自分类Dev

与Java中的局部变量相比,全局声明静态值是否具有性能优势?

来自分类Dev

选择是否使用MySQL语句更新记录

来自分类Dev

如何使用Oracle SQL查找表中是否还有更多记录

来自分类Dev

MongoDB-将频繁更新的字段移至不同集合是否有任何优势?

Related 相关文章

  1. 1

    CX_Oracle使用绑定变量/函数插入数据并返回记录ID

  2. 2

    Oracle更新现有记录或插入新记录

  3. 3

    使用env为子shell设置变量是否有优势?

  4. 4

    在C ++中使用const成员变量是否有优势

  5. 5

    使用全局变量而不是指针是否有优势?

  6. 6

    在C ++中使用const成员变量是否有优势

  7. 7

    使用类型而不是记录有优势吗?

  8. 8

    使用类型而不是记录有优势吗?

  9. 9

    是否可以使用绑定变量创建Oracle视图?

  10. 10

    Windows7(+)是否具有env或等效版本?(用于单次运行的环境变量)

  11. 11

    插入后,Oracle触发该更新记录

  12. 12

    如果不是为了延迟初始化,那么使用方法而不是静态类成员来构建单例是否有任何优势?

  13. 13

    使用传递的变量更新记录

  14. 14

    是否可以从视图中对多条记录运行单条记录报告?

  15. 15

    错误的绑定变量触发器,用于更新和插入

  16. 16

    使用无点标识功能代替通配符是否有优势?

  17. 17

    通过增加Pk使用单记录将多条记录插入表中

  18. 18

    Toad for Oracle使用IN子句绑定变量

  19. 19

    如何使用JOOQ在PostgreSQL中插入带有JSON列的可更新记录?

  20. 20

    在WiredTiger中对MongoDb文档执行部分更新是否比完整文档更新有任何优势?

  21. 21

    Oracle不会对具有绑定变量的regex_replace使用基于函数的索引

  22. 22

    使用变量更新活动记录的属性

  23. 23

    使用子查询Oracle更新多个记录

  24. 24

    django插入或更新记录

  25. 25

    绑定大插入或更新的更有效方法?

  26. 26

    与Java中的局部变量相比,全局声明静态值是否具有性能优势?

  27. 27

    选择是否使用MySQL语句更新记录

  28. 28

    如何使用Oracle SQL查找表中是否还有更多记录

  29. 29

    MongoDB-将频繁更新的字段移至不同集合是否有任何优势?

热门标签

归档