( Server 12.0.2000.8在Azure中运行)
我的理解是,REORGANIZEing索引不应该干扰其他操作(也就是说,它不应该阻止正在进行索引重组的表上的查询,当然也不应该阻止其他表上的查询)。但是,我有一个夜间索引维护任务,它在运行时似乎阻塞了其他查询。
导致该块的查询采用以下格式:
ALTER INDEX [indexName] ON tableName REORGANIZE
这会导致其他查询等待,甚至是简单的查询,例如:
SELECT * FROM tableName WHERE indexedColumn = @value
我使用sp_who2
过程查看哪些查询正在等待,哪些其他查询被阻塞。同样,正在进行索引维护的表和SELECT中的表完全无关(它们甚至在不同的模式中;正在重新组织的表在dbo
中)。
正在重新组织的表有近5亿行。受影响的索引是外键使用的单个bigint列上的非聚集、非唯一索引。表本身由两个bigint列、一个tinyint列和几个小的nvarchars组成。
似乎没有什么特别之处,但我不明白为什么它会阻塞其他查询。有没有什么隐藏的依赖,我错过了?
发布于 2018-09-10 10:51:26
不幸的是,您的理解是一个误解,重新组织需要锁的操作。它只是没有离线重建那么严重的锁定。
因为重新组织采用X锁,所以它有阻止读取器的潜力。
这里有一个快速演示,以证明它需要锁。
DROP TABLE IF EXISTS dbo.whyreorg
CREATE TABLE dbo.whyreorg
(ID INT IDENTITY PRIMARY KEY, junk INT)
INSERT dbo.whyreorg
SELECT TOP 1000 FLOOR(RAND(CONVERT(VARBINARY,NEWID()))*1000)
FROM sys.all_objects a
CROSS JOIN sys.all_objects b
CREATE INDEX IX_whyreorg_this ON dbo.whyreorg (junk)
BEGIN TRAN
ALTER INDEX IX_whyreorg_this ON dbo.whyreorg REORGANIZE
SELECT *
FROM sys.dm_tran_locks
WHERE request_session_id = @@SPID
COMMIT
样本输出(为空间裁剪):
REORGANIZE不应该对其他表使用锁,所以我假设阻塞的事务依赖于正在进行重组的表。如果没有细节,就不可能证实这一点。
幸运的是,这里的解决方案很简单:停止重组。
https://dba.stackexchange.com/questions/217197
复制相似问题