問題タブ [parameter-sniffing]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
sql - SQL パラメータのスニッフィングは、再コンパイルが役に立たない可能性がありますが、ローカル変数は役に立ちます
sp_executesql
いくつかのパラメーターで複雑な選択を渡すために使用しています。ストアド プロシージャから取り出して変数を宣言するよりも、この方法の方がはるかに時間がかかります。
SQL パラメーターのスニッフィングについて多くの質問を見てきましたが、私のシナリオはこれに当てはまるように思えます。ただしDBCC FREEPROCCACHE
、外部の Select を呼び出したり修正したりした後Option (Recompile)
でも、ストアド プロシージャの外部で同じクエリを記述する場合と比較して、別の非効率的な実行プランが使用されます。
ただし、引き続きストアド プロシージャを使用しますが、パラメーターのコピーをローカル変数として設定すると、効率的な実行プランが使用されます。
このシナリオでは、SQL パラメーターのスニッフィングが原因として除外されますか? クエリを再コンパイルするため、クエリが使用する既存の実行計画はありません。もしそうなら、この行動の他の理由として何が考えられるでしょうか?
SQLクエリのアイデアを以下に示します(エンティティフレームワークを介して生成された乱雑なもの)。これは高速なクエリですがsp_executesql
、変数を取り出してパラメーターを入れてprocに入れると、非効率的な実行計画が生成されます
sql - OPTION(OPTIMIZE FOR UNKNOWN) と OPTION(RECOMPILE) の主な違いは何ですか?
SQL Server 2012 で古典的なパラメーター スニッフィングの問題に遭遇しました。いくつかの調査に基づいて、この問題に関する複数のオプションを見つけました。違いを理解するために必要な 2 つのオプションはOPTION(OPTIMIZE FOR UNKNOWN)
vsOPTION(RECOMPILE)
です。
この問題が発生しているクエリの最後に使用することをためらっていますOPTION(RECOMPILE)
。これは、サーバーが毎回新しい実行計画を生成することを強制するためです。このクエリを頻繁に呼び出すと、そのマシンの CPU が急増します。
利用可能な最良のソリューションを使用するために、2 つのオプションの実際の違いは何ですか?
OPTION(OPTIMIZE FOR UNKNOWN)
毎回再コンパイルする代わりにキャッシュを再利用しますか?