2011-02-16 31 views
2

JOIN,LEFT JOIN,RIGHT JOIN,FULL JOIN?使用SQL,每种加入类型的效率排名是多少

我猜连接每一边的数据集的大小可能会使得LEFT vs RIGHT成为一个硬打电话,但其他人如何比较。

也是我正确的假设JOIN & INNER JOIN是一样的吗?如果没有,这是如何符合订单/排名的。

+1

它不关乎效率,它们返回不同的结果。 – 2011-02-16 21:35:05

+1

@The - 在所需结果来自INNER JOIN的情况下,则可以选择 OUTER。接下来的问题是,外部连接的执行是否比INNER连接执行得更好 – RichardTheKiwi 2011-02-16 21:41:44

回答

3

是的,JOIN和INNER JOIN是一样的。一般来说,排名是JOIN最快的,紧接着是LEFT JOIN,相当于RIGHT JOIN,然后通过FULL JOIN在距离很远的地方。

但是这个排名是如此变化以至于很大程度上可以忽略。您的实际表现高度依赖于数据集的大小,适当索引的可用性以及选择的确切查询计划。一个LEFT JOIN可能很快,而下一个INNER JOIN可能是冰河时慢的。

尽管如此,我建议避免完全联合,除非你绝对需要它。 (至少在甲骨文,这是我的经验不好的地方。)

+0

感谢您确认我的想法。我发布了另一个SQL问题,并且我提到了使用LEFT JOIN进行FULL JOIN。 http://stackoverflow.com/questions/5021993/is-there-a-way-to-make-this-sql-more-efficient – JGFMK 2011-02-16 21:38:38

1

排名他们的效率将是毫无意义的,因为他们返回不同的结果。如果你需要一个左连接,内连接将不会完成这项工作。

连接的效率与表的大小,索引以及查询的其余部分的写入方式有关,而不是INNER,OUTER,CROSS或FUll JOIN。两个小表上的CROSS JOIN可能会很快,但是在两个大表上使用WHERE子句进行INNER连接是不合理的。

2

INNER是需要INNER JOIN时的可选字=>所以它们是一样的。这与OUTER这个词在LEFT/RIGHT/FULL中是可选的相同OUTER JOIN

就效率而言,它完全取决于发生了什么。如果它是在右侧进行IS NOT NULL测试的左连接(反半连接),那么它非常有效并且像EXISTS子句一样工作。

缺席等因素,并仅考虑

SELECT .. FROM A X-JOIN B ON <condition> 
  1. 如果结果需要从A,B或两者保存,然后效率不是一个因素。你需要一个左/右/ FULL加入,因为它提供正确的结果

  2. 如果您需要匹配双方的结果,而并非所有数据都可以从任何一方,则如以上相同,则需要INNER JOIN

  3. 只有当连接绑定在两侧找到行时,则LEFT/RIGHT/FULL连接才成为选项。在大多数情况下,INNER JOIN将更快速,因为它使优化程序可以选择从较小的表(或更好的索引)开始并与较大的表进行散列匹配。

“在大多数情况下,” 在点#3,因为不同的RDBMS可能有不同的优化查询。