3

SQL Server 2008 OPTIMIZE FOR UNKNOWN クエリ ヒントを読みました。私はそれがどのように機能するかを理解しています。

しかし、いつ、どこで使用するかについて質問があります。UDF 内で指定することはできません。ストアド プロシージャ内で指定できます。ただし、このMSDN ブログ投稿には次のように記載されています。

4. クエリをストアド プロシージャに移動すると、それを別のプロシージャ コンテキストに入れることができ、その値をオプティマイザに表示するのに適した方法になります (注: これは SQL 2000 でも機能します)。

これは、ストアド プロシージャに渡されるすべてのパラメーターが「盗聴」され、それによって SQL Server が最適な実行プランをコンパイルするのに役立つと言っているように思えます。これは、キャッシュされたプランが再検討/再コンパイルされることを意味しています (そのメカニズムは不明です)。ただし、OPTIMIZE FOR UNKNOWN の必要性がすべて無効になるため、これは混乱を招きます。

クエリ ヒントに関する MSDN の記事では、私の質問は取り上げられていません。

理想的には、これを解決する Microsoft からの何かへのポインターを使用して、誰かが私のためにこれに答えることができますか? ありがとう。

4

1 に答える 1

8

SQL コンパイラの既定の動作は、SP の最初の実行で指定されたパラメーターの値を使用して、プランを最適化することです ( SP の再コンパイルに関するこの MSDN 記事の段落 2 と 3 を参照してください)。そのプランは、キャッシュから離れるまで再利用のためにキャッシュされます。プランのキャッシュ プロセスに関する多くの詳細がここにあります

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

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

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

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

項目 2 で引用されている状況で使用することを検討してくださいOPTIMIZE FOR UNKNOWN- 特定の状況で計画が貧弱なため、同じクエリが非常に変動するパフォーマンスを示す場合 - 通常、クエリのパラメーターが非常に変動するカーディナリティの列をフィルター処理する場合。

于 2010-12-04T09:02:33.390 に答える