适用于:SQL Server
Azure SQL 数据库
Azure SQL 托管实例
Microsoft Fabric 预览版中的 SQL 数据库
本文介绍如何使用 SQL Server Management Studio 或 Transact-SQL 在 SQL Server 中启用禁用的索引。 禁用索引后,它会保持禁用状态,直到重新生成或删除索引。
Limitations
重新生成索引后,必须手动启用由于禁用索引而禁用的任何约束。 通过重新生成关联的索引来分别启用 PRIMARY KEY 和 UNIQUE 约束。 必须先重新生成(启用)此索引,然后才能启用引用 FOREIGN KEY 或 PRIMARY KEY 约束的 UNIQUE 约束。 
              FOREIGN KEY 通过使用 ALTER TABLE CHECK CONSTRAINT 语句来启用约束。
当 ONLINE 选项设置为 ON 时,不能重新生成已禁用的聚集索引。
若禁用或启用了聚集索引且禁用了非聚集索引,则聚集索引操作会对禁用的非聚集索引产生如下影响。
| 聚集索引操作 | 禁用的非聚合索引状态 | 
|---|---|
| ALTER INDEX REBUILD | Remains disabled | 
| ALTER INDEX ALL REBUILD | 重建并启用 | 
| DROP INDEX | 重建并启用 | 
| CREATE INDEX WITH DROP_EXISTING | Remains disabled | 
创建新的聚集索引时,行为与 ALTER INDEX ALL REBUILD 相同。
与聚集索引相关联的非聚集索引允许哪些操作取决于这两种索引类型的状态是禁用还是启用。 下表概括了非聚集索引允许的操作。
| 非聚集索引操作 | 禁用聚集索引和非聚集索引时 | 启用聚集索引且非聚集索引处于任一状态时 | 
|---|---|---|
| ALTER INDEX REBUILD | 操作失败 | 操作成功 | 
| DROP INDEX | 操作成功 | 操作成功 | 
| CREATE INDEX WITH DROP_EXISTING | 操作失败 | 操作成功 | 
重新生成已禁用的压缩非聚集索引时, data_compression 默认 none为,这意味着未压缩索引。 这是因为禁用非聚集索引时,压缩设置元数据会丢失。 若要解决此问题,必须在 rebuild 语句中指定显式数据压缩。
Permissions
要求具有对表或视图的 ALTER 权限。 如果使用 DBCC DBREINDEX,则必须拥有该表或成为 sysadmin 固定服务器角色的成员,或者 db_ddladmin 或 db_owner 固定数据库角色的成员。
使用 SQL Server Management Studio
启用禁用的索引
- 在对象资源管理器中,选择加号以展开包含要为其启用索引的表的数据库。 
- 选择加号以便展开“表”文件夹。 
- 选择加号图标以展开要启用索引的表。 
- 选择加号以展开 “索引” 文件夹。 
- 右键单击要启用的索引,然后选择“重新生成”。 
- 在“ 重新生成索引 ”对话框中,验证正确的索引是否位于 “索引”中以重新生成 网格,然后选择“ 确定”。 
对表启用所有索引
- 在对象资源管理器中,选择加号以展开包含要启用索引的表的数据库。 
- 选择加号以便展开“表”文件夹。 
- 选择加号图标以展开要启用索引的表。 
- 右键单击“索引”文件夹,然后选择“全部重新生成”。 
- 在“ 重新生成索引 ”对话框中,验证正确的索引是否位于 “索引”中以重新生成 网格,然后选择“ 确定”。 要从“要重新生成的索引”网格中删除索引,请选择该索引,再按 Delete 键。 
“重新生成索引”对话框中将提供以下信息:
Use Transact-SQL
本文中的代码示例使用 AdventureWorks2022 或 AdventureWorksDW2022 示例数据库,可以从 Microsoft SQL Server 示例和社区项目 主页下载该数据库。
使用 ALTER INDEX 启用禁用的索引
执行以下 Transact-SQL 脚本。 此示例在 IX_Employee_OrganizationLevel_OrganizationNode 表上启用 HumanResources.Employee 索引。
USE AdventureWorks2022;
GO
ALTER INDEX IX_Employee_OrganizationLevel_OrganizationNode
ON HumanResources.Employee REBUILD;
GO
使用 CREATE INDEX 启用禁用的索引
执行以下 Transact-SQL 脚本。 此示例使用IX_Employee_OrganizationLevel_OrganizationNode列重新创建HumanResources.Employee表上的OrganizationLevel索引,然后删除现有OrganizationNodeIX_Employee_OrganizationLevel_OrganizationNode索引。
USE AdventureWorks2022;
GO
CREATE INDEX IX_Employee_OrganizationLevel_OrganizationNode
ON HumanResources.Employee(OrganizationLevel, OrganizationNode) WITH (DROP_EXISTING = ON);
GO
使用 DBCC DBREINDEX 启用禁用的索引
Note
将在 SQL Server 的未来版本中删除此功能。 避免在新开发工作中使用此功能,并计划修改当前使用此功能的应用程序。
执行以下 Transact-SQL 脚本。 此示例在 IX_Employee_OrganizationLevel_OrganizationNode 表上启用 HumanResources.Employee 索引。
USE AdventureWorks2022;
GO
DBCC DBREINDEX ("HumanResources.Employee", IX_Employee_OrganizationLevel_OrganizationNode);
GO
使用 ALTER INDEX 在表上启用所有索引
执行以下 Transact-SQL 脚本。 此示例启用 HumanResources.Employee 表上的所有索引。
USE AdventureWorks2022;
GO
ALTER INDEX ALL
ON HumanResources.Employee REBUILD;
GO
使用 DBCC DBREINDEX 在表上启用所有索引
Note
将在 SQL Server 的未来版本中删除此功能。 避免在新开发工作中使用此功能,并计划修改当前使用此功能的应用程序。
执行以下 Transact-SQL 脚本。 此示例启用 HumanResources.Employee 表上的所有索引。
USE AdventureWorks2022;
GO
DBCC DBREINDEX ("HumanResources.Employee", " ");
GO