我有一个这样的存储过程:
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))
在这个存储过程的最后...如果我添加这个,我的执行性能会增加吗?这段代码有什么用?在这个存储过程中我需要做的其他优化是什么?
感谢任何帮助!
这是我的查询执行计划
答案 0 :(得分:0)
“优化”的想法并非不合理 这个想法是告诉db引擎不要假设在执行计划时,这个proc使用的第一个日期值是典型的。
但是你的执行计划很简单,只有一个表,我希望提示可能不是一个答案。
执行计划显示了两件事。
首先,最慢的是Sort == your Order By。
排序总是很慢,并且不能很好地扩展。
如果你真的不需要它,删除Order By将产生最大的影响。
如果你确实需要Order By,那么消除Sort的唯一方法就是在Order By列上添加一个索引......并使用它。
与任何指数决策一样,您必须权衡添加它的利弊。
这导致了其他操作 - 键查找 您有两个步骤来进行数据提取,索引搜索,然后是所需列的键查找。 您可以通过使索引包含所有需要的列(或创建新的索引)来消除键查找。 同样,您应该权衡系统中索引更改的优缺点。