私は次のSQLを持っています:
IF EXISTS
(
SELECT
1
FROM
SomeTable T1
WHERE
SomeField = 1
AND SomeOtherField = 1
AND NOT EXISTS(SELECT 1 FROM SomeOtherTable T2 WHERE T2.KeyField = T1.KeyField)
)
RAISERROR ('Blech.', 16, 1)
SomeTable
テーブルには約200,000行あり、テーブルSomeOtherTable
にはほぼ同じです。
内部SQL(SELECT
)を実行すると、1秒未満で実行され、行は返されません。しかし、スクリプト全体(IF...RAISERROR
)を実行すると、1時間以上かかります。なんで?
さて、明らかに、実行プランは異なります-Enterprise Managerでそれを見ることができます-しかし、繰り返しますが、なぜですか?
SELECT @num = COUNT(*) WHERE
私はおそらく...そしてそれから...のようなことをすることができましIF @num > 0 RAISERROR
たが...私はそれがいくらかポイントを逃していると思います。バグが存在することがわかっている場合にのみ、バグを回避することができます(そして、それは確かに私にはバグのように見えます)。
編集:
@Bohemianの回答に従って、クエリをOUTER JOINに再ジグしようとしましたが、実行時間に違いはありませんでした。
編集2:
SELECT
内部ステートメントのクエリプランを添付しました。
IF...RAISERROR
...およびブロック全体のクエリプラン:
明らかに、これらは実際のテーブル/フィールド名を示していますが、それを除けば、クエリは上記のとおりです。