禁用索引和约束

本主题介绍如何使用 SQL Server Management Studio 或 Transact-SQL 在 SQL Server 2014 中禁用索引或约束。 禁用索引可防止用户访问索引,并阻止聚集索引访问基础表数据。 索引定义保留在元数据中,索引统计信息保留在非聚集索引上。 对视图禁用非聚集索引或聚集索引会物理删除索引数据。 对表禁用聚集索引将阻止访问数据,但数据仍保留在表中。在索引被删除或重新生成之前,它将不可用于数据操作语言(DML)操作。

本主题内容

在您开始之前

局限性与限制

  • 索引被禁用时不进行维护。

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

  • 不能创建与现有禁用索引相同的名称的索引。

  • 可以删除禁用的索引。

  • 禁用唯一索引时,也会禁用 PRIMARY KEY 或 UNIQUE 约束以及引用其他表中索引列的所有 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 重新生成禁用的索引。

  • 创建新的聚集索引可启用以前禁用的非聚集索引。 有关详细信息,请参阅 “启用索引和约束”。

安全

权限

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

使用 SQL Server Management Studio

禁用索引

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

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

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

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

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

  6. 在“ 禁用索引 ”对话框中,验证正确的索引是否位于 “索引”中以禁用 网格,然后单击“ 确定”。

禁用表上的所有索引

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

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

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

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

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

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

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

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

索引类型
显示索引的类型: ClusteredNonclusteredSpatialXML

地位
显示禁用操作的状态。 执行后的可能值为:

  • 空白

    执行前 的状态 为空。

  • 正在学习

    禁用索引的过程已启动,但尚未完成。

  • 成功

    禁用操作已成功完成。

  • 错误

    索引禁用操作期间遇到了错误,并且操作未成功完成。

  • 停止

    由于用户停止了作,索引的禁用未成功完成。

消息
在禁用操作期间提供错误消息的文本。 在执行期间,错误显示为超链接。 超链接的文本描述错误的正文。 消息列通常不够宽,难以阅读消息的完整文本。 可通过两种方法获取全文:

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

  • 单击超链接可显示显示完整错误的对话框。

使用 Transact-SQL

禁用索引

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

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

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

    USE AdventureWorks2012;  
    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 AdventureWorks2012;  
    GO  
    -- Disables all indexes on the HumanResources.Employee table.  
    ALTER INDEX ALL ON HumanResources.Employee  
    DISABLE;  
    

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