SP需要15分钟,但执行时查询相同的结果会在1-2分钟内返回结果

Mal*_*har 28 sql sql-server stored-procedures sql-server-2005 parameter-sniffing

所以基本上我有这个相对较长的存储过程.基本的执行流程是将SELECTS INTO一些数据导入临时表#,然后用符号声明,然后在这些表中运行游标,生成一个'running total'到第三个临时表中,该表是使用CREATE.然后,这个生成的临时表与DB中的其他表连接,以在一些分组等之后生成结果.问题是此SP一直运行良好,直到现在返回结果1-2分钟.现在突然间需要12-15分钟.如果我从SP中提取查询并通过手动设置相同的参数在管理工作室中执行它,它会在1-2分钟内返回结果,但SP需要很长时间.知道会发生什么.我试图生成Query和SP的实际执行计划但由于光标而无法生成它.任何想法为什么SP需要这么长时间查询不?

RBa*_*ung 52

这是参数嗅探的足迹.请看这里有关它的另一个讨论; SQL差的存储过程执行计划性能 - 参数嗅探

有几种可能的修复方法,包括将WITH RECOMPILE添加到存储过程中,大约一半的时间.

大多数情况下的建议修复(尽管它取决于查询和sproc的结构)是直接在查询中使用参数,而是将它们存储到局部变量中,然后在查询中使用这些变量.

  • 哇 !谢谢RBarry Young!..我刚刚修改了我的proc使用局部变量而不是参数,proc从10秒到0秒! (4认同)
  • 这可行,但感觉很脏。在查询中使用参数似乎合乎逻辑,传输它们的值对我来说没有意义。我读了那篇文章,但它并没有澄清事情。也许我应该只专注于代码,但没有人愿意再雇用 DBA。 (2认同)

Amm*_*mar 5

这是由于参数嗅探。首先声明临时变量,并将传入变量的值设置为temp变量,然后在整个应用程序中使用temp变量,下面是一个示例。

ALTER PROCEDURE [dbo].[Sp_GetAllCustomerRecords]
@customerId INT 
AS
declare @customerIdTemp INT
set @customerIdTemp = @customerId
BEGIN
SELECT * 
FROM   Customers e Where
CustomerId = @customerIdTemp 
End
Run Code Online (Sandbox Code Playgroud)

试试这个方法