谓词如何推动内联视图会降低查询速度?

时间:2009-06-25 15:28:17

标签: sql oracle optimization predicate sql-execution-plan

我继承了一个有点混乱的查询,我正在努力重构以提高性能。

在此过程中,由于个人偏好而做的事情之一是将“内部联接”和“左外部联接”语句中的所有ANSI-99联接语法更改为查询中的谓词。我注意到两件非常奇怪的事情我会很感激。

  1. 更改“INNER JOIN ...”语法中的连接已更改解释计划。使用ANSI 99语法,oracle对正在连接的列执行全表扫描。更改连接语法后,它现在执行谓词推送。为什么连接语法会改变解释计划?
  2. 推送内联视图的谓词实际上减慢了查询的速度。正在运行的查询(在更改连接之前)大约3秒。现在需要9秒。说实话,我对阅读解释计划还是比较新的,因此查询的重组完全有可能因为其他原因而放慢了速度。但最终我的问题是:“谓词是否有可能推动索引列来大幅减慢查询?如果是这样,为什么?”
  3. 感谢您的回复,如果不是很清楚我的道歉......

1 个答案:

答案 0 :(得分:3)

  

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

当然可以。

通常,谓词推送会使优化器选择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具有选择性,后者效率更高,如果不是{{1}}则效率更低。

我有根据的猜测是,这正是你案件中发生的事情。

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