パラメータスニッフィングの回避策


8

私は過去に2つの方法を使用してパラメータースニッフィングの問題を回避しました:

1)使用WITH RECOMPILE
2)パラメータ値をローカル変数に再割り当てし、パラメータの代わりにそれらを使用します

私が理解していることから、これらの両方の最終結果は同じです-現在のクエリ/パラメーターに最適化された新しい実行プランが作成され、使用されます。

これに該当する場合、これら2つの方法の間に違いはありますか、それとも本質的に同じですか?どちらか一方がもう一方よりも望ましいですか?

回答:


3

一般的な値を予測できる場合は、(再)作成するたびに、そのような値を使用してストアドプロシージャを実行します。これらの値に基づいて実行プランが作成され、将来の使用に備えて保存されます。私のストアドプロシージャ.sqlファイルのほとんどは、EXECこの目的のために(そして、コード内の基本的なエラーを識別するために)、妥当な値のコマンドで終わります。

もちろん、ストアドプロシージャの実行時間が非常に長く、実稼働時間中に合理的に実行できない場合は、これは役に立ちません。ジョブを開始するだけでは不十分であることに注意してください。プランを保存するには、ジョブが正常に完了する必要があります。


4
  1. WITH RECOMPILE

これは少しハンマーです。モジュール内のすべてのステートメントを再コンパイルします。OPTION (RECOMPILE)パラメーターに依存するステートメントでの使用は、より的を絞ったソリューションです。

  1. パラメータ値をローカル変数に再割り当てし、パラメータの代わりにそれらを使用します

これは、OPTIMIZE FOR UNKNOWN平均値に基づいて計画が生成されるのと同じ効果があります。プランは実行ごとに再コンパイルされません。

詳細については、私の記事「パラメータスニッフィング、埋め込み、およびRECOMPILEオプション」を参照してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.