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的结构)是不直接在查询中使用参数,而是将它们存储到局部变量中,然后在查询中使用这些变量.
这是由于参数嗅探。首先声明临时变量,并将传入变量的值设置为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)
试试这个方法
归档时间: |
|
查看次数: |
48628 次 |
最近记录: |