哪个表在嵌套循环连接中被视为“内部”

时间:2012-08-29 12:13:51

标签: sql join nested-loops

有人能告诉我哪个表被认为是嵌套循环连接中的内部表吗?例如,如果查询为from a inner join b on...,哪一个,ab将被视为内部?我知道它是b,但是从dbsophic的文章中,小外环下的第一个示例,带有良好索引的内部输入似乎表明相反。

3 个答案:

答案 0 :(得分:8)

确定......

  • “INNER JOIN”是逻辑(关系)连接运算符
  • 内部和外部表是物理嵌套循环连接运算符
  • 中的概念

物理运算符的内部和外部表的选择由优化器完成,并且与逻辑运算符无关

现在,嵌套循环psudeo代码就是这个

for each row R1 in the outer table
    for each row R2 in the inner table
        if R1 joins with R2
            return (R1, R2)

所以它在理论上没有什么不同。

在实践中,优化器将为内部和外部表格找到最好的方法:这是您的文章链接应该描述的内容。 A.k.a如何减少迭代次数

为了完整性...... INNER JOIN逻辑运算符是可交换的和关联的 因此A INNER JOIN BB INNER JOIN A相同 这里没有内外表

答案 1 :(得分:2)

实际上,两个表都是inner,因为如果两个表中都匹配,则只返回行 在进行外连接时,您可以指定哪个表应该是外连接:

  • left outer join:第一个表是返回所有行的表,第二个表是只返回匹配行的表。
  • 右外连接:第二个表是返回所有行的表,第一个表是仅返回匹配行的表。
  • 完全外部联接:返回两个表中的所有行。

答案 2 :(得分:0)

我想知道我们是否需要将思维分为"外部联接"和"内循环加入"。

对于外部联接,有一个约定(传统?)将LEFT JOIN的LEFT命名为"外部表"。 (参见下面的Sybase)它似乎是语法指定。 (丹尼尔正在解释这一点。)

对于内部联接,没有这样的区别,但是对于嵌套循环连接,需要确定哪个表成为驱动表,并且由优化器确定。

Sybase有一篇描述内部和外部表的文章。 http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc32300.1570/html/sqlug/sqlug153.htm "术语外表和内表描述了表在外连接中的位置"