在我们的一个客户上,我们已经Microsoft SQL Server 2014 - 12.0.4100.1 (X64)
安装了。这是一个繁重的事务模式(尤其是在夜间),我们有一个定期REINDEX
维护工作,每天凌晨 4 点运行。
我们注意到,今晚重新索引作业在特定表上卡住了大约 45 分钟,alter index
因为它被另一个事务(UPDATE
用户发出的语句,我们系统的一个非常常见的事务)锁定。
由于我们已经收到用户的投诉,负责夜间检查的人及时终止了交易(包括重新索引);当他杀死它时,当前的ALTER INDEX
语句被阻止了 45 分钟,但整个REINDEX
工作在那一刻花了将近 4 个小时(他在上午 7:51 杀死了它)。
有没有办法避免REINDEX
工作被其他事务阻止?
编辑:我们注意到的碎片级别(< 30%)表明我们可能会选择 aREORGANIZE
而不是 aREINDEX
从而消除其他事务被 reorganize 锁定的机会,但 reorganize 本身仍然可能被阻止。
等等..每天运行重新索引作业真的有必要吗?你甚至看看索引是否碎片化?既然您说它是一个关键系统,我将冒昧地假设底层存储速度很快,这进一步降低了每天重新索引的可能性。请考虑一下。
如果你绝对想要这个,那么在停机期间或当负载相对非常非常少并且没有 DML 操作正在进行时运行索引维护。您可以使用在线索引重建(如果您有企业版),但这也需要锁定并且可能会被阻止。再加上频繁重建索引出日期统计数据,导致更多编译
建议:使用Ola Hallengren Index 重建解决方案。
你有单个旋转磁盘作为存储吗?如果是这样,您可能会看到碎片整理可能带来的好处。如果您有更现代的存储,那么您很可能会进行碎片整理,但只能从麻烦中看到边际收益。我已经写了三篇博客文章,我建议你从最后一篇开始:http ://sqlblog.karaszi.com/fragmentation-the-final-installment/
如果您确实坚持进行碎片整理,您可能希望专注于页面完整性。不过,Ola 的脚本并不是这样写的。
此外,更新统计信息可能比索引碎片整理更有用,而且成本更低。考虑在作业中使用 Ola 站点中的示例,您只更新统计信息,自上次更新统计信息以来至少修改了 1 行。