删除并重新生成大型对象
当删除或重新生成大型索引时,或者当删除或截断大型表时,SQL Server 2005 数据库引擎将推迟实际的页释放及其关联的锁,直到提交事务后再执行。此实现方法支持多用户环境中的自动提交事务和显式事务,并适用于使用 128 个以上的区的大型表和索引。
通过将删除大型对象过程分为以下两个单独的阶段,数据库引擎避免了此过程所需的分配锁:逻辑阶段和物理阶段。
在逻辑阶段,将把表或索引使用的现有分配单元标记为释放,并在提交事务之前使它们保持锁定。删除某个聚集索引后,将复制数据行并将它们移到新创建的、用来存储重新生成的聚集索引或堆的分配单元。(在重新生成索引的情况下,还会对数据行进行排序。)如果存在回滚,则只需回滚此逻辑阶段。
提交事务后,将发生物理阶段。在此阶段将以物理方式成批删除被标记为释放的分配单元。这些删除操作是在后台中发生的短事务内执行的,不需要许多锁。
由于物理阶段发生在提交事务之后,因此表或索引的存储空间仍显示为不可用。如果在完成物理阶段之前需要使用此空间来扩充数据库,数据库引擎将尝试从标记为释放的分配单元恢复空间。若要查找这些分配单元当前使用的空间,请使用 sys.allocation_units 目录视图。
推迟的删除操作不会立即释放已分配的空间,并会在 数据库引擎中带来额外的开销。因此,将删除、截断和重新生成使用 128 或更少的区的表和索引,就像在 SQL Server 2000 中一样。这意味着逻辑阶段和物理阶段都会在提交事务之前发生。