2017-11-21 11 views
1

IN演算子とExists演算子を使用するタイミングに疑問があります。私は彼らがどちらであるかを知っています。SQL Server:In対Existsの使用

言って、私はこのクエリを持っている:

Insert into AuditCardTypeBenefit_New(AuditID, AuditType, CardTypeBenefitID, EventCode, 
            CardTypeGroupID, AgeFrom, AgeTo, Gender, 
            CreateBy, CreateDate, Status, 
            CancelReason, LastChangeBy, LastChangeDate) 
    select     
     AuditID, AuditType, CardTypeBenefitID, EventCode, 
     CardTypeGroupID, AgeFrom, AgeTo, Gender, 
     CreateBy, CreateDate, Status, 
     CancelReason, LastChangeBy, LastChangeDate 
    from 
     AuditCardTypeBenefit 
    where 
     exists (select * from PromotionEvent_New 
       where PromotionEvent_New.EventCode = AuditCardTypeBenefit.EventCode) 

私はレコードはまた、私は挿入しています。このテーブルに存在するpromotionevent_new (eventcode)に存在している必要があり、テーブルにレコードを挿入しています。このクエリは正常に動作します。しかし、これは私の場合のために良いだろう - 両方のクエリが同じ結果を返す

where EventCode in (select EVENTCODE from PromotionEvent) 

:私はそれのような代替手段を使用する方が良いでしょう不思議でしたか?

答えて

1

サブクエリの結果が非常に大きい場合、EXISTS句はINよりもはるかに高速です。逆に、サブクエリの結果が非常に小さい場合、IN句はEXISTSより高速です。

IN句はNULL値と何も比較できませんが、EXISTS句はすべてをNULLと比較できます。

+0

を編集しますので、exist句を付けるべきですか? –

+0

はい、サブクエリが大きなデータを生成する場合。 –

+0

サブクエリでは、あなたはpromotionevent_newのデータを意味しますか? –

1

いいですか?実際にテストを行う必要があるので、私たちは本当にそれに確実に答えることはできません。しかし、私はそのクエリでIN()を使用することでより速い結果を得ることはまずないと言いたいと思います。

EXISTSサブクエリは「相関」を使用しているため珍しいですし、これらを避けるべきものとみなすことがよくあります。しかし、何かが存在するかどうかのテストでは、格納されているデータ値を返す必要はありません。この点では結合に似ており、必要な場合はtrueまたはfalseが返されます。一方、INでは、サブクエリによって返されるデータが必要であり、値が比較されます。

近年、IN()のパフォーマンスは向上しているため、非常に効果的ですが、パフォーマンス面では既存のクエリを変更するには十分な進歩はありません。

NB:サブクエリによって返される値がNULLの場合、IN(subquery-here)は脆弱です。

+0

サブクエリから返された値がNULLの場合は、NB:IN(サブクエリ - ここ)はNULLです。 'NULL '値があると' NOT IN'が苦しみます。 'IN'は' EXISTS'のように振る舞います。つまり、 'IS NULL'句がなければ同じ値を返します。 – Rokuto

+0

正解、申し訳ありません、私は –

関連する問題