Sql server 2008 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

我正在处理一个具有大量流量的数据库,有时一个SP(存储过程)的持续时间为382656ms,但SP是一个简单的操作,其他时间(使用相同的参数)的持续时间为200ms。我使用探查器工具对此进行了研究,在第一种情况下(382656ms),大约有1200万次读取。第2个(前几天)有215个读数

SP是这样的:

  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的其他调用并正常工作。