谁能告诉我哪个表被认为是嵌套循环连接中的内部表?例如,如果查询是from a inner join b on...
,则哪个a
、 或b
将被视为内部?我知道是这样b
,但是从dbsophic的文章来看,具有良好索引的内部输入的 Small outer loop下的第一个示例似乎暗示了相反的情况。
3 回答
为了确定...
- “INNER JOIN”是一个逻辑(关系)连接运算符
- 内表和外表是物理嵌套循环连接运算符中的概念
物理运算符的内部和外部表的选择由优化器进行,与逻辑运算符无关。
现在,嵌套循环伪代码是这样的
for each row R1 in the outer table
for each row R2 in the inner table
if R1 joins with R2
return (R1, R2)
所以理论上没什么区别。
在实践中,优化器将为内表和外表找出最佳方法:这是您的文章链接应该描述的内容。又如何减少迭代次数
为了完整性......INNER JOIN
逻辑运算符是可交换的和关联的
所以A INNER JOIN B
是相同的B INNER JOIN A
。
这里没有内表和外表
实际上,inner
如果两个表中都存在匹配项,则两个表都只返回行。
在进行外部联接时,您指定哪个表应该是外部表:
- 左外连接:第一个表是返回所有行的表,第二个表是只返回匹配行的表。
- 右外连接:第二个表是返回所有行的表,第一个表是只返回匹配行的表。
- 全外连接:返回两个表中的所有行。
我想知道我们是否需要将思维分为“外连接”和“内循环连接”。
对于外部联接,有一个约定(传统?)将 LEFT 的 LEFT JOIN 命名为“外部表”。(见下文来自 Sybase)这似乎是句法名称。(丹尼尔正在解释这一点。)
对于inner join没有这样的区别,但是对于nested loop join,需要判断哪个表成为驱动表,由优化器决定。
Sybase 有一篇文章描述了内部表和外部表。 http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc32300.1570/html/sqlug/sqlug153.htm “术语外表和内表描述了表的位置在外连接中”