连接查询中的表顺序

Jer*_*rry 7 sql oracle join

我在Oracle文档中找到了这一段

如果要选择每个部门的名称及其管理员的名称,可以使用以下两种方法之一编写查询.在下面的第一个示例中,提示/ ++有序++ /表示按照表中出现在FROM子句中的顺序进行连接,并尝试优化连接顺序.

SELECT /*+ordered*/ d.NAME, e.NAME
FROM DEPT d, EMP e WHERE d.MGR = e.SS#
Run Code Online (Sandbox Code Playgroud)

要么:

SELECT /*+ordered*/ d.NAME, e.NAME 
FROM EMP e, DEPT d WHERE d.MGR = e.SS# 
Run Code Online (Sandbox Code Playgroud)

假设有10个部门和1000个员工,并且每个查询中的内部表在连接列上都有一个索引.在第一个查询中,第一个表生成10个符合条件的行(在本例中为整个表).在第二个查询中,第一个表生成1000个符合条件的行.第一个查询将访问EMP表10次并扫描DEPT表一次.第二个查询将扫描EMP表一次,但将访问DEPT表1000次.因此,第一个查询将执行得更好.根据经验,表格应从最小有效数字行到最大有效行数排列.通过应用完全在该表上解析的逻辑条件,可以获得查询中表的有效行大小.

但我没有正确理解这一点.如果m表t1中有行和n表t2中的行,那么m x n在这两种情况下sql引擎都不会遍历行吗?

更新:感谢所有回复.我不会压倒优化器,只是想确认一下我的想法.

tho*_*aux 2

这取决于 WHERE 语句。

SELECT /++ordered++/ d.NAME, e.NAME FROM DEPT d, EMP e WHERE d.MGR = e.SS#
Run Code Online (Sandbox Code Playgroud)

将为每个部门选择所有经理。由于有 10 个部门,因此会获取 10 条记录。

SELECT /++ordered++/ d.NAME, e.NAME FROM EMP e, DEPT d
Run Code Online (Sandbox Code Playgroud)

这将选择所有员工及其所在部门的名称。由于有 1000 名员工,因此您的结果集将有 1000 行。

JOIN 永远不会导致您的引擎循环遍历行m x n,内部联接的结果集将始终是mifm < n