如何判断在内联视图中推送会减慢查询速度?

问题描述:

我已经继承了一个有点混乱的查询,我正在重构为高性能。如何判断在内联视图中推送会减慢查询速度?

在这个过程中,由于个人喜好我所做的一件事是将“内连接”和“左外连接”语句中的所有ANSI-99连接语法都改为查询中的谓词。我注意到了两件非常奇怪的事情,我会感激解释。

  1. 更改“INNER JOIN ...”语法中的连接更改了解释计划。使用ANSI 99语法,oracle对正在连接的列进行全表扫描。在改变连接语法之后,它现在执行谓词推送。为什么连接语法会改变解释计划?
  2. 推进内联视图的谓词实际上减慢了查询的极大幅度。大约3秒后运行的查询(在更改连接之前)。现在它需要9秒。说实话,我对阅读解释计划相当陌生,所以完全有可能由于其他原因,查询的重组放慢了速度。但最终我的问题是:“索引列上的谓词推送是否有可能大大减慢查询速度?如果是这样,为什么?”

感谢您的答复,我的道歉,如果这是不是很清楚......

+0

请在发布之前和之后的查询中,您的更改可能不仅仅是“语法”更改 - 如果它们更改查询的含义(或添加/删除可用于优化器的信息)该计划相当大。 – 2009-06-26 01:52:04

是否有可能推谓词索引列上如此大幅减慢查询?如果是这样,为什么?

当然可以。

通常,谓词推送使优化程序选择NESTED LOOPS而不是HASH JOIN

如果条件没有选择性,这可能会变慢。

这个查询

SELECT * 
FROM table1, t1 
     (
     SELECT /*+ NO_PUSH_PRED */ 
       * 
     FROM table2 t2 
     WHERE t2.col1 = :value1 
     ) t2o 
WHERE t2o.col2 = t1.col2 

将最有可能建设超过table1内容的哈希表,并通过探头对这个哈希表(反之亦然)的视图返回的行。

这个查询:

SELECT * 
FROM table1, t1 
     (
     SELECT /*+ PUSH_PRED */ 
       * 
     FROM table2 t2 
     WHERE t2.col1 = :value1 
     ) t2o 
WHERE t2o.col2 = t1.col2 

将使用NESTED LOOPS(t2.col1, t2.col2)索引,如果它的定义。

如果col2table2有选择性,则后者更有效,如果不是,则效率更低。

我的教育猜测是,这正是你的情况发生了什么。

如果您发布您的查询和执行计划,我可能会告诉更多。

+0

感谢您的解释。如果使用谓词推送,简单地改变连接的语法会改变吗? – jnt30 2009-06-25 18:13:42