2009-08-13 10 views
0

私は2つのテーブル、orderDataとstagingOrderDataを持っています。 stagingOrderDataの中にorderDataに存在する行があるかどうかを調べる必要があります。そのため、インポートする前にstagingOrderDataテーブルから削除することができます。より効率的な結合または存在するSQLステートメント

テストケース - 私は

select * from 
dbo.stagingOrderData s 
inner join dbo.OrderData o 
on s.productid = o.productid 
and s.barcode = o.barcode 
and s.orderid = o.orderid 

に参加しようとしたし、当時と「存在」はるかに高速であると考えられるとの声明

select * from 
dbo.stagingOrderData s 
where exists(dbo.OrderData o 
select * from 
    where o.productid = s.productid 
and o.barcode = s.barcode 
and o.orderid = s.orderid) 

を「存在します」。

+1

重複 - ここでこの質問をご覧ください:http://stackoverflow.com/questions/227037/can-i-get-better-performance-using-a-join-or-using-exists –

答えて

1

私の経験では、それはトスアップです。 2つのテーブル(商品ID、バーコード、オーダーID)のインデックスが必要な場合は、これらの2つのクエリがほぼ同じ性能を発揮するでしょう。だから、読んだり保守したりする方が簡単だと思っています。

さらに、削除する必要があるかどうかを判断するためにクエリを実行している場合は、選択をスキップして削除するほうがよい場合があります。削除するものがない場合、deleteステートメントはそれを検出し、何もしません。つまり、選択を行うには、何かを削除する必要がある場合は、データを2回処理する必要があります。代わりに、削除のみを行い、何を問わず一度だけデータを処理します。

1

存在が一般的に速くなります。最初のマッチを見つけた後で停止します。結局、マッチですべてのマッチを考慮する必要があります。

このようにする必要があるかどうかを尋ねたい場合があります。行を削除するのではなく、「存在しない...」という制限で挿入を行う方がよい場合があります。 SQL Server 2008を使用している場合は、マージステートメントを使用するよりもさらに効果的です。

関連する問題