为什么访问和过滤谓词在这里是一样的?

问题描述

enter image description here

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

最好的问候

解决方法

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

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

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

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

,

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

Hinted plan

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