【发布时间】:2017-05-31 17:59:36
【问题描述】:
我有一个运行这个语句的存储过程
UPDATE QP.LocalMessage WITH (UPDLOCK, ROWLOCK)
SET StatusId = 0
WHERE StatusId = 1 AND DateLockedUntil <= @DateNow
我们为此更新创建了一个索引以快速运行
CREATE NONCLUSTERED INDEX [IX_LocalMessage_ProcessingLocked]
ON [QP].[LocalMessage] ([DateLockedUntil] ASC)
WHERE ([StatusId] = (1))
但是在查看正在使用的执行计划之后,我们没有使用这个索引,而是使用聚集索引扫描。这将需要此语句至少在 2 秒内执行,但我们看到它上升到 12-15 秒的时间。我想了解它为什么忽略索引。
【问题讨论】:
-
我能想到两个原因。 1. 存储过程已经编译并存储了计划(您可以测试 WITH RECOMPILE)和 2. SQL Server 发现使用该索引将花费与使用 PK 相同的时间。也许您可以尝试在该索引中包含您需要的字段
-
问题:1)什么版本的SQL Server,? 2) 执行计划估计它将更新多少行? 3) 表中有多少行?
标签: sql-server performance indexing