状況:両方が重複している2つのテーブルからの明確な結果が必要です。 UNIONとDISTINCTを組み合わせる必要があるかどうかを知りたいです。
例1-個別のみを使用
SELECT DistinctValue
FROM Table1
UNION
SELECT DistinctValue
FROM Table2
例2-個別と結合を組み合わせる
SELECT DISTINCT DistinctValue
FROM Table1
UNION
SELECT DISTINCT DistinctValue
FROM Table2
結果は同じですが、パフォーマンスに違いはありますか?
答えは、統計/オプティマイザーなどによって異なります。最初のクエリは、2つの結果セットを取り、それらを結合することを論理的に要求します(これにより、重複が暗黙的に削除されます reference )。 2番目は、各結果セットを取得して重複を削除し、それらを結合することを示しています。
ランダムデータの場合、最初のデータよりもパフォーマンスが向上することが期待されます。しかし、データが適切に歪んでいる場合は、2番目の方が良い場合があります。たとえば、Table1に数百万の結果があり、重複がない場合、Table2に数百万の結果があったが、数個のレコードに区別できる場合、後者はTable2エントリをTable1エントリと比較できなかったため、削除する前にうまくいく可能性があります。そのうちの。
SQL Serverで両方に対して同じクエリプランを生成する、配置していたデータに対して実行しました。本当にあなたはあなたのデータでそれをプロファイリングする必要があります。
UNION自体がDISTINCT結果を提供します。
UNION ALLはUNIONより高速ですが、重複を削除しません。
UNIONクエリにDISTINCTを含めても、何も追加されません。
あなたが提供したクエリに基づいて、私はDistinctValue列が最初に一連の個別の値を提供しないと想定しているため、次のようなアプローチを試すことができます。
SELECT DISTINCT DistinctValue
FROM Table1
UNION
SELECT DistinctValue
FROM Table2
ここで重要なのは、初期データセットを制限して、ユニオンが操作するデータを減らし、全体的なコストを削減することです。これをデータのテストセットに適用すると、数秒で削り取られましたが、もちろん、大規模な場合、時間は改善されます。