SQL Serverは通常、集約クエリを短絡しません。(ここのコメントで説明されているHAVING COUNT(*) > 0
)と同じプランを使用するようにクエリを変換できる場合もありますが、それはそれだけです。EXISTS
理論的には行番号2のHAVING COUNT(*) > 1
後でカウントを停止する可能性がありますが、クエリは常にすべての行をカウントします。
それを念頭に置いて、私は使用します
IF EXISTS(
SELECT * FROM (
SELECT TOP 2 *
FROM [SomeTable]
WHERE [Fields] = [Values]
) T
HAVING COUNT(*)=2)
イテレータは、2番目の行が返された後、行の要求を停止します。TOP 2
したがって、すべての行を返し、それらをカウントするのではなく、内部クエリを早期に短絡させることができます。
両方のバージョンの計画例を以下に示します

についてのコメントの質問について
「どれが最適かをどうやって見分けることができますか?それはクエリコストですか?」
TOP
上記の計画に示されている特定のケースでは、推定および実際の行数が非常に正確であり、イテレーターの追加を除いて2つの計画は非常に類似しているため、コストは妥当な指標になります。したがって、計画に示されている追加コストは、追加の行数をスキャン(および場合によってはディスクから読み込む)してカウントする必要があるという事実を完全に表しています。
この場合、これが単なる追加作業を表していることは非常に明確です。他の計画ではそうではないかもしれません。を追加すると、TOP 2
その下のクエリツリーが大幅に変更される可能性があります(たとえば、イテレータをブロックすることで計画を嫌う)
その場合、実行計画に示されているコストは信頼できるメトリックではない可能性があります。実際の実行プランでも、表示されるコストは見積もりに基づいているため、それらと同じくらい良好であり、推定行数が良好であっても、表示されるコストは特定のモデリングの仮定に基づいています。
SQL Kiwiは、DBAサイトのこの最近の回答にそれをうまく入れています
オプティマイザのコスト見積もりは、主に内部サーバーの目的でのみ役立ちます。これらは、「高レベル」であっても、潜在的なパフォーマンスを評価するために使用されることを意図したものではありません。モデルは、それが設計された内部目的のためにたまたまうまく機能する抽象化です。推定コストがハードウェアと構成の実際の実行コストにかなり類似している可能性は、実際には非常に小さいです。
あなたにとって重要な実際の問題に基づいて、パフォーマンスを比較するために他のメトリックを選択します。
論理読み取り(の場合に表示SET STATISTICS IO ON;
)は、確認できるそのようなメトリックの1つですが、これにのみ焦点を当てると、誤解を招く可能性があります。クエリ期間のテストはおそらく唯一の信頼できる方法ですが、パフォーマンスはサーバーでの同時アクティビティに応じて変化する可能性があるため、正確な科学ではありません(メモリの付与、利用可能なDOP、キャッシュ内の関連ページの数を待機します)。
結局のところ、サーバー上のリソースを効率的に使用しているように見えるクエリプランを取得することになります。