値が渡されない場合、後で現在の日付に設定される日付入力を受け入れるストアド プロシージャがあります。
CREATE PROCEDURE MyProc
@MyDate DATETIME = NULL
AS
IF @MyDate IS NULL SET @MyDate = CURRENT_TIMESTAMP
-- Do Something using @MyDate
@MyDate
ストアド プロシージャが最初にコンパイルされたときに渡されたNULL
場合、すべての入力値 (またはそれ以外) のパフォーマンスが常にひどいという問題がありNULL
ますが、ストアド プロシージャがコンパイルされたときに日付/現在の日付が渡された場合すべての入力値 (NULL
またはそれ以外)のパフォーマンスは良好です。
また紛らわしいのは、使用される @MyDate の値が実際に NULL
(かつCURRENT_TIMESTAMP
IF ステートメントによって設定されていない)場合でも、生成される貧弱な実行計画がひどいことです。
パラメータ スニッフィングを無効にすると (パラメータをスプーフィングして)、問題が解決することがわかりました。
CREATE PROCEDURE MyProc
@MyDate DATETIME = NULL
AS
DECLARE @MyDate_Copy DATETIME
SET @MyDate_Copy = @MyDate
IF @MyDate_Copy IS NULL SET @MyDate_Copy = CURRENT_TIMESTAMP
-- Do Something using @MyDate_Copy
これはパラメーターのスニッフィングと関係があることは知っていますが、「パラメーターのスニッフィングがうまくいかなかった」という例はすべて、渡された代表的でないパラメーターを使用してコンパイルされたストアド プロシージャに関係していましたが、ここで私はそれを見ています実行計画はNULL
、ステートメントが実行される時点でパラメーターが取る可能性があるとSQLサーバーが考える可能性のあるすべての考えられる値に対してひどいものです-CURRENT_TIMESTAMP
またはその他。
なぜこれが起こっているのか、誰かが洞察を得ましたか?