联机索引操作准则
执行联机索引操作时,请按照下列指南进行:
须在基础表包含以下大型对象 (LOB) 数据类型时创建、重新生成或离线删除聚集索引:image、 ntext和text。
无法为本地临时表联机创建、重新生成或删除索引。全局临时表的索引则没有此限制。
注意 |
---|
在 Microsoft SQL Server 的每个版本中均不支持联机索引操作。有关 SQL Server 的每个版本支持的功能列表,请参阅 SQL Server 2012 各个版本支持的功能。 |
下表显示了可以联机执行的索引操作以及不能联机操作的索引。其中还包括其他限制。
联机索引操作 |
不能执行联机操作的索引 |
其他限制 |
---|---|---|
ALTER INDEX REBUILD |
禁用的聚集索引或禁用的索引视图 XML 索引 对本地临时表的索引 |
当表中包含不能执行联机操作的索引时,指定关键字 ALL 可能会导致操作失败。 有关重新生成禁用索引的其他限制。有关详细信息,请参阅禁用索引和约束。 |
CREATE INDEX |
XML 索引 视图的初始唯一聚集索引 对本地临时表的索引 |
|
CREATE INDEX WITH DROP_EXISTING |
禁用的聚集索引或禁用的索引视图 对本地临时表的索引 XML 索引 |
|
DROP INDEX |
已禁用的索引 XML 索引 非聚集索引 对本地临时表的索引 |
无法在一条语句中指定多个索引。 |
ALTER TABLE ADD CONSTRAINT(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 2012 的多处理器计算机上,索引语句可能会像其他查询那样,使用多个处理器来执行与索引语句关联的扫描和排序操作。可以使用 MAXDOP 索引选项控制专用于联机索引操作的处理器数量。通过这种方式,可以在那些并发用户间平衡索引操作所使用的资源。有关详细信息,请参阅配置并行索引操作。有关支持并行索引操作的 SQL Server 版本的详细信息,请参阅 SQL Server 2012 各个版本支持的功能 (https://go.microsoft.com/fwlink/?linkid=232473)。
由于索引操作的最后阶段持有 S 锁或 Sch-M 锁,因此当在显式用户事务(例如 BEGIN TRANSACTION...COMMIT 块)内运行联机索引操作时必须小心。此操作会造成在事务结束之前一直持有锁,从而妨碍用户并发。
如果允许联机索引重新生成与 MAX DOP > 1 和 ALLOW_PAGE_LOCKS = OFF 选项一起运行,则可能导致碎片增多。有关详细信息,请参阅工作方式:联机索引重新生成 - 可能造成碎片增加.
事务日志注意事项
脱机或联机执行大范围的索引操作,会生成大型数据负载,这些负载会造成事务日志快速填充。为确保索引操作可以回滚,事务日志直到索引操作完成后才可以截断,但是,可以在索引操作过程中备份日志。因此,事务日志必须具有足够的空间来存储索引操作事务和所有的并发用户事务,以满足索引操作过程的需要。有关详细信息,请参阅索引操作的事务日志磁盘空间。