为什么SQL查询每次都可以在后续执行时执行更多时间?

时间:2015-08-20 11:06:32

标签: oracle oracle11g

我针对基于Oracle DB 11G的eBS R12架构运行复杂查询:

首次运行需要4秒钟。如果我再次运行它,它需要9,接下来30等。

如果我添加"和1 = 1"它需要4秒钟,然后是9秒,30秒等等。

快速的工作原理是我们添加了一个随机生成的"和sometstring = somestring"现在结果总是在4秒内。

我从来没有采用过这种方式的查询(它应该是相反的,或者执行之间没有明显的变化)。我们在相同数据库的两个副本上测试了它,行为相同。

如何调试?什么内部机制可能会混淆?

更新1:

EXPLAIN PLAN FOR
(my query);
SELECT * FROM table(DBMS_XPLAN.DISPLAY);

在第一次运行之前与后续运行完全相同。见http://pastebin.com/dMsXmhtG

2 个答案:

答案 0 :(得分:3)

检查DBMS_XPLAN.DISPLAY_CURSOR。原因可能是基数反馈或Oracle使用的其他自适应技术。您应该看到与查询的SQL_ID相关的多个子游标,您可以比较它们的计划。

您的查询是否绑定了用于过滤直方图的变量和列?这可能是另一个原因。

答案 1 :(得分:2)

听起来您可能会受到自适应光标共享或基数反馈的影响。 Here is an article显示如何关闭它们 - 也许你可以这样做,看看问题是否停止发生,以及使用@ OldProgrammer建议追踪正在发生的事情。

如果发现其中一个是问题,那么您可以采取必要的步骤以确保纠正根本原因(例如,不正确的统计数据,不必要的直方图等)。