禁用索引和约束

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例

本主题说明如何使用 SQL Server Management Studio 或 Transact-SQL 在 SQL Server 中禁用索引或约束。 禁用索引可以防止用户访问索引,而对于聚集索引,则可以防止用户访问基础表数据。 索引定义保留在元数据中,非聚集索引的索引统计信息仍保留。 对视图禁用聚集索引或非聚集索引会以物理方式删除索引数据。 禁用表的聚集索引可以防止对数据的访问,数据仍保留在表中,但在删除或重新生成索引之前,无法对这些数据执行数据操作语言 (DML) 操作。

本主题内容

开始之前

限制和局限

  • 索引处于禁用状态时,不对其进行维护。

  • 查询优化器创建查询执行计划时不考虑禁用的索引。 另外,引用包含表提示的已禁用索引的查询将失败。

  • 无法创建与现有禁用索引同名的索引。

  • 可以删除已禁用索引。

  • 禁用唯一索引时,还将禁用 PRIMARY KEY 约束或 UNIQUE 约束及引用其他表中的索引列的所有 FOREIGN KEY 约束。 禁用聚集索引时,还将禁用基础表的所有传入和传出的 FOREIGN KEY 约束。 索引处于禁用状态时,会在警告消息中列出约束名称。 重新生成索引后,必须使用 ALTER TABLE CHECK CONSTRAINT 语句手动启用所有约束。

  • 相关联的聚集索引处于禁用状态时,会自动禁用非聚集索引。 表或视图的聚集索引处于启用状态或删除了表的聚集索引时,才能启用这些非聚集索引。 除非使用 ALTER INDEX ALL REBUILD 语句启用了聚集索引,否则必须显式启用非聚集索引。

  • ALTER INDEX ALL REBUILD 语句将重新生成并启用表的所有已禁用索引(视图的已禁用索引除外)。 视图的索引必须另外使用 ALTER INDEX ALL REBUILD 语句来启用。

  • 禁用表的聚集索引时,还将禁用针对引用该表的视图的所有聚集索引和非聚集索引。 必须像重新生成被引用表的索引那样重新生成这些索引。

  • 不能访问已禁用的聚集索引的数据行,但可以删除或重新生成该聚集索引。

  • 表中没有已禁用的聚集索引时,可以联机重新生成已禁用的非聚集索引。 但是,如果使用 ALTER INDEX REBUILD 语句或 CREATE INDEX WITH DROP_EXISTING 语句,则务必脱机重新生成已禁用的聚集索引。 有关联机索引操作的详细信息,请参阅 联机执行索引操作

  • 无法对包含已禁用的聚集索引的表成功执行 CREATE STATISTICS 语句。

  • 当索引处于禁用状态且存在以下条件时,AUTO_CREATE_STATISTICS 数据库选项将对列创建新的统计信息:

    • AUTO_CREATE_STATISTICS 设置为 ON

    • 当前还没有列的相关统计信息。

    • 在查询优化过程中需要统计信息。

  • 如果聚集索引处于禁用状态, DBCC CHECKDB 无法返回有关基础表的信息;该语句将报告聚集索引已禁用。 DBCC INDEXDEFRAG 不能用于对已禁用的索引进行碎片整理;该语句将失败并显示错误消息。 可以使用 DBCC DBREINDEX 重新生成已禁用索引。

  • 创建一个新的聚集索引将启用以前禁用的非聚集索引。 有关详细信息,请参阅 Enable Indexes and Constraints

安全性

权限

若要执行 ALTER INDEX,至少需要对表或视图具有 ALTER 权限。

使用 SQL Server Management Studio

禁用索引

  1. 在对象资源管理器中,单击加号以便展开包含您要禁用索引的表的数据库。

  2. 单击加号以便展开 “表” 文件夹。

  3. 单击加号以便展开您要禁用索引的表。

  4. 单击加号以便展开 “索引” 文件夹。

  5. 右键单击要禁用的索引,然后选择“禁用”。

注意

如果表在“设计”模式下打开,则“禁用”控件不可用。 若要继续,请关闭表设计器并启动。

  1. “禁用索引” 对话框中,确认正确的索引位于 “要禁用的索引” 网格中,然后单击 “确定”

禁用表的所有索引

  1. 在对象资源管理器中,单击加号以便展开包含您要禁用索引的表的数据库。

  2. 单击加号以便展开 “表” 文件夹。

  3. 单击加号以便展开您要禁用索引的表。

  4. 右键单击“索引”文件夹,然后选择“全部禁用”。

  5. “禁用索引” 对话框中,确认正确的索引位于 “要禁用的索引” 网格中,然后单击 “确定”。 若要从 “要禁用的索引” 网格中删除索引,请选择该索引,再按 Delete 键。

“禁用索引” 对话框中将提供以下信息:

Index Name
显示索引的名称。 执行期间,此列还会显示表示状态的图标。

表名
显示创建索引的表或视图的名称。

索引类型
显示索引的类型:“聚集”、“非聚集”、“空间”或 ”XML”。

状态
显示禁用操作的状态。 执行之后可能的值包括:

  • 空白

    执行之前, “状态” 为空白。

  • 进行中

    禁用索引操作已启动,但尚未完成。

  • Success

    禁用操作已成功完成。

  • 错误

    禁用索引操作过程中遇到错误,操作未成功完成。

  • 已停止

    用户已停止禁用索引操作,该操作未成功完成。

Message
禁用操作期间提供错误消息文本。 执行过程中,错误显示为超链接。 超链接的文本描述错误的正文。 “消息” 列宽度一般不够,无法阅读完整的消息文本。 获取完整文本的方法有两种:

  • 将鼠标指针移到消息单元上以显示包含错误文本的工具提示。

  • 单击超链接以显示一个对话框,显示完整的错误。

“使用 Transact-SQL”

禁用索引

  1. “对象资源管理器” 中,连接到 数据库引擎的实例。

  2. 在标准菜单栏上,单击 “新建查询”

  3. 将以下示例复制并粘贴到查询窗口中,然后单击“执行” 。

    USE AdventureWorks2022;  
    GO  
    -- disables the IX_Employee_OrganizationLevel_OrganizationNode index  
    -- on the HumanResources.Employee table  
    ALTER INDEX IX_Employee_OrganizationLevel_OrganizationNode ON HumanResources.Employee  
    DISABLE;  
    

禁用表的所有索引

  1. “对象资源管理器” 中,连接到 数据库引擎的实例。

  2. 在标准菜单栏上,单击 “新建查询”

  3. 将以下示例复制并粘贴到查询窗口中,然后单击“执行” 。

    USE AdventureWorks2022;  
    GO  
    -- Disables all indexes on the HumanResources.Employee table.  
    ALTER INDEX ALL ON HumanResources.Employee  
    DISABLE;  
    

有关详细信息,请参阅 ALTER INDEX (Transact-SQL)