我有一个查询,我将存储过程。当我使用局部变量运行查询时,查询需要大约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
答案 0 :(得分:0)
不幸的是,当与单独的sql语句相比时,我没有弄清楚为什么同样的查询在放入存储过程时会有这么多麻烦。
作为“解决方法”,我花了一些时间在SP中优化我的查询。我意识到我加入的一个表非常大(数百万行)所以我所做的就是从大表中获取相关数据并创建一个临时表来保存它,然后加入(更多)更小的临时表这似乎可以解决问题。 SP现在在3-4秒内执行。
除了基础知识之外,我对SQL仍然有些新意,所以我学到了很多东西。让它作为提醒您仔细检查您的查询,通常有改进的余地。这感觉有点像透明胶带和回形针,但我的问题已经解决了。
感谢大家的意见。