启用索引和约束

本主题介绍如何使用 SQL Server Management Studio 或 Transact-SQL 在 SQL Server 2014 中启用禁用的索引。 禁用索引后,它将保持禁用状态,直到重新生成或删除索引

本主题内容

在您开始之前

局限性与限制

  • 重新生成索引后,必须手动启用因禁用索引而禁用的任何约束。 通过重新生成关联的索引来启用 PRIMARY KEY 和 UNIQUE 约束。 必须先启用此索引,然后重新生成该索引,之后才能启用引用 PRIMARY KEY 或 UNIQUE 约束的 FOREIGN KEY 约束。 通过使用 ALTER TABLE CHECK CONSTRAINT 语句启用 FOREIGN KEY 约束。

  • 当 ONLINE 选项设置为 ON 时,无法重新生成禁用的聚集索引。

  • 当聚集索引被禁用或启用而非聚集索引被禁用时,聚集索引的操作会对被禁用的非聚集索引产生以下影响。

    聚集索引操作 被禁用的非聚集索引...
    ALTER INDEX REBUILD。 仍然处于禁用状态。
    ALTER INDEX ALL REBUILD。 已重建并启用。
    DROP INDEX。 保持禁用状态。
    使用 DROP_EXISTING 创建索引。 保持禁用状态。

    创建新的聚集索引,其行为与 ALTER INDEX ALL REBUILD 的行为相同。

  • 对与聚集索引关联的非聚集索引的允许作取决于两种索引类型的状态(无论是已禁用还是已启用)。 下表汇总了对非聚集索引的允许操作。

    非聚集索引操作 当禁用聚集索引和非聚集索引时。 启用聚集索引并且非聚集索引处于任一状态时。
    ALTER INDEX REBUILD。 操作失败。 操作成功。
    删除索引。 行动成功。 操作成功。
    使用 DROP_EXISTING 创建索引。 动作失败。 操作成功。

安全

权限

需要对表或视图具有 ALTER 权限。 如果使用 DBCC DBREINDEX,则用户必须拥有该表,或者是 sysadmin 固定服务器角色的成员,或者是 db_ddladmindb_owner 固定数据库角色的成员。

使用 SQL Server Management Studio

启用已禁用的索引

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

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

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

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

  5. 右键单击要启用的索引,然后选择“ 重新生成”。

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

在表上启用所有索引

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

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

  3. 单击加号按钮以展开您希望为其设置索引的表。

  4. 右键单击“索引”文件夹,然后选择“全部重新生成”

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

重新生成索引 ”对话框中提供了以下信息:

使用 Transact-SQL

使用 ALTER INDEX 启用禁用的索引

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

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

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

    USE AdventureWorks2012;  
    GO  
    -- Enables the IX_Employee_OrganizationLevel_OrganizationNode index  
    -- on the HumanResources.Employee table.  
    
    ALTER INDEX IX_Employee_OrganizationLevel_OrganizationNode ON HumanResources.Employee  
    REBUILD;   
    GO  
    

使用 CREATE INDEX 启用禁用的索引

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

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

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

    USE AdventureWorks2012;  
    GO  
    -- re-creates the IX_Employee_OrganizationLevel_OrganizationNode index  
    -- on the HumanResources.Employee table  
    -- using the OrganizationLevel and OrganizationNode columns  
    -- and then deletes the existing IX_Employee_OrganizationLevel_OrganizationNode index  
    CREATE INDEX IX_Employee_OrganizationLevel_OrganizationNode ON HumanResources.Employee  
       (OrganizationLevel, OrganizationNode)  
    WITH (DROP_EXISTING = ON);  
    GO  
    

使用 DBCC DBREINDEX 启用禁用的索引

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

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

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

    USE AdventureWorks2012;   
    GO  
    -- enables the IX_Employee_OrganizationLevel_OrganizationNode index  
    -- on the HumanResources.Employee table  
    DBCC DBREINDEX ("HumanResources.Employee", IX_Employee_OrganizationLevel_OrganizationNode);  
    GO  
    

使用 ALTER INDEX 在表上启用所有索引

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

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

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

    USE AdventureWorks2012;  
    GO  
    -- enables all indexes  
    -- on the HumanResources.Employee table  
    ALTER INDEX ALL ON HumanResources.Employee  
    REBUILD;  
    GO  
    

使用 DBCC DBREINDEX 在表上启用所有索引

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

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

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

    USE AdventureWorks2012;   
    GO  
    -- enables all indexes  
    -- on the HumanResources.Employee table  
    DBCC DBREINDEX ("HumanResources.Employee", " ");  
    GO  
    

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