SQL Server中离线索引重建和在线索引重建有什么区别?

73

在重建索引时,有一个选项可以选择 ONLINE=OFFONLINE=ON。我知道当打开 ONLINE 模式时,它会制作一个索引的副本,将新的查询切换到使用它,并重新构建原始索引,使用版本控制来跟踪更改(请纠正我如果我错了)。

但是在离线模式下,SQL 做什么呢?


2
就记录而言,当添加新索引时,您也可以使用ONLINE=ON选项,而不仅仅是在重建索引时。 - datagod
3个回答

91
在线模式下,新索引在旧索引可供读写时进行构建。任何对旧索引的更新也会应用于新索引。反物质列用于跟踪更新和重建之间的可能冲突(例如,删除尚未复制的行)。请参见在线索引操作。完成该过程后,表会被锁定一小段时间,新索引将取代旧索引。如果索引包含LOB列,则不支持SQL Server 2005/2008/R2中的在线操作。
离线模式下,表被提前锁定以进行读写操作,然后从旧索引构建新索引,同时对表进行锁定。在重建索引时,不允许在表上执行读写操作。只有当操作完成后,才释放表上的锁,并允许再次进行读写操作。
注意,在SQL Server 2012中,解除了LOB的限制,请参见包含LOB列的索引的在线索引操作

1
如果索引包含LOB列,则SQL Server 2005/2008/R2不支持在线操作。问题是:重建操作会失败,还是仅降级为离线重建? - esac
所有包含LOB列的索引,还是仅聚集索引? - esac
请参阅链接白皮书中的附录D。 - Remus Rusanu
这是否也适用于MySQL的ON/OFFLINE索引? - Adelin
@Adio MySQL非常不同。请参考https://dev.mysql.com/doc/refman/5.6/en/innodb-create-index-overview.html。 - Remus Rusanu
显示剩余2条评论

14

主要的区别是:

1)离线索引重建比在线重建更快。

2)在 SQL Server 的在线索引重建过程中需要额外的磁盘空间。

3)SQL Server 在线索引重建时会获取锁。

  • 这个架构修改锁会阻塞其他对表的并发访问,但只会在旧索引被删除和统计信息更新时持续很短的时间。

9
在线索引重建在锁定表方面较少侵入性。离线重建会导致表格严重锁定,这可能会对尝试访问数据库的事物造成重大阻塞问题。
“在离线重建期间,索引操作持续应用表格锁[offline rebuild]。创建、重建或删除聚集、空间或XML索引,或重建或删除非聚集索引的离线索引操作会在表格上获取模式修改(Sch-M)锁。这将防止所有用户在操作期间访问底层表格。创建非聚集索引的离线索引操作会在表格上获取共享(S)锁。这将防止更新底层表格但允许读操作,例如SELECT语句。”
此外,在线索引重建是企业版(或开发者)专属功能。 http://msdn.microsoft.com/en-us/library/ms188388(v=sql.110).aspx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接