生成的事务日志
在 FULL 恢复模式下,重建索引是完全记录的,因此事务日志需要在单个事务中容纳索引完整大小。这也意味着重建索引生成的事务日志可能需要进行镜像、发送到 AG 副本、复制扫描、备份等。
在 SIMPLE 和 BULK_LOGGED 恢复模式下,由离线**重建索引**生成的事务日志量将是最小的(在线索引重建总是完全记录)——只是按页面和区进行分配。但是,下一次执行日志备份(BULK_LOGGED 模式或切换到 FULL 模式)时也将包含重建更改的所有范围,因此日志备份的大小与在 FULL 恢复模式下重建索引完成的大小是一样的。这样做的好处是,在单个事务重建索引期间,不用考虑事务日志有较大的增长。
而在所有的恢复模式中,重组索引都是完全记录的,但只作为一系列小事务执行,因此不会导致事务日志异常增长。当然,事务日志仅为执行期间生成的大小,所以重组索引可能会少一些,因为它只处理存在的碎片。
锁请求
任何离线重建索引都持有表的架构修改锁(SCH-M)——不能更新或读取整个表。
任何在线重建索引都会在操作开始时获取一个短期共享表锁,在整个操作过程中持有一个意向共享锁(只会阻塞排他锁和架构修改锁),然后在操作结束时获得一个短期架构修改锁。从 SQL Server 2014 开始,你可以使用 WAIT_AT_LOW_PRIORITY 选项来延迟潜在的阻塞。
重组索引在整个操作过程中持有一个意向排他锁,它只会阻塞共享、排他和架构修改锁。
是否可中断
重建索引操作不能被中断,它是原子性的,要么全有要么全无,除非你想撤销并回滚该操作。但是在 SQL Server 2017 中,提供了一个可恢复的在线索引重建功能。
重组索引可以进行中断,前期处理的不会进行回滚,最糟糕的情况只是对当前正在进行的单页移动回滚。