2012-01-02 27 views
1

私はMS-SQLデータベースでいくつかの壊れたレコードを見つけようとしています。簡単な例では、のscenerioはこの2つのテーブル間で一致しないレコードを見つける最も速い方法は何ですか?

されています:

私は2つのテーブルを持って、簡単に言えば:

  • TABLE_1:ID、日付、OPID

  • Table_2:日付、OPID 、EventName

私はこのビジネスルールを持っています:もしテーブル1に記録があればTable_1.DateとTable.OpIdのTable_2には少なくともN行が1つ存在する必要があります。

Table_1に行があり、その行とTable_2に一致する行がない場合は、理由が何であれ、壊れたデータがあります。

私が使用し、不正なデータを見つけるために:

SELECT * 
FROM table_1 t1 
LEFT JOIN table_2 t2 ON t1.Date = t2.Date AND t1.OpId = t2.OpId 
WHERE t2.OpId IS NULL -- So, if there is no 
--       matching row in table_2 then this is a mistake 

しかし、それは、クエリが完了したために時間がかかりすぎます。

同様の風景にもっと速く、より良い方法がありますか?抗セミは、SQL ServerでNOT EXISTSに参加行うに

答えて

6

は通常、パフォーマンスのより良いかと同じである他のオプション(NOT INOUTER JOIN ... NULLEXCEPT

SELECT * 
FROM table_1 t1 
WHERE NOT EXISTS (SELECT * 
        FROM table_2 t2 
        WHERE t1.Date = t2.Date 
          AND t1.OpId = t2.OpId) 

Left outer join vs NOT EXISTSを参照してください。あなたは役に立つインデックスを失っているかもしれません。

+0

速いかもしれません!出来た!なぜこのクエリーでははるかに高速ですか? – pencilCake

+0

EXCEPTとNOT EXISTSは通常同じです。さらに詳しいリファレンスはhttp://explainextended.com/2009/09/15/not-in-vs-not-exists-vs-left-join-is-null-sql-server/ – gbn

+0

@gbn - 'EXCEPT'です最初のテーブルから追加のカラムを必要としない場合にのみ便利です。しかし、 'NOT EXISTS'は良いデフォルトの選択です。 (私は「それ以上」と言っていました) –

1

あなたが適切なインデックスを使用している場合TABLE_1であれば、(少し速くなります代わりにLEFT JOINNOT EXISTSを使用することができる)ことで

しかし

を行うには何も比較的小さいがいるではありません

SELECT table_1.* 
INTO tempTable 
FROM table_1 t1 
WHERE EXISTS(SELECT * FROM table_1 t1 WHERE t1.Date = t2.Date AND t1.OpId = t2.OpId) 

drop table Table_1 

exec sp_rename 'tempTable', 'Table_1' 
:データの量及び任意のFKEYSまたは他のそのようなもの何もない、これは 1時間手順で、あなたは間違った行を削除するには、このようなトリックを使用することができます

このはうわー

+0

申し訳ありませんが、誤ったテーブル名を変更しました –

+0

これは間違いなく高速ですOleg; - 私はマーティンが助けた記事をチェックします。私は本当にこのスピードの違いの主な理由を理解したい。 – pencilCake

+2

非常にシンプルなJOINは、table2のtable1と一致する行のすべての行を実際に見つけなければなりませんが、EXISTSはFIRSTの交差点を最後までスキップして残りの部分を検索して次の行に進むのに十分です。 NOT EXISTSを使用すると、オプティマイザはSELECT * ... LEFT JOINの代わりに、最適なインデックスを選択します。これは、NOT EXISTSではtable2の特定の列に関係なくselect-left joinにあります。それを制限したり、一致するインデックスを使用しないようにしています –

関連する問題