DBCC DBREINDEX (Transact-SQL)

适用于: SQL Server Azure SQL 托管实例

对指定数据库中的表重新生成一个或多个索引。

重要

在 SQL Server的未来版本中将删除此功能。 请避免在新的开发工作中使用该功能,并着手修改当前还在使用该功能的应用程序。 请改用 ALTER INDEX

适用于:SQL Server 2008 (10.0.x) 及更高版本。

Transact-SQL 语法约定

语法

DBCC DBREINDEX
(
    table_name
    [ , index_name [ , fillfactor ] ]
)
    [ WITH NO_INFOMSGS ]

参数

table_name

包含指定索引或要重新生成的索引的表名称。 表名必须遵循有关标识符的规则。

index_name

要重新生成的索引的名称。 索引名称必须符合标识符规则。 如果已指定 index_name,则必须指定 table_name。 如果未指定 index_name 或者该值为 ' ',则重新生成表的所有索引。

fillfactor

在创建或重新生成索引时,每个索引页上用于存储数据的空间的百分比。 创建索引后,fillfactor 将替换填充因子,从而成为该索引以及重新生成的任何其他非聚集索引(因为重新生成了聚集索引)的新默认值。

当 fillfactor 为 0 时,DBCC DBREINDEX 将使用上次为索引指定的填充因子值。 该值存储在 sys.indexes 目录视图中sys.indexes

如果已指定 fillfactor,则必须指定 index_name。 如果未指定 fillfactor,则使用默认填充因子 100。 有关详细信息,请参阅 为索引指定填充因子

WITH NO_INFOMSGS

取消严重级别从 0 到 10 的所有信息性消息。

备注

DBCC DBREINDEX 重新生成表的一个索引或为表定义的所有索引。 通过允许动态重新生成索引,可以重新生成强制 PRIMARY KEY 或 UNIQUE 约束的索引,而不必删除并重新创建这些约束。 这意味着无需了解表的结构或其约束,即可重新生成索引。 这可能在将数据大容量复制到表中以后发生。

DBCC DBREINDEX 可以通过一条语句重新生成表的所有索引。 这要比对多条 DROP INDEXCREATE INDEX 语句进行编码更容易。 由于这项工作是通过一条语句执行的,因此 DBCC DBREINDEX 自动成为原子性的,而单个 DROP INDEXCREATE INDEX 语句则必须包含在事务中才能成为原子性的。 此外,DBCC DBREINDEX 提供了比单个 DROP INDEXCREATE INDEX 语句更多的优化性能。

与带有 REORGANIZE 选项的 DBCC INDEXDEFRAGALTER INDEX 不同,DBCC DBREINDEX 为脱机操作。 如果重新生成了非聚集索引,则在该操作期间,相关表持有共享锁。 这可以禁止对表进行修改。 如果重新生成了聚集索引,则持有排他表锁。 这可以禁止任何表访问,因此可以有效地使表脱机。 为了执行联机索引重新生成,或控制索引重新生成操作期间的并行度,可使用具有 ONLINE 选项的 ALTER INDEX REBUILD 语句。

有关选择方法来重新生成或重新组织索引的详细信息,请参阅重新组织和重新生成索引

限制

不支持在以下对象上使用 DBCC DBREINDEX

  • 系统表
  • 空间索引
  • 内存优化列存储索引

结果集

除非指定了 NO_INFOMSGS(必须指定表名),否则 DBCC DBREINDEX 将始终返回:

DBCC execution completed. If DBCC printed error messages, contact your system administrator.

权限

调用方必须拥有此表,或是 sysadmin 固定服务器角色、db_owner 固定数据库角色或 db_ddladmin 固定数据库角色的成员 。

示例

A. 重新生成索引

以下示例使用填充因子 Employee_EmployeeID80 数据库中的 Employee 表重新生成 AdventureWorks2022 聚集索引。

USE AdventureWorks2022;
GO
DBCC DBREINDEX ('HumanResources.Employee', PK_Employee_BusinessEntityID, 80);
GO

B. 重新生成所有索引

以下示例使用填充因子值 EmployeeAdventureWorks2022 中的 70 表重新生成所有索引。

USE AdventureWorks2022;
GO
DBCC DBREINDEX ('HumanResources.Employee', ' ', 70);
GO

另请参阅