【发布时间】:2010-08-24 08:59:30
【问题描述】:
在我的数据库中,开发人员在多个地方都使用了动态 sql 而不是静态的。他们说这样做的原因是为了提高性能。有人能告诉我动态sql是否真的可以提高存储过程或plsql块的性能吗?
哪个执行得更快,为什么?
1.
begin
execute immediate 'delete from X';
end;
2.
begin
delete from X;
end;
【问题讨论】:
-
我不确定“从 X 中删除”之类的查询,但总的来说,如果您的查询有参数,动态查询可以更快地工作,我见过很多次。为什么?看起来当你编译你的 sproc DB 时不知道参数可以是什么,并且可以选择错误的计划。在动态查询的情况下,当我用查询创建字符串然后执行它时,所有参数都被插入并且计划执行更好。这听起来很奇怪,但是当性能很重要时,我也会这样做。回到你的问题 -> 你的查询是像你写的那样,还是更复杂(通过 sproc 插入参数)?
-
大部分查询都很简单,可以用静态方式编写。这就是为什么我想知道当它可以以静态方式编写时为什么要进行动态查询。
-
我认为你的论点是正确的——如果它可以写成静态的,那最好写成静态的。
-
经验法则(可能涉及失去所述经验):OLTP 应用程序和处理应绑定/参数化 SQL; DSS(决策支持)/DW 系统应该是动态/文字 SQL。