联机索引操作的工作原理

本主题定义联机索引作期间存在的结构,并显示与这些结构关联的活动。

联机索引结构

为了在进行索引数据定义语言(DDL)操作时允许用户的并发活动,在联机索引操作期间使用以下结构:源索引和预先存在的索引、目标索引,以及在联机状态下重建堆或删除聚集索引时使用的临时映射索引。

  • 源索引和预先存在的索引

    源是原始表或聚集索引数据。 预先存在的索引是与源结构关联的任何非聚集索引。 例如,如果联机索引操作正在重新生成一个聚集索引,该索引具有四个关联的非聚集索引,那么源是现有的聚集索引,预先存在的索引是那些非聚集索引。

    预先存在的索引可供并发用户选择、插入、更新和删除作。 这包括批量插入(这种操作虽然受到支持但并不推荐使用),以及通过触发器和引用完整性约束进行的隐式更新。 所有预先存在的索引都可用于查询和搜索。 这意味着查询优化器可以选择它们,并在必要时在索引提示中指定。

  • 目标

    目标或目标是正在创建或重新生成的新索引(或堆)或一组新索引。 在索引作期间,SQL Server 数据库引擎会将用户插入、更新和删除作应用于源。 例如,如果联机索引操作正在重建聚集索引,那么目标是重建的聚集索引;当重建聚集索引时,数据库引擎不会重建非聚集索引。

    在索引操作提交之前,处理 SELECT 语句时不会搜索目标索引。 在内部,索引被标记为仅写。

  • 临时映射索引

    创建、删除或重新生成聚集索引的联机索引作也需要临时映射索引。 并发事务使用此临时索引来确定在更新或删除基础表中的行时要删除的新索引中的哪些记录。 此非聚集索引是在与新聚集索引(或堆)相同的步骤中创建的,不需要单独的排序作。 并发事务还会在其所有插入、更新和删除操作中维护临时映射索引。

联机索引活动

在简单的联机索引作(例如,在非索引表(堆)上创建聚集索引)期间,源和目标将经历三个阶段:准备、生成和最终。

下图显示了联机创建初始聚集索引的过程。 源对象(堆)没有其他索引。 每个阶段都会显示源和目标结构活动;同时显示并发用户选择、插入、更新和删除作。 准备阶段、生成阶段和最终阶段所使用的锁定模式一并显示。

联机索引作期间执行的活动

源头结构活动

下表列出了在索引作的每个阶段和相应的锁定策略中涉及源结构的活动。

阶段 来源活动 源锁
准备工作

非常短的阶段
用于创建新的空索引结构的系统元数据准备。

定义了表的快照。 也就是说,行版本控制用于提供事务级读取一致性。

源上的并发用户写入作在非常短时间内被阻止。

除了创建多个非聚集索引之外,不允许并发DDL操作。
表上的共享标记(S)*

IS (意向共享)

INDEX_BUILD_INTERNAL_RESOURCE**
建造

主阶段
数据在批量加载操作中被扫描、排序、合并并插入到目标中。

并发用户选择、插入、更新和删除作将同时应用于预先存在的索引和正在生成的任何新索引。
伊斯兰国

INDEX_BUILD_INTERNAL_RESOURCE**
最终

非常短的阶段
所有未提交的更新事务都必须在此阶段开始之前完成。 根据获取的锁,在完成此阶段之前,所有新用户读取或写入事务都会在非常短的时间内被阻止。

系统元数据被更新,以将源替换为目标。

如果需要,则会删除源。 例如,重新生成或删除聚集索引后。
INDEX_BUILD_INTERNAL_RESOURCE**

如果创建非聚集索引,则为表上的 S。*

SCH-M(架构修改)如果删除了任何源结构(索引或表)。

* 索引操作将在任何未提交的更新事务完成前等待,然后再获取表上的 S 锁或 SCH-M 锁。

** 资源锁INDEX_BUILD_INTERNAL_RESOURCE阻止在索引作正在进行时对源和预先存在的结构执行并发数据定义语言(DDL)作。 例如,此锁可防止在同一个表上并发重新生成两个索引。 尽管这个资源的锁与 Sch-M 锁相关联,但它不会阻止数据操作语句。

上表显示了在联机索引操作的生成阶段获取的单个共享 (S) 锁,该操作涉及单个索引。 在单个联机索引操作中(例如,在包含一个或多个非聚集索引的表上创建初始聚集索引期间)生成或重新生成聚集索引和非聚集索引时,在生成阶段将获取两个短期 S 锁,随后获取长期意向共享(IS)锁。 首先获取一个 S 锁用于创建聚集索引,创建聚集索引完成后,会获取第二个短期 S 锁来创建非聚集索引。 创建非聚集索引后,S 锁将降级为 IS 锁,直到联机索引作的最后阶段。

目标结构活动

下表列出了在索引作的每个阶段和相应的锁定策略中涉及目标结构的活动。

阶段 目标活动 目标锁
准备工作 新索引已创建并设置为仅写状态。 伊斯兰国
建造 从源插入数据。

用户对源进行的修改(插入、更新、删除)已被应用。

此活动对用户是透明的。
伊斯兰国
最终 索引元数据已更新。

索引被设置为可读/写的状态。
S



SCH-M

在索引作完成之前,用户的 SELECT 语句不会访问目标。

完成准备和最后阶段后,过程缓存中存储的查询和更新计划将失效。 后续查询将使用新索引。

在联机索引操作中涉及的表上声明的游标的生命周期受联机索引阶段的限制。 每个阶段都会使更新游标失效。 只读游标仅在最后阶段结束后失效。

联机执行索引操作

联机索引操作准则