2017-04-26 11 views
0

同じ名前の列を含む2つのテーブルがあります。私は、Table2にどのような明確な値が存在するかを調べようとしますが、Table1には存在しません。そのために私は2つのSELECTを持っています:SQL - 2つのDISTINCTのパフォーマンスが非常に悪い

SELECT DISTINCT Field 
FROM Table1 

SELECT DISTINCT Field 
FROM Table2 

両方のSELECTが2秒以内に終了し、それぞれ約10行戻ってきます。私は値を表1に欠けているかを知るために私のクエリを再構築した場合、クエリが完了するまでに数分かかります:

SELECT DISTINCT Field 
FROM Table1 
WHERE Field NOT IN 
    (
     SELECT DISTINCT Field 
     FROM Table2 
    ) 

私の一時的な回避策は、それと比較する一時表に第二の個別の結果を挿入しています。しかし、パフォーマンスはそれほど素晴らしいものではありません。

これはなぜ起こるのですか?私は、SQL Serverが2番目のDISTINCTを再計算し続けるためだと思いますが、それはなぜですか? SQL Serverはこれを何とか最適化するべきではありませんか?

答えて

2

わからないこれは、パフォーマンスが向上しますが、私はEXCEPTを使用したい場合:EXCEPTは重複を削除する集合演算子であるため、DISTINCTを使用する必要はありません

SELECT Field 
FROM Table1 
EXCEPT 
SELECT Field 
FROM Table2 

EXCEPTは、左の入力クエリから、正しい入力クエリによって出力された ではない個別の行を返します。

  • すべてのクエリで、列の数と順序が同じである必要があります。
  • データ型は互換性がなければなりません。
+1

私はEXCEPTを使用しましたが、私のクエリが大幅にスピードアップしました!ありがとうございました! – Koruba

関連する問題