Sql 联接查询中表的顺序
我在Oracle文档中找到了这一段 如果您要选择每个项目的名称 部门及其名称 经理,您可以将查询写入 两种方法之一。在第一个例子中 下面的提示是/++++/ 说按顺序加入 表格显示在FROM子句中,带有 正在尝试优化联接顺序Sql 联接查询中表的顺序,sql,oracle,join,Sql,Oracle,Join,我在Oracle文档中找到了这一段 如果您要选择每个项目的名称 部门及其名称 经理,您可以将查询写入 两种方法之一。在第一个例子中 下面的提示是/++++/ 说按顺序加入 表格显示在FROM子句中,带有 正在尝试优化联接顺序 SELECT /*+ordered*/ d.NAME, e.NAME FROM DEPT d, EMP e WHERE d.MGR = e.SS# 或: SELECT /*+ordered*/ d.NAME, e.NAME FROM EMP e, DEPT d WHER
SELECT /*+ordered*/ d.NAME, e.NAME
FROM DEPT d, EMP e WHERE d.MGR = e.SS#
或:
SELECT /*+ordered*/ d.NAME, e.NAME
FROM EMP e, DEPT d WHERE d.MGR = e.SS#
假设有10个部门
和1000名员工,以及
每个查询中的表都有一个索引
连接列。在第一个查询中,
第一个表产生10个限定值
行在本例中是整个表。
在第二个查询中,第一个表
生成1000个符合条件的行。这个
第一个查询将访问EMP表
10次,扫描DEPT表一次。
第二个查询将扫描EMP
表一次,但将访问该部门
表1000次。因此第一
查询将执行得更好。作为一个
根据经验,桌子应该是
从最小有效位置排列
将行数设置为最大有效行数
行数。有效行大小
查询中的表的
应用逻辑条件
完全在那张桌子上解决
但我没有正确理解这一点。如果表t1中有m行,表t2中有n行,那么sql引擎在这两种情况下不是都要经过m x n行吗
更新:感谢所有回复。我不会覆盖优化器,只是想确认我的想法。这取决于WHERE语句
SELECT /++ordered++/ d.NAME, e.NAME FROM DEPT d, EMP e WHERE d.MGR = e.SS#
将选择每个部门的所有经理。由于有10个部门,因此将获取10条记录
SELECT /++ordered++/ d.NAME, e.NAME FROM EMP e, DEPT d
这将选择所有员工及其所在部门的名称。由于有1000名员工,您的结果集将有1000行
连接永远不会导致引擎在m x n行上循环,如果m
-您真的在oracle文档中发现了这一点吗 你不应该使用有序的提示,让甲骨文为你做决定,这在当今大多数情况下都非常有效 但是,联接顺序在性能方面会有所不同 该示例似乎讨论了嵌套循环连接:
Case 1:
-> 1 lookup to find 10 rows in table A
-> 10 index lookups in table B
Case 2:
-> 1 lookup to find 1000 rows in table B
-> 1000 index lookups in table A
您能在阅读本文的文档中发布一个链接吗?您在Oracle文档中的第二个查询中缺少where子句。@Peter-添加where子句:我不明白您所说的内部联接的结果集是什么意思,如果m