Oracle 为什么Access和Filter谓词在这里是相同的?

Oracle 为什么Access和Filter谓词在这里是相同的?,oracle,oracle-sqldeveloper,sql-execution-plan,sqlperformance,sql-tuning,Oracle,Oracle Sqldeveloper,Sql Execution Plan,Sqlperformance,Sql Tuning,当我使用OracleSQLDeveloper获得上面查询的自动跟踪输出时,我看到连接条件用于访问和筛选谓词。我的问题是,它是否从DEPT_ID_PK读取所有department_ID,然后使用这些ID访问和筛选employees表?如果是,为什么employees表有完整的表扫描?为什么它使用departments表的department\u id再次读取employees表?任何人都可以简单地一步一步地阅读这个执行计划,并解释为什么在这里使用access和filter谓词 这是一种合并联接(有

当我使用OracleSQLDeveloper获得上面查询的自动跟踪输出时,我看到连接条件用于访问和筛选谓词。我的问题是,它是否从DEPT_ID_PK读取所有department_ID,然后使用这些ID访问和筛选employees表?如果是,为什么employees表有完整的表扫描?为什么它使用departments表的department\u id再次读取employees表?任何人都可以简单地一步一步地阅读这个执行计划,并解释为什么在这里使用access和filter谓词

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

所以Oracle对外部表(EMPLOYEES)进行完整的表扫描,并以有序的方式读取内部表

filter谓词是将在其上执行投影的列


更多详细信息:

它使用主键来避免排序,否则计划如下

“访问谓词”和“过滤谓词”之间的区别并不特别一致,因此对它们持相当数量的怀疑态度。例如,如果删除USE\u MERGE提示,则计划中将不再有Fiter谓词,并且访问谓词节点将重新定位到HASH\u JOIN节点下(这对于MERGE\u JOIN也更有意义):