質問

SQL Server 2008で読み上げましたが、クエリの不明なヒントを最適化しました。私はそれがどのように機能するか理解しています。

しかし、私は質問があります どこいつ それを使用する。 UDF内で指定することはできません。保存されたProc内で指定できます。でも、 これ MSDNブログ投稿では、次のように述べています。

4.クエリをストアドプロシージャに移動すると、それを別の手続き的コンテキストに入れることができ、その値をオプティマイザーに見えるようにする良い方法になる可能性があります(注:これはSQL 2000でも機能します)

保存されたProcに渡されたパラメーターは「スニッフィング」されると言っているように思えます。これにより、SQL Serverが最適な実行計画をコンパイルするのに役立ちます。これは、キャッシュされた計画が再検討/再コンパイルされることを暗示しています(そのメカニズムがわからない)。ただし、これは混乱しています。なぜなら、それは未知のために最適化する必要性全体を無効にするからです。

クエリヒントに関するMSDNの記事は、私の質問をカバーしていません。

理想的には、これをクリアするマイクロソフトからの何かへのポインターで、誰かが私のためにこれに答えることができますか。ありがとう。

役に立ちましたか?

解決

SQLコンパイラのデフォルトの動作は、SPの最初の実行で指定されたパラメーターの値を使用して、計画の最適化を支援することです(パラグラフ2および3を参照してください。 SP再コンパイルに関するこのMSDN記事)。その計画は、キャッシュを離れるまで再利用するためにキャッシュされます - 計画キャッシュプロセスの詳細がたくさんあります ここ.

あなたが引用するMSDNブログは、コンパイラにとってこのプロセスを容易にする方法に注目しています。項目4(質問で引用)は、これがアドホックSQLよりもストアドプロシージャの利点であることを示唆していると思います。

OPTIMIZE FOR UNKNOWN ヒントは、デフォルトの動作をAVIODするようにコンパイラに指示します。最初の実行で指定されたパラメーター値を無視し、より一般化された計画を選択する必要があること。これは、質問で引用されたブログ投稿の最後にある提案のリストにあるアイテム2のより極端なバージョンです。

2オプティマイザーがパフォーマンスの特性が変化する時間の経過とともに異なる計画を選択していることがわかった場合は、代表的な「平均」値を持つパラメーターヒントを使用して、すべての値に対して合理的に機能する優れた一般的なクエリプランを取得することを検討してください。

しかし、平均値または代表的な値を選択するのではなく、コンパイラはパラメーター値を完全に無視します。

使用を検討してください OPTIMIZE FOR UNKNOWN 項目2で引用されている状況では、同じクエリが非常に変動するパフォーマンスを提供する場合、状況によっては計画が悪いためです - 通常、非常に可変性のあるカーディナリティのクエリフィルター列のパラメーターがパラメーターの場合。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top