私は過去に2つの方法を使用してパラメータースニッフィングの問題を回避しました:
1)使用WITH RECOMPILE
2)パラメータ値をローカル変数に再割り当てし、パラメータの代わりにそれらを使用します
私が理解していることから、これらの両方の最終結果は同じです-現在のクエリ/パラメーターに最適化された新しい実行プランが作成され、使用されます。
これに該当する場合、これら2つの方法の間に違いはありますか、それとも本質的に同じですか?どちらか一方がもう一方よりも望ましいですか?
私は過去に2つの方法を使用してパラメータースニッフィングの問題を回避しました:
1)使用WITH RECOMPILE
2)パラメータ値をローカル変数に再割り当てし、パラメータの代わりにそれらを使用します
私が理解していることから、これらの両方の最終結果は同じです-現在のクエリ/パラメーターに最適化された新しい実行プランが作成され、使用されます。
これに該当する場合、これら2つの方法の間に違いはありますか、それとも本質的に同じですか?どちらか一方がもう一方よりも望ましいですか?
回答:
一般的な値を予測できる場合は、(再)作成するたびに、そのような値を使用してストアドプロシージャを実行します。これらの値に基づいて実行プランが作成され、将来の使用に備えて保存されます。私のストアドプロシージャ.sql
ファイルのほとんどは、EXEC
この目的のために(そして、コード内の基本的なエラーを識別するために)、妥当な値のコマンドで終わります。
もちろん、ストアドプロシージャの実行時間が非常に長く、実稼働時間中に合理的に実行できない場合は、これは役に立ちません。ジョブを開始するだけでは不十分であることに注意してください。プランを保存するには、ジョブが正常に完了する必要があります。
WITH RECOMPILE
これは少しハンマーです。モジュール内のすべてのステートメントを再コンパイルします。OPTION (RECOMPILE)
パラメーターに依存するステートメントでの使用は、より的を絞ったソリューションです。
- パラメータ値をローカル変数に再割り当てし、パラメータの代わりにそれらを使用します
これは、OPTIMIZE FOR UNKNOWN
平均値に基づいて計画が生成されるのと同じ効果があります。プランは実行ごとに再コンパイルされません。
詳細については、私の記事「パラメータスニッフィング、埋め込み、およびRECOMPILEオプション」を参照してください。