在同一查询中使用UNION和UNION ALL

时间:2012-12-11 10:43:48

标签: sql sql-server union union-all

我遇到了一些性能问题,我的查询如下:

SELECT * FROM Foo

UNION

SELECT * FROM Boo

UNION

SELECT * FROM Koo

我确信Koo没有返回任何重复项。我考虑在最后使用UNION ALL,因此保存了Koo的排序和明确的选择时间。查询应如下所示:

SELECT * FROM Foo

UNION

SELECT * FROM Boo

UNION ALL

SELECT * FROM Koo

这会有所帮助,还是会受到第一个UNION的影响?

1 个答案:

答案 0 :(得分:3)

如果您知道不会有重复项,请始终使用UNION ALL。

这里有点灰色,但仍然值得 - 虽然实际上是微不足道的。

如果它是一个直接的UNION-UNION,SQL Server可以对其进行优化以整理所有3个结果集并对两者进行单一排序。由于排序主要是O(n log n),因此它与[(一个不同的B)加C]之间的差异非常小。

<强>更新

尽管可以执行单个合并排序,但SQL Server似乎并不这样做(至少并非总是这样) - 因此使用UNION ALL的智慧绝对值得。比较这里的计划:SQLFiddle(点击“查看执行计划”链接)