联机索引作的工作原理

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Microsoft Fabric 预览版中的 SQL 数据库

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

联机索引结构

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

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

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

    预先存在的索引可供并发用户选择、插入、更新和删除作。 这包括批量插入(在联机索引操作期间受到支持但不建议这样做),以及触发器和引用完整性约束的隐式更新。 所有预先存在的索引都可用于查询。 这意味着查询优化器可能会选择它们,并在必要时在索引提示中指定。

  • Target

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

    在索引操作提交之前,目标索引不会被使用。 在内部,索引被标记为只写。

  • 临时映射索引

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

联机索引活动

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

可以使用 progress_report_online_index_operation 扩展事件监视联机索引作的进度。

下图显示了联机创建初始聚集索引的过程。 源对象(即堆)没有其他索引。 每个阶段都会显示源和目标结构活动;同时也显示并发用户SELECTINSERTUPDATEDELETE的操作。 准备、生成和最后阶段均与每个阶段使用的锁模式一起指明。

显示联机索引作期间执行的活动的关系图。

源结构活动

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

Phase Source activity Source locks
Preparation

Short phase
准备系统元数据以创建新的空索引结构。

定义表的一个快照。 即,使用行版本控制提供事务级读一致性。

对源执行的并发用户写操作在短时间内将受到阻止。

不允许执行并发 DDL 操作(创建多个非聚集索引除外)。
S 上的共享 (

意向共享 (IS

具有资源子类型为 Sch-MINDEX_OPERATION 的架构修改对象锁(
Build

Main phase
数据通过批量加载操作进行扫描、排序、合并,并插入到目标中。

并发用户INSERTUPDATEDELETEMERGE的操作将同时应用于现有索引和任何正在构建的新索引。
意图共享 (IS

Sch-M具有资源子类型 INDEX_OPERATION2 的对象锁
Final

Short phase
所有未提交的写入事务操作都必须在这个阶段开始之前完成。 根据获取的锁,所有新用户读取或写入事务都会在短时间内被阻止,直到此阶段完成。

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

如果需要,则会删除源,例如在重新生成或删除聚集索引之后。
Sch-M具有资源子类型 INDEX_OPERATION2 的对象锁

如果创建非聚集索引,则在表中共享(S)。1

Sch-M 如果删除了任何源结构(索引或表)。1

1 索引操作会等待任何未提交的写事务完成,然后再在表上获取S锁或Sch-M锁。 如果一个长时间运行的查询正在进行之中,则联机索引操作会等该查询结束。 除非使用低优先级锁,否则可能会形成阻塞链。

2Sch-M 具有资源子类型的 INDEX_OPERATION 对象锁可防止在索引作正在进行时对源和预先存在的结构执行并发数据定义语言(DDL)作。 例如,此锁将会阻止为同一表同时重新生成两个索引。 虽然这是Sch-M锁,但它不会阻止数据操作语句。

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

有关如何使用锁以及如何管理锁的详细信息,请参阅 WAIT_AT_LOW_PRIORITY 联机索引操作

目标结构活动

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

Phase Target activity Target locks
Preparation 创建新索引并将其设置为只写。 意图共享(IS)
Build 从源插入数据。

应用于源的用户修改(插入、更新、删除)也应用于目标。

此活动对用户是透明的。
意向共享 (IS
Final 将更新索引元数据。

索引设置为读写模式。
共享 (S) 或架构修改 (Sch-M

在索引作完成之前,用户查询不会访问目标。

准备或最终阶段完成后,存储在计划缓存中的查询计划可能会失效。

为联机索引操作所涉及的表声明的游标仅在联机索引阶段有效。 更新游标在每个阶段均无效。 只读游标在最后阶段之后才失效。