使用联盟或加入 - 什么是更快

时间:2010-02-22 09:31:50

标签: sql mysql

我只是想知道你是否有一张桌子并且你加入它会比使用连接更有效吗?

我知道连接会创建更多的列,但这更理论化 - 联盟是否需要像连接一样对另一个表进行嵌套循环扫描?

4 个答案:

答案 0 :(得分:22)

Union会更快,因为它只是传递第一个SELECT语句,然后解析第二个SELECT语句并将结果添加到输出表的末尾。

Join将遍历两个表的每一行,在另一个表中查找匹配项,因此需要进行更多处理,因为每行都在搜索匹配的行。

修改

通过Union,我的意思是Union All,因为它似乎足以满足您的目标。虽然普通联盟通常比加入快。

编辑2(回复@seebiscuit的评论)

我不同意他的看法。从技术上讲,无论您的加入有多好,“加入”仍然比纯连接更昂贵。我在我的博客codePERF[dot]net上发了一篇博文来证明这一点。实际上,它们有两个完全不同的用途,更重要的是确保您的索引正确并使用正确的工具来完成工作。

从技术上讲,我认为可以使用我的博客文章中的以下2个执行计划来总结:

UNION ALL执行计划

UNION ALL Execution Plan

JOIN执行计划

JOIN Execution Plan

实践结果

实际上,聚集索引查找的差异可以忽略不计:

Benchmark Results

答案 1 :(得分:21)

JOINUNION有两个不同的目的。 JOIN用于向查询添加其他表,以便添加选择条件和可能的其他列。 UNION用于将两个不同查询的结果与相同列组合在一起。问哪个更有效就像问“哪条面包”和“吹风”更“橙”。

答案 2 :(得分:10)

很抱歉打破你的聚会,但写得好的联合会比工会更快。

  • 它使用更轻量级的统计信息收集模型(基于基数,而不是随机潜水)
  • 查询只会被解析一次(不需要多次子选择评估)
  • 结果集不会在temptable中实现(甚至对于UNION ALL也是如此)

答案 3 :(得分:2)

单个SELECT每个表使用不超过一个索引。 UNION在联合中每个SELECT使用不超过一个索引。

UNION将更好地利用索引,从而加快查询速度。