2

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

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

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

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

4

1 回答 1

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 LOOPSand 索引。(t2.col1, t2.col2)

col2如果对 有选择性,则后者效率更高,如果table2不是,则效率较低。

我有根据的猜测是,这正是您的情况。

如果您发布您的查询和执行计划,我可能会提供更多信息。

于 2009-06-25T15:35:44.447 回答