IF EXISTS
内にSELECT
ステートメントがある場合、テーブルでレコードが見つかるとすぐに実行が停止しますか?例えば:
IF EXISTS(SELECT * FROM table1 WHERE Name='John' )
return 1
else
return 0
名前がJohnのテーブルに行が存在する場合、実行を停止して1を返しますか、それともテーブル全体を走査してさらに一致するものを探しますか?
はい、実行を停止しますので、これは一般にHAVING COUNT(*) > 0
よりも望ましいです。
EXISTS
を使用すると、実行計画を見ると、一致するレコードの数に関係なく、table1
から出てくる実際の行数が1を超えないことがわかります。
状況によっては、SQL Serverは、単純化フェーズ中にCOUNT
クエリのツリーをEXISTS
のツリーと同じものに変換できます(セミジョインがあり、集計演算子が見えない場合) その例は、ここのコメントで説明されています 。
質問に示されているよりも複雑なサブツリーの場合、COUNT
のパフォーマンスがEXISTS
よりも優れている場合があります。準結合ではサブツリーから1行のみを取得する必要があるため、ツリーのその部分にネストされたループを使用する計画を促進できますが、実際には最適に機能しない場合があります。