禁用索引

禁用索引可防止用户访问该索引,对于聚集索引,还可防止用户访问基础表数据。索引定义保留在元数据中,非聚集索引的索引统计信息仍保留。对视图禁用非聚集索引或聚集索引会以物理方式删除索引数据。禁用表的聚集索引可以防止对数据的访问,数据仍保留在表中,但在删除或重新生成索引之前,无法对这些数据执行 DML 操作。若要重新生成并启用已禁用的索引,请使用 ALTER INDEX REBUILD 语句或 CREATE INDEX WITH DROP_EXISTING 语句。

在以下情况中可能禁用一个或多个索引:

  • SQL Server 数据库引擎在 SQL Server 升级期间自动禁用索引。

  • 使用 ALTER INDEX 手动禁用索引。

SQL Server 升级时禁用索引

在将 SQL Server 升级到新版本或为其升级 Service Pack 期间,数据库引擎将自动标识并禁用索引(包括视图的索引),前提是索引或视图定义包含以下内容:

  • 数据库引擎因其无法再保证索引数据完整性的表达式。

    例如,假定索引使用系统函数,而该函数在升级中已被更改,现在返回的结果已不同于以前。数据库引擎将在升级期间禁用索引,因为该索引可能包含升级后无效的数据。

  • 升级中更改的排序规则,升级后索引的排序不再正确。

如果在升级过程中禁用了索引,会显示警告消息,其中显示索引名称和所有关联的约束名称,以便在升级完成后重新生成这些内容。重新生成索引和启用所有约束将更正升级期间失效的数据。

如果定义包含数据库引擎因其无法再保证数据完整性的表达式,则可禁用 CHECK 约束。若要启用该约束,请使用 ALTER TABLE CHECK 语句。

使用 ALTER INDEX 禁用索引

可以使用 ALTER INDEX DISABLE 语句随时手动禁用索引。

注意注意

如果表位于事务复制发布中,则无法禁用任何与主键列关联的索引。复制需要使用这些索引。若要禁用索引,必须首先从发布中删除该表。有关详细信息,请参阅发布数据和数据库对象

您可能希望禁用索引以执行以下操作:

  • 更正索引页上的磁盘 I/O 错误(823 错误或 824 错误),然后重新生成索引。

  • 临时删除索引,以便进行故障排除。

  • 重新生成非聚集索引。

    如果未禁用非聚集索引,则重新生成操作要求有足够的临时磁盘空间来存储旧索引和新索引。但是,通过在单独的事务中禁用并重新生成非聚集索引,禁用索引所释放的磁盘空间可重新用于随后的重新生成或其他任何操作。除了排序需要一些临时磁盘空间(该空间通常是索引大小的 20%)外,不需要其他空间。

    如果磁盘空间有限,先禁用非聚集索引然后再重新生成该索引可能会很有用。例如,有一个重新生成一个或多个表中的所有非聚集索引的存储过程。在重新生成操作中先在一个单独的事务中禁用这些索引,这样可以显著减少重新生成这些索引所需的临时磁盘空间量。

禁用索引

ALTER INDEX (Transact-SQL)

如何重新生成索引 (SQL Server Management Studio)