0

過去には、基本的に次のようなストアド関数がありました。

IF EXISTS ( SELECT * FROM ... ) RETURN 1

SELECT の実行にはかなりの時間がかかりますが、EXISTS をラップすることで、非常に短時間で完了します。

ただし、アプリケーションには「証明書」が必要です。「1 を返した理由を 1 つ挙げてください」。クエリを次のように変更しました。

DECLARE @cert BIGINT
SELECT TOP 1 @cert = id FROM ...
RETURN @cert

ただし、これには現在、はるかに長い時間がかかります。ORDER BYクエリには句がありません。

SQL Server は引き続きすべての行を取得し、その後最初の行を選択するだけですか? 私たちは何かを監督しましたか?同じスピードでいいんじゃない?2 番目のクエリが最初のクエリよりもはるかに時間がかかるのはなぜですか? (時間の大きさ)

4

1 に答える 1

3

if exists は、一致する条件の存在をチェックし、条件が見つかったら停止しますが、結果を返す必要はありません。セットから選択するとすぐに何かを返す必要があると思いますが、セットによっては最高の評価に時間がかかる場合がありますか?

時間がかかる場合は、実行計画を調査し、追加できるインデックスがあるかどうかを確認します。

于 2013-03-12T12:27:48.753 に答える