14

ストアドプロシージャを使用したオプションについての私の理解は、WITH RECOMPILE通常、後続のパラメータとして単一のストアドプロシージャ呼び出しを含む句を使用することに限定されています。

exec sp_mystoredproc 'Parameter1', 2, '1/28/2011' with recompile

WITH RECOMPILE実際のproc定義に含めることの効果は何ですか?これは、実行されるたびにprocを再コンパイルしますか?または、次にprocが変更されたときですか?

例:

CREATE PROCEDURE [dbo].[sp_mystoredproc]
    (@string1           varchar(8000)
    ,@int2              int = 2
    ,@dt_begin          DATETIME
    with recompile
AS
... proc code ...
4

1 に答える 1

26

これにより、procは、実行されるたびにすべてのクエリの計画を再構築します。

procパラメーターの値がフィルターの選択性に影響を与える場合に役立ちます。

たとえば、このクエリの最適な計画は次のとおりです。

SELECT  *
FROM    orders
WHERE   order_date BETWEEN @begin_report AND @from_report

日付範囲が大きい場合はフルスキャン、小さい場合はインデックススキャンになります。

を使用して作成されWITH RECOMPILEたprocは、実行ごとにプランを作成します。1つがないと、単一の計画に固執します(ただし、再コンパイル自体の時間を節約できます)。

このヒントは通常、大量のデータを処理し、複雑なレポートを実行するプロシージャで使用されます。全体的なクエリ時間が長く、プランの再構築にかかる時間は、より良いプランによって節約される時間と比較してごくわずかです。

于 2011-01-28T17:21:36.537 に答える