【发布时间】:2010-11-03 16:35:33
【问题描述】:
我有一个存储过程,它接受一个日期输入,如果没有传入任何值,则稍后将其设置为当前日期:
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声明)
我发现禁用参数嗅探(通过欺骗参数)可以解决我的问题:
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
我知道这与参数嗅探有关,但我看到的所有“参数嗅探变坏”的示例都涉及使用传入的非代表性参数编译存储过程,但是在这里我' m 看到执行计划对于 SQL 服务器可能认为参数在执行语句时可能采用的所有可能值(NULL、CURRENT_TIMESTAMP 或其他方式)都很糟糕。
有没有人了解为什么会发生这种情况?
【问题讨论】:
-
这很有趣,但你实际上并没有在这里问任何问题......
标签: sql sql-server tsql sql-execution-plan parameter-sniffing