DBCC DBREINDEX (Transact-SQL)
适用于: SQL Server Azure SQL 托管实例
对指定数据库中的表重新生成一个或多个索引。
重要
在 SQL Server的未来版本中将删除此功能。 请避免在新的开发工作中使用该功能,并着手修改当前还在使用该功能的应用程序。 请改用 ALTER INDEX。
适用于:SQL Server 2008 (10.0.x) 及更高版本。
语法
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 INDEX
和 CREATE INDEX
语句进行编码更容易。 由于这项工作是通过一条语句执行的,因此 DBCC DBREINDEX
自动成为原子性的,而单个 DROP INDEX
和 CREATE INDEX
语句则必须包含在事务中才能成为原子性的。 此外,DBCC DBREINDEX
提供了比单个 DROP INDEX
和 CREATE INDEX
语句更多的优化性能。
与带有 REORGANIZE
选项的 DBCC INDEXDEFRAG
或 ALTER 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_EmployeeID
对 80
数据库中的 Employee
表重新生成 AdventureWorks2022
聚集索引。
USE AdventureWorks2022;
GO
DBCC DBREINDEX ('HumanResources.Employee', PK_Employee_BusinessEntityID, 80);
GO
B. 重新生成所有索引
以下示例使用填充因子值 Employee
对 AdventureWorks2022
中的 70
表重新生成所有索引。
USE AdventureWorks2022;
GO
DBCC DBREINDEX ('HumanResources.Employee', ' ', 70);
GO