【问题标题】:Oracle's plain behavior on EXECUTE IMMEDIATE with REPLACE and variable bindOracle 在 EXECUTE IMMEDIATE 上的简单行为与 REPLACE 和变量绑定
【发布时间】:2013-12-06 13:58:37
【问题描述】:

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

使用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

谢谢。

【问题讨论】:

  • 请展示您的示例代码和SQL语句。
  • a) 隐含在另一个平原上,是 b) 吗?
  • 如果你使用的是绑定变量,并且执行的SQL语句是一样的,那么我认为oracle不会再做硬解析了。尝试测试并查看 V$sqlarea 视图以查看显示的内容。
  • oracle 文档网站上的文字提出了质疑。我将搜索 V$sqlarea,我有几年的 C++ 但 Oracle 的 0,5 \m/
  • 这个thread on Tom Kyte's site有点长,但值得一读。

标签: sql oracle plsql


【解决方案1】:

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

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

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

为完全避免重新解析,您可以使用DBMS_SQL 代替EXECUTE IMMEDIATE 并在解析后按住光标。除非您确定了由软解析引起的重大性能问题,否则我不会这样做。

【讨论】:

  • @RodrigoGurgel 不知道 11g 和 12c 版本中的当前情况,但在 9i 和 10g 中 DBMS_SQL 比立即执行要慢,并且在文档中进行了说明。如果我没记错的话,根据 Oracle 的说法,差异是 1.5 - 3 倍。
  • 好的,我去搜索一下。
猜你喜欢
  • 2010-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-21
  • 2019-05-15
  • 2011-06-10
  • 1970-01-01
  • 2019-12-15
相关资源
最近更新 更多