-1

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

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))

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

任何帮助表示赞赏!

这是我的查询执行计划

在此处输入图像描述

4

1 回答 1

0

“优化”的想法并非没有道理。
这个想法是告诉数据库引擎在制定执行计划时不要假设与此 proc 一起使用的第一个日期值是典型的。

但是您的执行计划非常简单,只有一张表,我希望这个提示可能不是答案。

执行计划显示了两件事。

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

这导致了另一个操作——密钥查找。
您有两个步骤来提取数据,索引查找,然后是您想要的所有列的键查找。您可以通过使索引包含所有需要的列(或创建新的索引)来消除键查找。同样,您应该权衡系统中索引更改的利弊。

于 2014-06-10T23:48:34.090 回答