2

ストアド プロシージャでのパラメーター スニッフィングを回避するために、パラメーターをローカル変数にコピーすることを提案する人を見てきました。あなたが持っていると言う

CREATE PROCEDURE List_orders_3 @fromdate datetime AS
 DECLARE @fromdate_copy datetime
 SELECT @fromdate_copy = @fromdate
 SELECT * FROM Orders WHERE OrderDate > @fromdate_copy

(これはhttp://www.sommarskog.se/query-plan-mysteries.htmlから取得しましたが、完全に理解するには詳細が必要です)。

しかし、これはクエリ プラン キャッシュとクエリ プラン オプティマイザーに実際に何をもたらすのでしょうか? オプティマイザが @fromdate_copy について仮定をしないことが本当なら、完全なテーブル スキャンになる可能性が最も高い計画をキャッシュしないのはなぜですか (仮定をしないので、他の何かを生成するにはどうすればよいでしょうか? )?

この手法は基本的に「入力がないとうまくいくが、入力もひどく実行されない」ようなものですか?

4

1 に答える 1

2

実際には、宣言する @fromdate_copy フィールドにデフォルト変数を割り当てる必要があります。これにより、クエリ エンジンがクエリ自体を調べたときに、「ハードコードされた」値に基づいて計画を立てることができますが、代わりに、クエリが実際に実行され、値が渡されて切り替えられて実行されます。

Ken Henderson (教祖自身) がこれを詳細に説明しています: http://blogs.msdn.com/b/khen1234/archive/2005/06/02/424228.aspx

可能であれば、彼の本を読んでください。SQL サーバーの内部に関する多くの情報が提供されています

彼が新しいバージョン用に何か書いているかどうかはわかりませんが、基本的な部分のいくつかはそれほど変わっていません...

于 2011-05-24T17:17:32.753 に答える