Oracle使用REPLACE和变量绑定在EXECUTE IMMEDIATE上的明显行为

时间:2013-12-05 18:50:15

标签: sql oracle plsql

我试图避免在每次动态SQL使用时计算oracle的plain。

使用REPLACE然后使用EXECUTE IMMEDIATE而不是USING会导致开销,因为每次使用时字符串都不同,Oracle似乎总是会搜索新的平原。

但是阅读EXECUTE IMMEDIATE声明a发现了以下内容:

You can execute a dynamic SQL statement repeatedly using new values for the bind arguments. You still incur some overhead, because EXECUTE IMMEDIATE re-prepares the dynamic string before every execution.

那是吗? USING绑定强制Oracle重新计算每个动态字符串吗?如果是这样,如何避免呢?

a) querytoselect = REPLACE( querytoselect, 'pattern', 'var' );
   EXECUTE IMMEDIATE querytoselect.

b) EXECUTE IMMEDIATE querytoselect USING var

感谢。

1 个答案:

答案 0 :(得分:3)

EXECUTE IMMEDIATE总是进行解析,但如果该语句与已经在内存中的语句相同,则可以简单地使用已经确定的计划(这称为“软解析”),而不必完全解析声明并确定一个新计划(“硬解析”)。

它确实比它更精细,并且还取决于您的配置。例如,即使在内存中找到匹配语句,绑定查看和表统计信息也可能导致执行硬解析以确定在给定特定输入的情况下是否存在可能更好的计划。

但总的来说,软解析比硬解析的开销更少,并且使用绑定变量会增加避免硬解析的机会。

为了完全避免重新解析,您可以使用DBMS_SQL而不是EXECUTE IMMEDIATE并在解析后保持光标。除非你已经发现了由软解析引起的重大性能问题,否则我不打算这样做。