执行联机索引操作时,请按照下列指南进行:
当基础表包含以下大型对象(LOB)数据类型时,必须创建、重新生成或删除聚集索引:
image、 ntext 和text。无法联机创建、重新生成或删除本地临时表上的索引。 此限制不适用于全局临时表上的索引。
注释
联机索引作在 MicrosoftSQL Server 的每个版本中都不可用。 有关 SQL Server 各版本支持的功能列表,请参阅 SQL Server 2014 各版本支持的功能。
下表显示了可联机执行的索引作以及从这些联机作中排除的索引。 还包括其他限制。
| 联机索引作 | 排除的索引 | 其他限制 |
|---|---|---|
| ALTER INDEX REBUILD | 已禁用聚集索引或已禁用索引视图 XML 索引 列存储索引 对本地临时表的索引 |
指定关键字 ALL 时,如果表包含排除索引,可能会导致操作失败。 重新生成禁用索引时适用其他限制。 有关详细信息,请参阅 “禁用索引和约束”。 |
| 创建索引 (CREATE INDEX) | XML 索引 视图的初始唯一聚集索引 对本地临时表的索引 |
|
| 生成索引并删除现有项 | 已禁用聚集索引或已禁用索引视图 对本地临时表的索引 XML 索引 |
|
| DROP INDEX | 禁用的索引 XML 索引 非聚集索引 对本地临时表的索引 |
不能在单个语句中指定多个索引。 |
| 修改表添加约束 (PRIMARY KEY 或 UNIQUE) | 对本地临时表的索引 聚集索引 |
一次只允许一个子句。 例如,不能在同一 ALTER TABLE 语句中添加和删除 PRIMARY KEY 或 UNIQUE 约束。 |
联机索引作正在进行时,无法修改、截断或删除基础表。
创建或删除聚集索引时指定的联机选项设置(ON 或 OFF)将应用于必须重新生成的任何非聚集索引。 例如,如果使用 CREATE INDEX WITH DROP_EXISTING ONLINE=ON 联机生成聚集索引,则所有关联的非聚集索引也会联机重新创建。
联机创建或重新生成 UNIQUE 索引时,索引生成器和并发用户事务可能会尝试插入相同的键,因此违反了唯一性。 如果用户输入的行在源表中的原始行移动到新索引之前插入到新索引(目标)中,则联机索引操作将失败。
尽管不常见,但联机索引操作在与用户或应用程序活动的数据库更新交互时可能会导致死锁。 在这些罕见情况下,SQL Server 数据库引擎将选择用户或应用程序活动作为死锁受害者。
在创建多个新的非聚集索引或重新组织非聚集索引时,您可以在同一表或视图上执行并发联机索引 DDL 操作。 同一时间执行的所有其他联机索引操作都将失败。 例如,不能在同一表上在线重建现有索引的同时在线创建新索引。
当索引包含大型对象类型的列,并且在同一事务中,在此在线操作之前有更新操作时,无法执行在线操作。 若要解决此问题,请将联机操作置于事务外部或将其放在事务中任何更新之前。
磁盘空间注意事项
通常,联机和脱机索引操作的磁盘空间要求相同。 例外是临时映射索引所需的额外磁盘空间。 此临时索引是在联机索引操作(创建、重新生成或删除聚集索引)中使用的。 联机删除聚集索引需要与联机创建聚集索引一样多的空间。 有关详细信息,请参阅 索引 DDL 操作的磁盘空间要求。
性能注意事项
尽管联机索引作允许并发用户更新活动,但如果更新活动非常繁重,索引作将花费更长的时间。 通常,无论并发更新活动级别如何,联机索引操作都将比相应的脱机索引操作慢。
由于源和目标结构都在联机索引作期间保持,因此插入、更新和删除事务的资源使用率可能会增加一倍。 这可能会导致在索引作期间性能下降,以及资源使用率(尤其是 CPU 时间)的降低。 联机索引操作已被完整记录。
虽然我们建议进行在线操作,但您应该评估您的环境和具体要求。 可能最优的做法是离线运行索引操作。 在执行此作时,用户在作过程中限制对数据的访问权限,但作完成速度更快,使用的资源更少。
在运行 SQL Server 2014 的多处理器计算机上,索引语句可能会使用更多处理器来执行与索引语句关联的扫描和排序作,就像其他查询一样。 可以使用 MAXDOP 索引选项来控制专用于联机索引作的处理器数。 这样,便可以将索引操作使用的资源与并发用户使用的资源进行平衡。 有关详细信息,请参阅 “配置并行索引作”。 有关支持并行索引作的 SQL Server 版本的详细信息,请参阅 SQL Server 2014 各版本支持的功能。
由于 S 锁或 Sch-M 锁在索引操作的最后阶段被持有,因此当您在显式用户事务(例如 BEGIN TRANSACTION...COMMIT 块)中运行联机索引操作时要小心。 此操作会造成在事务结束之前一直持有锁,从而妨碍用户并发。
允许联机索引重建以MAX DOP > 1和ALLOW_PAGE_LOCKS = OFF选项运行时可能会增加碎片。 有关详细信息,请参阅 工作原理:联机索引重新生成 - 可能导致碎片增加。
事务日志注意事项
脱机或联机执行大范围的索引操作,会生成大型数据负载,这些负载会造成事务日志快速填充。 若要确保可以回滚索引操作,在索引操作完成之前,事务日志不能被截断,但是,可以在索引操作期间备份日志。 因此,事务日志必须具有足够的空间来存储索引操作事务和所有的并发用户事务,以满足索引操作过程的需要。 有关详细信息,请参阅 索引操作的事务日志磁盘空间。