Sql server 2008 SP持续时间,锁定表?
我正在处理一个具有大量流量的数据库,有时一个SP(存储过程)的持续时间为382656ms,但SP是一个简单的操作,其他时间(使用相同的参数)的持续时间为200ms。我使用探查器工具对此进行了研究,在第一种情况下(382656ms),大约有1200万次读取。第2个(前几天)有215个读数 SP是这样的:Sql server 2008 SP持续时间,锁定表?,sql-server-2008,stored-procedures,database-performance,Sql Server 2008,Stored Procedures,Database Performance,我正在处理一个具有大量流量的数据库,有时一个SP(存储过程)的持续时间为382656ms,但SP是一个简单的操作,其他时间(使用相同的参数)的持续时间为200ms。我使用探查器工具对此进行了研究,在第一种情况下(382656ms),大约有1200万次读取。第2个(前几天)有215个读数 SP是这样的: ALTER PROCEDURE [dbo].[MySP] @Id INT, @Sta
ALTER PROCEDURE [dbo].[MySP] @Id INT,
@StartDate DATETIME,
@EndDate DATETIME,
@StatusID int
AS
SET @StartDate = CONVERT(DATETIME, CONVERT(VARCHAR(10), @StartDate, 101),
101)
SET @EndDate = Dateadd(dd, 1, @EndDate)
SET @EndDate = CONVERT(DATETIME, CONVERT(VARCHAR(10), @EndDate, 101), 101)
SELECT t3.name,
t3.code,
Sum(cdoi.count) Cout1,
Sum(Isnull(S.cant, 0)) AS Count2
FROM table1 t1 WITH(nolock)
JOIN dbo.table2 t2 WITH(nolock)
ON t1.lid = t2.lid
JOIN table3 t3 WITH(nolock)
ON t3.coid = t2.coid
LEFT JOIN (SELECT t4.ids,
t5.idc,
Sum(t4.count) AS Count2
FROM table4 t4 WITH(nolock)
INNER JOIN table5 t5 WITH(nolock)
ON t5.idlink = t4.idlink
WHERE t5.IdC = @Idc
GROUP BY t4.ids,
t5.idc) S
ON S.ids = t1.ids
AND S.idc = t1.idc
WHERE t1.Idc = @Idc
AND t1.StatusID = @StatusID
AND [date] BETWEEN @StartDate AND @EndDate
GROUP BY t3.name,
t3.code
有人知道为什么会这样吗
请注意,我正在使用nolock on select语句
谢谢
编辑
谢谢约翰的回复。
“首先检查参数。可能第一个查询的日期范围很大”
我使用了相同的参数来检查这一点
“检查此波动是否可重复。”
发生在拉姆登
“检查表数据是否发生了显著变化。”
该表每天增加900万条记录,但对于不同的idc,因此对于相同的参数,idc只更新数据
“检查是否有人创建了减少必要读取次数的索引。”
没有
“检查统计信息是否已更新,以便使用正确的索引。”
不,它总是使用正确的索引
“检查查询计划是否已刷新。”
当SP出现故障时,我必须制定执行计划。我已经试过了,但总是使用正确的索引,执行计划也不错
编辑2:
运行一些测试并查看活动监视器后,我看到一个PAGEIOLATCH_SH等待。但是,从web应用程序执行sp时,始终会发生此等待。在web应用程序中进行测试,加载一个我知道运行SP的页面,也知道参数,当SP等待PAGEIOLATCH_SH时,我在SQL Management上执行了相同的SP,并在0秒内返回结果。而web应用的sp仍在等待
为什么会发生这种情况???您对长查询和短查询都有计划吗?有什么区别吗?没有,因为我总是执行SP工作正常。。。SP每天都会针对不同的参数执行很多次,并且运行良好。。。但有时情况并非如此。我使用了一个网络工具(NewRelic),在这个应用程序中,我发现sp有时会花费大量时间来返回结果。为此,我执行了探查器工具,然后可以看到时间响应。在长SP运行的中间时间,会调用对同一SP的其他调用并正常工作。