我都接受,如果没有值传入稍后设置为当前日期的日期输入存储过程:SQL可怜的存储过程的执行计划性能 - 参数嗅探
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
(而不是由IF语句设置为CURRENT_TIMESTAMP
)
我VE发现禁用参数嗅探(通过欺骗参数)解决我的问题:
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
我知道这是什么做参数嗅探,但所有我见过的例子“参数嗅探坏了”涉及到存储过程了使用传入的非代表性参数进行编译,但是在这里我看到执行计划对于SQL服务器可能认为该参数在执行语句时可能采取的所有可以想到的值都很糟糕 - NULL
,CURRENT_TIMESTAMP
或其他。
有没有人对这种情况发生的原因有所了解?
这是有趣的,但你并不是在这里的任何地方提问... – cjk 2009-06-17 14:38:49