Oracle查询转换停用

| 有时,我会在开发,集成测试和生产性系统中对不同的查询执行计划大打折扣。除了我进行的常规分析之外,我只想知道: 是否可以在系统级别上停用某些查询优化器的转换操作(就像可以使用提示在每个查询级别上停用它们一样)? 在这种情况下,我希望查询看起来像这样的一个“ 0”操作:
SELECT ...
FROM (SELECT ... FROM A
      UNION ALL
      SELECT ... FROM B)
WHERE X = :B1
A
B
是视图,均从包含
X
的相同表中选择,其中
X
是主键。重要的是,在获取所有
A
B
数据之前,先将
X
的选择推送到视图
A
B
中。这也是可能的,因为不需要复杂的转换。 因此,除了停用的索引,不良的统计信息,绑定变量偷看问题以及所有其他常见的疑问之外,整个Oracle实例是否有可能因为关闭而无法进行一两次转换?
已邀请:
是。各种不同的初始化参数控制着查询的转换和优化,但其中很多都没有记载。 以下查询显示所有未记录的参数,至少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将生成一个优化跟踪文件,该文件将显示哪些参数(已记录文档或其他参数)影响了查询计划的生成。
如果要在不同实例之间具有稳定的执行计划,则可以通过导出参考系统上的统计信息并将其导入到其他系统中来实现此目标。 可以在手册和此处找到示例 您可能还希望在导入后将统计信息锁定在目标环境中,以便不更改它们。
有许多数据库初始化参数可以启用或禁用各种优化器选项和不同的查询转换。因此,如果您在不同的环境中设置了不同的初始化参数,那么您肯定会遇到这样一种情况,即尽管具有相同的数据结构和统计信息,但一种环境可以执行特定的转换而另一种环境则不能。 对于这种特定查询,我立即想到了
OPTIMIZER_SECURE_VIEW_MERGING
参数。对于这种特定类型的构造,这绝对有可能引起问题。

要回复问题请先登录注册