Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 联接查询中表的顺序_Sql_Oracle_Join - Fatal编程技术网

Sql 联接查询中表的顺序

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

我在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 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则内部连接的结果集将始终为m。在第一种情况下,逻辑读取的次数为10+10,在第二种情况下,逻辑读取的次数为1000+1000,每个部门平均读取100次

然而,像这样使用有序hitn编写查询是不正常的做法。最好在大多数时候把优化留给乐观主义者

我不确定你是从哪个文档中得到这段话的,但我在哪里看到的,前面有一段非常重要的段落,你省略了。我在这里引用它是为了让其他可能认为这种编写查询的方法是标准的人受益:

通常,优化器会选择最好的 执行计划,执行的最佳顺序 要联接的表。万一 优化器没有产生好的结果 执行计划您可以控制 使用提示的执行顺序 功能SQL。有关更多信息,请参阅 Oracle数据库Lite SQL 参考资料


-

您真的在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