web-dev-qa-db-ja.com

ユニオンと個別を組み合わせる

状況:両方が重複している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

結果は同じですが、パフォーマンスに違いはありますか?

3
annemartijn

答えは、統計/オプティマイザーなどによって異なります。最初のクエリは、2つの結果セットを取り、それらを結合することを論理的に要求します(これにより、重複が暗黙的に削除されます reference )。 2番目は、各結果セットを取得して重複を削除し、それらを結合することを示しています。

ランダムデータの場合、最初のデータよりもパフォーマンスが向上することが期待されます。しかし、データが適切に歪んでいる場合は、2番目の方が良い場合があります。たとえば、Table1に数百万の結果があり、重複がない場合、Table2に数百万の結果があったが、数個のレコードに区別できる場合、後者はTable2エントリをTable1エントリと比較できなかったため、削除する前にうまくいく可能性があります。そのうちの。

SQL Serverで両方に対して同じクエリプランを生成する、配置していたデータに対して実行しました。本当にあなたはあなたのデータでそれをプロファイリングする必要があります。

3
Sign

UNION自体がDISTINCT結果を提供します。

UNION ALLはUNIONより高速ですが、重複を削除しません。

UNIONクエリにDISTINCTを含めても、何も追加されません。

3
Kennah

あなたが提供したクエリに基づいて、私はDistinctValue列が最初に一連の個別の値を提供しないと想定しているため、次のようなアプローチを試すことができます。

SELECT DISTINCT DistinctValue 
FROM Table1
UNION
SELECT DistinctValue
FROM Table2

ここで重要なのは、初期データセットを制限して、ユニオンが操作するデータを減らし、全体的なコストを削減することです。これをデータのテストセットに適用すると、数秒で削り取られましたが、もちろん、大規模な場合、時間は改善されます。

1
JordanMSchall