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

Sql 谓词推送内联视图如何降低查询速度?,sql,oracle,optimization,predicate,sql-execution-plan,Sql,Oracle,Optimization,Predicate,Sql Execution Plan,我继承了一个有点混乱的查询,我正在进行重构以提高性能 在此过程中,出于个人偏好,我做了一件事,就是将所有ANSI-99连接语法从“内部连接”和“左外部连接”语句更改为查询中的谓词。我注意到两件非常奇怪的事情,我希望能解释一下 从“内部联接…”语法更改联接已更改解释计划。使用ANSI99语法,oracle对要联接的列执行完整的表扫描。更改联接语法后,它现在执行谓词推送。为什么连接语法会改变解释计划 推动内联视图的谓词实际上已经将查询速度降低了一个很大的幅度。在3秒左右运行的查询(在更改联接之前)。

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

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

  • 从“内部联接…”语法更改联接已更改解释计划。使用ANSI99语法,oracle对要联接的列执行完整的表扫描。更改联接语法后,它现在执行谓词推送。为什么连接语法会改变解释计划
  • 推动内联视图的谓词实际上已经将查询速度降低了一个很大的幅度。在3秒左右运行的查询(在更改联接之前)。现在需要9秒。老实说,我对阅读解释计划还比较陌生,所以完全有可能是由于另一个原因,查询的重组减慢了它的速度。但归根结底,我的问题是:“谓词推送索引列是否可能大大降低查询速度?如果可能,为什么?”
  • 谢谢你的回复,如果这不是很清楚,我很抱歉

    谓词推送索引列是否可能大大降低查询速度?若然,原因为何

    当然是

    通常,谓词推送使优化器选择
    嵌套循环
    ,而不是
    哈希连接

    如果条件不是选择性的,则速度可能较慢

    这个问题

    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
    
    将使用
    嵌套循环
    (t2.col1,t2.col2)
    上的索引(如果已定义)

    如果
    col2
    table2
    上有选择性,则后者的效率更高,如果没有选择性,则效率更低

    我有根据地猜测,你的情况就是这样


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

    谢谢您的解释。如果使用谓词推送或不使用谓词推送,简单地更改联接的语法会改变,这是否很常见?@jnt30:Oracle的优化器可以以不可预测的方式工作。我个人概述了在最坏情况下将运行10秒以上的每个查询。@Quassnoi:好的,谢谢。我知道我看到了你关于这方面的其他一些帖子,我会看看这些帖子,并试图弄清楚这一切。我主要是一名Java开发人员,所以其中一些对我来说是非常新的。我感谢您花时间回答我的问题。请发布之前和之后的查询,您的更改可能不仅仅是“语法”更改-如果更改查询的含义(或添加/删除优化人员可用的信息),它们可能会对计划产生相当大的影响。