我遇到了一些性能问题,我的查询如下:
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
的影响?
答案 0 :(得分:3)
如果您知道不会有重复项,请始终使用UNION ALL。
这里有点灰色,但仍然值得 - 虽然实际上是微不足道的。
如果它是一个直接的UNION-UNION,SQL Server可以对其进行优化以整理所有3个结果集并对两者进行单一排序。由于排序主要是O(n log n),因此它与[(一个不同的B)加C]之间的差异非常小。
<强>更新强>
尽管可以执行单个合并排序,但SQL Server似乎并不这样做(至少并非总是这样) - 因此使用UNION ALL的智慧绝对值得。比较这里的计划:SQLFiddle(点击“查看执行计划”链接)