有时候我会对开发,集成测试和生产系统中的不同查询执行计划感到困惑。除了我经常进行的分析外,我只想知道:
是否可以在系统级别停用某些查询优化器的转换操作(就像可以使用提示在每个查询级别停用它们一样)?
在这种情况下,我希望查询的UNION ALL PUSHED PREDICATE
操作看起来大致如下:
SELECT ...
FROM (SELECT ... FROM A
UNION ALL
SELECT ... FROM B)
WHERE X = :B1
A
和B
是视图,两者都选自包含X
的相同表格,其中X
是主键。在获取所有X
和A
数据之前,将B
的选择推入到A
和B
两个视图中非常重要。而且它也是可能的,因为不需要复杂的转换。
除了停用的索引,错误的统计信息,绑定变量偷看问题以及所有其他常见的嫌疑人之外,是否有可能整个Oracle实例因为关闭而无法执行一次或两次转换? / p>
答案 0 :(得分:2)
是。各种各样的初始化参数控制着查询转换和优化,其中很多都没有记录。
以下查询显示所有未记录的参数,至少为10g:
SELECT a.ksppinm "Parameter",
b.ksppstvl "Session Value",
c.ksppstvl "Instance Value"
FROM x$ksppi a,
inner join x$ksppc b
on a.indx = b.indx
inner join x$ksppsv c
on a.indx = c.indx
WHERE a.ksppinm LIKE '/_%' escape '/'
/
同样,设置事件10053将生成一个优化跟踪文件,该文件将显示影响查询计划生成的参数(记录或以其他方式)。
答案 1 :(得分:2)
如果您希望跨不同实例拥有稳定的执行计划,则可以通过导出参考系统的统计信息并将其导入其他实例来实现此目的。
可以找到in the manual和here
的示例您可能还希望在导入后锁定目标环境中的统计信息,以便不更改它们。
答案 2 :(得分:1)
有许多数据库初始化参数可以启用或禁用各种优化程序选项和不同的查询转换。因此,如果您在不同的环境中设置了不同的初始化参数,那么您肯定会遇到这样的情况,即一个环境可以执行特定的转换而另一个环境不能拥有相同的数据结构和统计信息。
对于这个特定查询,我的想法立即转到OPTIMIZER_SECURE_VIEW_MERGING
参数。这肯定有可能给这种特殊类型的构造带来问题。