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 つの結果セットすべてを照合し、両方に対して 1 つの並べ替えを実行できます。並べ替えはほとんど O(n log n) であるため、それと [(A distinct B) add C] の違いはほとんどありません。

アップデート

単一のマージ ソートを実行することは可能ですが、SQL Server では実行できないようです (少なくとも常にではありません)。そのため、UNION ALL を使用するという知恵は、ここでは間違いなく価値があります。ここで計画を比較してください: SQLFiddle ([実行計画の表示]リンクをクリックします)

于 2012-12-11T10:53:29.373 に答える