我试图避免在每次动态SQL使用时计算oracle的plain。
使用REPLACE
然后使用EXECUTE IMMEDIATE
而不是USING
会导致开销,因为每次使用时字符串都不同,Oracle似乎总是会搜索新的平原。
但是阅读EXECUTE IMMEDIATE
声明a发现了以下内容:
USING
绑定强制Oracle重新计算每个动态字符串吗?如果是这样,如何避免呢?
a) querytoselect = REPLACE( querytoselect, 'pattern', 'var' );
EXECUTE IMMEDIATE querytoselect.
b) EXECUTE IMMEDIATE querytoselect USING var
感谢。
答案 0 :(得分:3)
EXECUTE IMMEDIATE
总是进行解析,但如果该语句与已经在内存中的语句相同,则可以简单地使用已经确定的计划(这称为“软解析”),而不必完全解析声明并确定一个新计划(“硬解析”)。
它确实比它更精细,并且还取决于您的配置。例如,即使在内存中找到匹配语句,绑定查看和表统计信息也可能导致执行硬解析以确定在给定特定输入的情况下是否存在可能更好的计划。
但总的来说,软解析比硬解析的开销更少,并且使用绑定变量会增加避免硬解析的机会。
为了完全避免重新解析,您可以使用DBMS_SQL
而不是EXECUTE IMMEDIATE
并在解析后保持光标。除非你已经发现了由软解析引起的重大性能问题,否则我不打算这样做。