【问题标题】:Why Access and Filter Predicates are the same here?为什么访问谓词和过滤谓词在这里是一样的?
【发布时间】:2021-04-19 07:31:12
【问题描述】:

当我使用 Oracle SQL Developer 获得上述查询的自动跟踪输出时,我看到连接条件用于访问和过滤谓词。我的问题是,它是否从 DEPT_ID_PK 中读取了所有的部门 ID,然后使用这些 ID 来访问和过滤员工表?如果是这样,为什么员工表有全表扫描?为什么使用departments表的department_ids再次读取employees表?有没有人可以简单的一步一步看一下这个执行计划,并解释一下这里为什么使用访问谓词和过滤谓词?

最好的问候

【问题讨论】:

    标签: oracle oracle-sqldeveloper sql-execution-plan sqlperformance sql-tuning


    【解决方案1】:

    它是一个合并连接(有点像哈希连接,当连接表的投影在连接列上排序时使用合并连接。合并连接比哈希连接更快并且使用更少的内存)。

    所以 Oracle 对外部表 (EMPLOYEES) 进行全表扫描,然后以有序的方式读取内部表。

    过滤谓词是将进行投影的列

    更多详情:https://datacadamia.com/db/oracle/merge_join

    【讨论】:

      【解决方案2】:

      它使用主键来避免排序,否则计划是这样的

      “访问谓词”和“过滤谓词”之间的区别并不是特别一致,因此请以健康的怀疑态度对待它们。例如,如果您删除 USE_MERGE 提示,那么计划中将不再有 Fiter Predicates,并且 Access Predicates 节点将重新定位在 HASH_JOIN 节点下(对于 MERGE_JOIN 也更有意义):

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-30
        • 1970-01-01
        • 2021-08-01
        相关资源
        最近更新 更多