执行存储过程需要很长时间才能返回行数高

时间:2014-05-13 10:22:42

标签: sql-server stored-procedures sql-server-performance

我有一个这样的存储过程:

ALTER procedure [dbo].[IBS_fetchreleasedinpodiumgridnew]
   @locid INTEGER = NULL
AS BEGIN
   SET NOCOUNT ON

   DECLARE @TodayMinus7Days DATETIME
   SET @TodayMinus7Days = getdate()-7

   SELECT  
       t.TBarcode, t.PlateNo, t.DelEcode,
       cast(t.Paydate as Time) [REQ],
       datediff(MINUTE, t.PayDate,
                CASE t.Status
                   WHEN 3 THEN GETDATE()
                   WHEN 4 THEN t.KeyRoomDate
                   WHEN 5 THEN  t.KeyRoomDate
                END) as KRRT,
       datediff(MINUTE, t.PayDate,
                CASE t.Status
                   WHEN 3 THEN GETDATE()
                   WHEN 4 THEN GETDATE()
                   WHEN 5 THEN t.DelDate
                END) as DT
   FROM    
       dbo.Transaction_tbl t
   WHERE   
      (([status] IN (3,4))
      OR 
      ([status] = 5 AND DATEDIFF(n, DelDate, GETDATE()) <= 3)
      )
      AND locid = 6 
      AND dtime >= @TodayMinus7Days
   ORDER BY  
       paydate 
end

我在Locid, dtime列上有一个非聚集索引。

我的桌面有超过4个缺少记录..每当返回超过25行时,这需要很长时间才能执行(有时30秒,有时是45秒)。为什么会这样?如何更快地执行我的存储过程?

有人建议添加此代码

OPTION (OPTIMIZE FOR (@TodayMinus7Days UNKNOWN))

在这个存储过程的最后...如果我添加这个,我的执行性能会增加吗?这段代码有什么用?在这个存储过程中我需要做的其他优化是什么?

感谢任何帮助!

这是我的查询执行计划

enter image description here

1 个答案:

答案 0 :(得分:0)

“优化”的想法并非不合理 这个想法是告诉db引擎不要假设在执行计划时,这个proc使用的第一个日期值是典型的。

但是你的执行计划很简单,只有一个表,我希望提示可能不是一个答案。

执行计划显示了两件事。

首先,最慢的是Sort == your Order By。 排序总是很慢,并且不能很好地扩展。 如果你真的不需要它,删除Order By将产生最大的影响。 如果你确实需要Order By,那么消除Sort的唯一方法就是在Order By列上添加一个索引......并使用它。
与任何指数决策一样,您必须权衡添加它的利弊。

这导致了其他操作 - 键查找 您有两个步骤来进行数据提取,索引搜索,然后是所需列的键查找。 您可以通过使索引包含所有需要的列(或创建新的索引)来消除键查找。 同样,您应该权衡系统中索引更改的优缺点。