web-dev-qa-db-ja.com

T-SQLに存在する場合

IF EXISTS内にSELECTステートメントがある場合、テーブルでレコードが見つかるとすぐに実行が停止しますか?例えば:

IF EXISTS(SELECT *  FROM  table1  WHERE Name='John' )

return 1

else

return 0

名前がJohnのテーブルに行が存在する場合、実行を停止して1を返しますか、それともテーブル全体を走査してさらに一致するものを探しますか?

44
Sidd

はい、実行を停止しますので、これは一般にHAVING COUNT(*) > 0よりも望ましいです。

EXISTSを使用すると、実行計画を見ると、一致するレコードの数に関係なく、table1から出てくる実際の行数が1を超えないことがわかります。

状況によっては、SQL Serverは、単純化フェーズ中にCOUNTクエリのツリーをEXISTSのツリーと同じものに変換できます(セミジョインがあり、集計演算子が見えない場合) その例は、ここのコメントで説明されています

質問に示されているよりも複雑なサブツリーの場合、COUNTのパフォーマンスがEXISTSよりも優れている場合があります。準結合ではサブツリーから1行のみを取得する必要があるため、ツリーのその部分にネストされたループを使用する計画を促進できますが、実際には最適に機能しない場合があります。

49
Martin Smith