【发布时间】:2010-03-26 15:06:41
【问题描述】:
我在我们的应用程序的实时系统上观察 Profiler,我看到有一条更新指令,我们定期(每秒)运行,速度很慢。每次大约需要400毫秒。 查询包括此更新(这是缓慢的部分)
UPDATE BufferTable
SET LrbCount = LrbCount + 1,
LrbUpdated = getdate()
WHERE LrbId = @LrbId
这是桌子
CREATE TABLE BufferTable(
LrbId [bigint] IDENTITY(1,1) NOT NULL,
...
LrbInserted [datetime] NOT NULL,
LrbProcessed [bit] NOT NULL,
LrbUpdated [datetime] NOT NULL,
LrbCount [tinyint] NOT NULL,
)
该表有 2 个索引(非唯一且非聚集),字段按以下顺序排列:
* Index1 - (LrbProcessed, LrbCount)
* Index2 - (LrbInserted, LrbCount, LrbProcessed)
当我看到这个时,我认为问题来自 Index1,因为 LrbCount 发生了很大变化,它改变了索引中数据的顺序。
但在停用 index1 后,我看到查询的时间与最初相同。
然后我重建index1并停用index2,这次查询非常快。
在我看来 Index2 应该更新得更快,数据的顺序不应该改变,因为 LrbInserted 时间没有改变。
有人能解释一下为什么 index2 比 index1 更新更重吗?
谢谢!
编辑
我刚刚意识到我假设错了。
完整的查询还有另一部分负责延迟:
DECLARE @LrbId as bigint
SELECT TOP 1 @LrbId = LrbId
FROM Buffertable
WHERE LrbProcessed = 0
AND LrbCount < 5
ORDER BY LrbInserted
因此,这很可能与 Sql 引擎对使用哪个索引的错误决定有关。
对困惑感到抱歉。我想我们可以结束这个问题了。
【问题讨论】:
标签: sql-server performance indexing