15

WITH RECOMPILE オプションを使用するとオプティマイザーがストアド プロシージャのクエリ プランを強制的に再構築することは理解していますが、それをいつ実行しますか?

WITH RECOMPILE オプションを使用する場合と使用しない場合の経験則は何ですか?

すべての sproc に配置するだけで発生する効果的なオーバーヘッドはどれくらいですか?

4

5 に答える 5

17

WITH RECOMPILE他の人が言ったように、習慣の問題として、すべてのストアド プロシージャに単純に含めたくありません。そうすることで、ストアド プロシージャの主な利点の 1 つである、クエリ プランが保存されるという事実を排除することになります。

なぜそれが大きな問題になる可能性があるのでしょうか? クエリ プランの計算は、通常の手続き型コードのコンパイルよりもはるかに集中的です。SQL ステートメントの構文は、必要なもののみを指定し、(一般に)それを取得する方法を指定しないため、物理的な計画 (つまり、実際にデータを収集して変更します)。WHEREデータベースクエリプリプロセッサが実行できる「トリック」と、テーブルを結合する順序、使用するインデックス、結合の前後に句を適用するかどうかなど、さまざまな「トリック」があります。

単純な SELECT ステートメントの場合、違いはないかもしれませんが、重要なクエリの場合、データベースは最適な計画を立てるためにかなりの時間を費やします (通常のマイクロ秒ではなく、ミリ秒単位で測定されます)。非常に複雑なクエリの場合、最適な計画を保証することさえできず、ヒューリスティックを使用してかなり良い計画を立てる必要があります。したがって、毎回再コンパイルを強制することで、以前の計画が完全に適切であったとしても、そのプロセスを何度も繰り返さなければならないことを伝えています。

ベンダーによっては、クエリ プランを再コンパイルするための自動トリガーがあるはずです。 DB はそれに気づき、計画を再コンパイルする必要があります。しかし、一般的に言えば、データベースの実装者は、全体として、あなたよりも賢明です。

パフォーマンスに関連するものと同様に、暗闇で写真を撮らないでください。パフォーマンスの 90% を犠牲にしているボトルネックがどこにあるかを突き止め、最初に解決します。

于 2009-01-07T23:58:27.713 に答える
14

クエリプランのコンパイルは比較的コストのかかる操作であり、クエリプランをキャッシュして再利用してもメリットがないため、すべてのストアドプロシージャに配置することはお勧めできません。

ストアドプロシージャ内に構築された動的なwhere句の場合は、ストアドプロシージャsp_executesqlに追加するのではなく、を使用してTSQLを実行することで処理できWITH RECOMPILEます。

別の解決策(SQL Server 2005以降)は、ヒントを使用して特定のパラメーターでヒントを使用することOPTIMIZE FORです。これは、行の値が静的である場合にうまく機能します。

SQL Server 2008では、 「 」と呼ばれるあまり知られていない機能が導入されました。OPTIMIZE FOR UNKNOWN

このヒントは、パラメータ値がクエリにまったく渡されなかった場合に常に使用していた標準アルゴリズムを使用するようにクエリオプティマイザに指示します。この場合、オプティマイザーは、アプリケーションによってクエリに渡された特定のパラメーター値を調べる代わりに、使用可能なすべての統計データを調べて、クエリプランの生成に使用されるローカル変数の値を決定します。

于 2009-01-07T23:51:15.260 に答える
2

最も一般的な使用法は、プロシージャに動的なWHERE句がある場合です...次回はまったく同じ句ではない可能性があるため、特定のクエリプランをコンパイルして後続の実行のために保存する必要はありません。プロシージャが呼び出されます。

于 2009-01-07T23:40:23.160 に答える
1

これは、代表的なデータとコンテキストを使用してテストした場合にのみ使用する必要があります。これを行わずに実行すると、無効なクエリプランが生成されることが示されます(考えられる理由が何であれ)。SPが適切に最適化されないことを事前に(テストせずに)想定しないでください。

手動呼び出しのみの唯一の例外(つまり、SPにコーディングしないでください):ターゲットテーブルの文字を大幅に変更したことがわかっている場合。例:TRUNCATE、バルクロードなど。

これは、時期尚早の最適化のもう1つの機会です。

注:私にはたくさんのポイントがあります。初心者が以下に同じ回答を提出し、あなたが同意する場合は、彼らの回答に賛成してください。

于 2009-01-07T23:46:28.780 に答える