2011-06-10 128 views
39

重建索引时,可以选择ONLINE = OFF和ONLINE = ON。我知道当ONLINE模式打开时,它会创建索引的副本,切换新查询以使用它,然后重建原始索引,使用版本跟踪更改(如果我错了,请纠正我)。SQL Server中的OFFLINE和ONLINE索引重建有什么区别?

但SQL在离线模式下会做什么?

+2

为了记录,您还可以在添加新索引时使用ONLINE = ON选项,而不仅仅是在重建它们时。 – datagod 2012-10-03 01:29:54

回答

53

在联机模式下,建立新索引,而旧索引可读取和写入。旧索引上的任何更新也将应用于新索引。反物质列用于追踪更新与重建之间可能存在的冲突(即删除尚未复制的行)。请参阅Online Index Operations。当进程完成时,表被锁定一段时间,新的索引替换旧的索引。如果索引包含LOB列,则SQL Server 2005/2008/R2不支持ONLINE操作。

在OFFLINE模式下,对于任何读取或写入操作都预先锁定表,然后在保留表锁的同时,从旧索引构建新索引。重建索引时,在表格上不允许读取或写入操作。只有当操作完成时,表格上的锁才会释放,并且读写操作再次被允许。

请注意,在SQL Server 2012中,对LOB的限制已取消,请参见Online Index Operations for indexes containing LOB columns

+1

“如果索引包含LOB列,则SQL Server 2005/2008/R2不支持ONLINE操作。”问题:REBUILD操作会失败,还是会降级为离线重建? – esac 2011-06-10 20:05:32

+1

将失败,并显示错误2725. – 2011-06-10 21:02:00

+0

所有包含LOB列的索引或仅包含聚簇索引的索引? – esac 2011-06-10 21:06:47

6

在锁定表格时,在线索引重建不那么具有侵入性。脱机重建会导致表的大量锁定,这可能会导致在重建发生时尝试访问数据库的事件发生重大阻塞问题。

“表锁在索引操作期间[在脱机重建期间]应用。创建,重建或删除集群,空间或XML索引或重建或删除非聚集索引的脱机索引操作,获取表上的Schema修改(Sch-M)锁,这将阻止所有用户在操作期间访问基础表。创建非聚集索引的脱机索引操作会获取表上的Shared(S)锁。这样可以防止更新底层表,但允许读取操作,例如SELECT语句。“

http://msdn.microsoft.com/en-us/library/ms188388(v=sql.110).aspx

此外联机索引重建是一个企业(或开发商)版本才有的功能。

1

的主要区别是:

1)OFFLINE索引重建快于ONLINE重建。

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

3)通过SQL Server联机索引重建获取SQL Server锁。

  • 此架构修改锁定会阻止对该表的所有其他并发访问,但它只保留很短的时间,同时删除旧索引并更新统计信息。
相关问题