【发布时间】:2015-12-16 20:18:19
【问题描述】:
我有一个要放入存储过程的查询。当我使用局部变量运行查询时,查询需要大约 1 秒才能运行。当我将相同的查询放入存储过程并调用 SP 时,运行大约需要 2 分钟。
从之前的问题中,我认为这可能与参数嗅探有关。当我在我的 SP 中声明局部变量然后在整个过程中使用局部变量之前遇到了这个问题。这在过去有效,但在这种情况下似乎对我没有帮助。
我现在有
CREATE PROCEDURE dbo.ProcedureName
@DIV VARCHAR(4),
@STD VARCHAR(1), -- S or N
@scen varchar(20)
AS
BEGIN
DECLARE
@DIV_copy VARCHAR(4),
@STD_copy VARCHAR(1),
@scen_copy varchar(20);
SELECT
@DIV_copy = @DIV,
@STD_copy = @STD,
@scen_copy = @scen;
我也试过像这样添加WITH RECOMPILE
CREATE PROCEDURE dbo.ProcedureName
@DIV VARCHAR(4),
@STD VARCHAR(1), -- S or N
@scen varchar(20)
WITH RECOMPILE
AS
BEGIN
DECLARE
@DIV_copy VARCHAR(4),
@STD_copy VARCHAR(1),
@scen_copy varchar(20);
SELECT
@DIV_copy = @DIV,
@STD_copy = @STD,
@scen_copy = @scen;
此外,我尝试在我的 SP 末尾添加 OPTION(RECOMPILE),如下所示:
SELECT *
FROM #Output
OPTION(RECOMPILE)
END
GO
我也尝试过使用:
OPTION(OPTIMIZE FOR UNKNOWN )
还有:
OPTION(QUERYTRACEON 4136)
在此选项中,我没有适当的查询跟踪权限。
上述 5 个修复似乎都无法解决该问题,因为对于在存储过程之外需要 1 或 2 秒的相同查询,存储过程仍然需要 2 分钟到 2 分 30 秒之间的任何时间。
这些修复都来自这篇文章'Different Approaches to Correct SQL Server Parameter Sniffing'
有没有人遇到过类似的问题?感谢您的宝贵时间!
SQL Server 2008R2
【问题讨论】:
-
听起来确实像参数嗅探,我不知道它可能是什么。您可以查看这篇文章,看看它是否提供了您尚未尝试过的任何其他解决方案:sommarskog.se/query-plan-mysteries.html
-
I have tried adding the OPTION(RECOMPILE) at the end of my SP- 它应该放在有问题的查询之后。但如果with recompile不起作用,我怀疑这种更正是否会起作用。 -
我有完全相同的症状,创建参数的本地副本总是可以解决它。唯一的区别是我一直使用 SET 语句而不是 SELECT 语句将值复制到局部变量中。
-
我遇到过类似的情况,为了解决我调整查询从而改变查询计划来解决这个问题,你能分享一下实际的查询计划和查询吗?
标签: sql-server stored-procedures sql-server-2008-r2