翻译——How Much is Offline During an Index Rebuild?

原文链接:How Much is Offline During an Index Rebuild?[1]

译者注释:本文有些地方没有直译,而是结合自己的理解后的意译,翻译如有不当或不对的地方,敬请纠正或告知。

脱机重建索引的代价有多大

这个问题来自与我们每周网络直播(webcast)前的聊天:当你脱机(offline)重建一个非聚集索引时,它会仅仅只影响非聚集索引呢?还是它会影响整张表呢?

展示案例比讲述原理更有趣,让我们来看看吧

首先,我将AdventureWork数据库还原到慢存储上,有时候慢存储很方便展示像这样的任何问题。我喜欢将AdventureWorks2012数据库的备份恢复到手头的外部希捷硬盘上。我喜欢在我的工作站中使用SSD硬盘,但是当涉及到想要测试诸如相当少量数据的阻塞之类的事情时,在周围拥有一些可挂载的外部存储是非常方便的。

Now I run a super slow nonclustered index rebuild

当AdventureWork数据库还原后,我在一个会话窗口里脱机重建索引(offline index rebuild),为了尽量让脱机重建索引耗时长一些,我以一种非常糟糕的方式设置了索引重建方式,我设置表的填充因子为1%,这个意味着SQL Server会拆分这张表,而且让表的每一个页面(page)的99%为空

--Warning: this fillfactor is terrible for performance
--Don't do this in production!
ALTER INDEX [IX_TransactionHistory_ProductID]
on [Production].[TransactionHistory]
REBUILD with (fillfactor=1);
GO

在另外一个会话中,我使用聚集索引查询这个表,当脱机索引重建还在运行的时候,我打开第二个会话窗口运行了一个SELECT查询语句,这个查询语句走聚集索引读取数据,而且不使用非聚集索引。

SELECT Quantity
FROM [Production].[TransactionHistory];
GO

现在,从第三个会话检查确认一下,脱机重建非聚集索引是否阻塞了我的查询语句。为了获取跟多细节信息,我运行 Adam Machanic的sp_whoisactive脚本,其中包含了一个参数来获取有关锁的信息(这个操作的代价可能有点昂贵,因此仅在需要时使用此选项)

exec sp_WhoIsActive @get_locks=1;
GO

果然(毫无疑问),SELECT查询语句被索引重建语句给阻塞了。

翻译——How Much is Offline During an Index Rebuild?


单击这个被阻塞的SELECT语句的’locks’列,从这个XML字段,我们可以看到更多信息

<Database name="AdventureWorks2012">
<Locks<
<Lock request_mode="S" request_status="GRANT" request_count="1" />

</Locks>
<Objects>
<Object name="TransactionHistory" schema_name="Production">
<Locks>
<Lock resource_type="OBJECT" request_mode="IS" request_status="WAIT" request_count="1" />
</Locks>
</Object>
</Objects>
</Database>

这个确认了查询语句请求会在Production.TransactionHistory表上请求获取意向共享锁,但是它获取不到这个锁。

结论发现:脱机重建聚集非索引会阻止查询聚集索引。

Finding: offline rebuilds of a nonclustered index prevent querying the clustered index

如果你需要脱机重建索引,这意味着无法通过仅重建非聚集索引来最大程度地的减少影响,重建非聚集索引会在整个对象上产生锁。我们可以通过上面实验看到查询语句想获取意向共享锁(IS) 但是它被阻塞了,如果我们的索引很大,很多,而表需要持续可用(不断的读取查询),那么这种情况可能带来很多问题

Enterprise Edition Doesn’t Fix Everything

SQL Server企业版不能解决所有事情

在SQL Server企业版下面,你可以通过使用ONLINE指定联机重建索引,在这种情况下,情况略有不同用户可以在大多数索引重建期间访问表,但是,在重建索引结束时, SQL Server依然需要一个独占的“架构修改”锁(SCH-M锁)来完成这项操作。而在高并发系统中,这仍然是一个问题

如果你想自己实验重现这个问题/现象, 这非常简单。只需要首先执行SELECT语句,然后将重建索引选项改为“ONLINE”选项。

But Wait, There’s More

此逻辑也适用于创建索引的任何情况 – 如果您拥有企业版,则需要记住,如果需要避免在表上阻塞,请始终使用“ONLINE”选项创建非聚集索引。即便如此, 讨厌的SCH-M锁也可能成为非常繁忙系统的杀手锏。

参考资料

[1]

How Much is Offline During an Index Rebuild?: https://www.brentozar.com/archive/2013/10/how-much-is-offline-during-an-index-rebuild/


原文始发于微信公众号(DBA闲思杂想录):翻译——How Much is Offline During an Index Rebuild?

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/227805.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!