我针对基于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
答案 0 :(得分:3)
检查DBMS_XPLAN.DISPLAY_CURSOR。原因可能是基数反馈或Oracle使用的其他自适应技术。您应该看到与查询的SQL_ID相关的多个子游标,您可以比较它们的计划。
您的查询是否绑定了用于过滤直方图的变量和列?这可能是另一个原因。
答案 1 :(得分:2)
听起来您可能会受到自适应光标共享或基数反馈的影响。 Here is an article显示如何关闭它们 - 也许你可以这样做,看看问题是否停止发生,以及使用@ OldProgrammer建议追踪正在发生的事情。
如果发现其中一个是问题,那么您可以采取必要的步骤以确保纠正根本原因(例如,不正确的统计数据,不必要的直方图等)。