我们在生产中使用动态查询已经有很多年了,执行它花了5-6秒的时间,直到我们最后的代码部署。现在,相同的查询需要几天时间才能完成。这是一个相对简单的嵌套选择,它连接5-6个表,其中最大的有几十万行(其他大部分是小型查找表)。
相同的查询运行在不同的数据库实例上非常快(有更多的数据和完全相同的代码基)。
我很清楚,像explain plan这样的工具只显示预测的执行计划,但是这个特定实例上的解释计划非常糟糕(对于相对而言,它没有使用似乎在所有其他实例上使用的索引)。
我的问题是:如果查询、表结构没有改变,或者数据读取量发生了很大的变化,为什么执行计划会发生如此大的变化,我怎么能预料到这样的变化呢?
添加了信息,查询开始于一个选择不同的.我们注意到,在这个db实例上,如果我们删除不同的(这不一定会给出正确的结果),那么执行计划与原来的非常相似,要快得多。
编辑: Satistics是在上次代码部署之后直接运行的。
发布于 2016-04-24 03:07:11
优化器采用SQL语句和统计的解析表示,以最低的成本生成最终执行计划。在此过程中,优化器生成多个计划并对它们进行比较。随着优化器输入(解析的SQL语句和统计数据)的更改,执行计划可能会发生变化。
随着底层优化器输入的变化,执行计划变更的原因执行计划可以也确实会发生变化。EXPLAIN PLAN输出显示在解释语句时数据库将如何运行SQL语句。由于执行环境和解释计划环境的不同,此计划可能与SQL语句使用的实际执行计划不同。Oracle文档清楚地指出,当我们更改模式和更改成本时,执行计划可能会有所不同。
如果我们在不同的数据库中在不同的模式下运行相同的SQL语句,那么生成的计划也可能是不同的。即使是模式和数据库也是一样的,但是执行计划的成本是不同的,那么优化器也可以选择不同的执行计划。绑定变量、数据大小及其统计量、优化器的参数可能会影响成本。
猜测为什么要更改执行计划是很困难的,因为我们没有数据库的元数据(它们是动态的),我们必须查询这些元数据,以便进行进一步的调查和它的耗时任务。
您可以使用SQL调优顾问、SQLTXPLAN、SQL跟踪等来更容易地找到影响执行计划的元素。
详细信息:甲骨文数据库SQL调优指南
https://dba.stackexchange.com/questions/136232
复制相似问题