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

问题描述 投票:1回答:3

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注入不在问题范围内

c# .net oracle oracle12c devart
3个回答
2
投票

如果您通过用户输入中的字符串连接来构建查询,则极易受到SQL Injection攻击的攻击。 DB管理员明智的做法是永远不必制作this call。它甚至不影响您执行哪种操作-SQL注入基本上可以运行随机SQL代码。

现在,确切的替代方法随您的编程语言而变化。在C#中,使用Parametized Queries。不仅这些SQL注入证明,而且还提供了一些类型检查,并且应该更快。而且我个人甚至觉得它更具可读性。无需使用引号引起的迷宫。

但是,尽管您提到了绑定变量,但您可能正在使用Prepared Statements。我会说实话:我很少使用它们。他们似乎更复杂,那么值得。但是,如果那是您的图书馆和Langauge支持的唯一非串联方式,那就是您必须采取的方法。

请注意,在可以使用串联的情况下,仍然存在苗条情况。也就是说,如果未从磁盘,网络或用户输入中读取字符串。最近,我遇到了一种情况,根据用户输入,必须附加一个IN子句。它是一个不同的值(值和长度),具体取决于输入。而且我使用的是准备好的语句,但对它的处理不够好。但是,由于要附加的字符串是在switch / case语句中从头开始选择/生成的(100%由用户输入),因此没有危险。最好情况下,随机用户输入可能会遇到默认情况。


0
投票

与简单的UPDATEINSERT语句一起使用绑定变量在性能上有[[huge优势。

首先,由于不必解析那么多唯一的语句,因此直接提高了性能。一开始,小的UPDATE似乎很简单,但是幕后发生了很多事情。必须分析每个唯一的语句-Oracle必须检查每个语句的语法和安全性。使用绑定变量,该工作仅发生一次。下面的简单测试显示,使用绑定变量,UPDATE的运行速度快10倍。

-- Create simple table with one record. create table x(id number, a number); insert into x values(100, 0); commit; -- 10,000 concatenated UPDATES - 5 seconds. begin for i in 1 .. 10000 loop execute immediate 'update x set a = '||i||' where id = 100'; end loop; end; / -- 10,000 bind variable UPDATES - 0.3 seconds. -- (Execute immediate is used here keep this test similar to above.) begin for i in 1 .. 10000 loop execute immediate 'update x set a = :i where id = 100' using i; end loop; end; /

此外,使用绑定变量可能使您可以使用批处理并将性能提高10倍。

使用绑定变量意味着将只有一个SQL_ID,这使得对DBA

much>]的性能调整和跟踪更加容易。如果有一个错误的执行计划,只有一个SQL_ID,有许多计划管理选项可用。最后,创建大量唯一语句将填充共享池(用于包含执行计划信息的内存结构)。大量的语句可能会将其他语句推出池,从而间接导致其他性能问题。


0
投票
分类答案促使我进行基准测试。它模仿确切的prod服务器条件。
© www.soinside.com 2019 - 2024. All rights reserved.