3

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

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

4

1 回答 1

3

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

这里有点灰,但仍然值得——尽管几乎是微不足道的。

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

更新

Although it is possible to perform a single merge-sort, SQL Server doesn't seem to do it (at least not always) - so the wisdom of using UNION ALL is definitely worth it here. Compare the plans here: SQLFiddle (click on the "View Execution Plan" links)

于 2012-12-11T10:53:29.373 回答