【问题标题】:Same filter and access predicates in Oracle explain planOracle 解释计划中的相同过滤器和访问谓词
【发布时间】:2015-11-11 13:51:54
【问题描述】:

我有一个 users 表,其中包含一个 username 列,并且此列中有一个 B 树索引。当我检查以下查询的解释计划时:select username from users where username like 'A%' 我可以看到 Oracle 对索引执行了索引范围扫描以提取所需的信息,这绝对可以,但是在索引范围扫描期间,Oracle 使用了以下谓词: access(username like 'A%')filter(username like 'A%').

为什么甲骨文同时使用它们?它们完全一样,所以我认为其中一个就足够了。

【问题讨论】:

    标签: database oracle sql-execution-plan


    【解决方案1】:

    这不是答案,只是一些链接和引用:

    访问谓词(“访问”) 访问谓词表示叶子节点遍历的开始和停止条件。

    索引过滤谓词(索引操作的“过滤器”) 索引过滤谓词仅在叶节点遍历期间应用。它们不会影响开始和停止条件,也不会缩小扫描范围。

    表级过滤谓词(表操作的“过滤器”) 不属于索引的列的谓词在表级别进行评估。为此,数据库必须首先从表中加载行。

    简而言之,正如 Tom Kyte 所说:

    访问意味着我们正在使用某些东西来“访问”数据——我们只“访问”相关数据。 过滤器意味着我们获得了比我们需要的更多的数据,并且我们在获得它之后过滤它。过滤器将应用于所有行,并且仅适用于通过过滤器的行

    https://asktom.oracle.com/pls/apex/f?p=100:11:::NO:RP:P11_QUESTION_ID:7807480400346035212

    Oracle Youtube 频道也有不错的视频:https://www.youtube.com/watch?v=K0f2Yzue7yw

    【讨论】:

      【解决方案2】:

      Oracle (IMO) 的理念与您的预期相反。 FILTER 谓词不仅在明显的情况中被缩减,而且有时会随着额外的过滤条件而扩展。

      小例子

       select  * from tst where c1 like 'A%'  and c1 like '%A'
      

      产量

          2 - access("C1" LIKE 'A%')
         filter("C1" IS NOT NULL AND "C1" LIKE 'A%' AND "C1" LIKE '%A')
      

      因此添加了额外的 NOT NULL 约束。

      我只能推测,过滤处理比访问(在内存中)更便宜,所以 双重检查 比几个 CPU 周期要好。也有可能,Oracle 必须处理访问可能提供超过谓词中定义的访问的特殊情况,例如对集群表的访问。

      【讨论】:

        猜你喜欢
        • 2010-11-30
        • 2014-10-15
        • 1970-01-01
        • 1970-01-01
        • 2021-09-13
        • 2021-04-19
        • 2011-02-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多