DBCC INDEXDEFRAG (Transact-SQL)

更新日期: 2006 年 4 月 14 日

指定表或视图的索引碎片整理。

ms177571.note(zh-cn,SQL.90).gif重要提示:
后续版本的 Microsoft SQL Server 将删除该功能。请避免在新的开发工作中使用该功能,并着手修改当前还在使用该功能的应用程序。 改用 ALTER INDEX

主题链接图标Transact-SQL 语法约定

语法

DBCC INDEXDEFRAG
(
    { database_name | database_id | 0 } 
        , { table_name | table_id | view_name | view_id } 
    [ , { index_name | index_id } [ , { partition_number | 0 } ] ]
)
    [ WITH NO_INFOMSGS ] 

参数

  • database_name | database_id | 0
    对其索引进行碎片整理的数据库。如果指定 0,则使用当前数据库。数据库名称必须符合标识符规则。
  • table_name | table_id | view_name | view_id
    对其索引进行碎片整理的表或视图。表和视图的名称必须符合标识符规则。
  • index_name | index_id
    要进行碎片整理的索引的 ID 的名称。如果未指定,该语句就对指定表或视图的所有索引进行碎片整理。索引名称必须符合标识符规则。
  • partition_number | 0
    要进行碎片整理的索引的分区号。如果未指定或指定 0,该语句将对指定索引的所有分区进行碎片整理。
  • WITH NO_INFOMSGS
    取消严重级别从 0 到 10 的所有信息性消息。

结果集

如果在语句中指定索引(除非指定了 WITH NO_INFOMSGS),DBCC INDEXDEFRAG 返回以下结果集(值可能不同):

Pages Scanned Pages Moved Pages Removed
------------- ----------- -------------
359           346         8

(1 row(s) affected)

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

备注

DBCC INDEXDEFRAG 对索引的叶级进行碎片整理,以便页的物理顺序与叶节点从左到右的逻辑顺序相匹配,因此可提高索引扫描性能。

ms177571.note(zh-cn,SQL.90).gif注意:
运行 DBCC INDEXDEFRAG 时,索引碎片整理是串行进行的。这表示对单个索引的操作是使用单个线程执行的。没有发生并行操作。同样,在同一个 DBCC INDEXDEFRAG 语句中对多个索引的操作是一次对一个索引执行的。

DBCC INDEXDEFRAG 还压缩索引页,并考虑创建索引时指定的填充因子。任何因这种压缩而创建的空页将被删除。有关详细信息,请参阅填充因子

如果索引跨越多个文件,则 DBCC INDEXDEFRAG 一次对一个文件进行碎片整理。页不在文件之间迁移。

DBCC INDEXDEFRAG 每五分钟就报告完成的估计百分比。可在进程中的任一点停止 DBCC INDEXDEFRAG,任何已完成的工作都将保留。

与 DBCC DBREINDEX(或通常的索引生成操作)不同,DBCC INDEXDEFRAG 是联机操作。它不长期保持锁。因此,DBCC INDEXDEFRAG 不会阻塞运行查询或更新。因为碎片整理所需的时间与碎片整理的级别相关,若索引的碎片相对较少,则该索引的碎片整理速度比生成一个新索引要快。对碎片太多的索引进行整理可能要比重建索引花更多的时间。

始终对碎片整理进行完整的日志记录,与数据库恢复模式设置无关。有关详细信息,请参阅 ALTER DATABASE (Transact-SQL)。对碎片太多的索引进行整理所生成的日志可能比完全记录的索引创建多。但是,碎片整理是作为一系列短事务执行的,因此,如果经常进行日志备份或将恢复模式设置为 SIMPLE,则不需要大日志。

DBCC INDEXDEFRAG 打乱了已有的索引叶级页。因此,如果索引与磁盘上的其他索引交叉,则针对该索引运行 DBCC INDEXDEFRAG 不使索引中的所有叶级页连续。若要改善页的聚集,请重建索引。

DBCC INDEXDEFRAG 不能用于对禁用的索引或页锁定设置为 OFF 的索引进行碎片整理。不支持对系统表使用 DBCC INDEXDEFRAG。

权限

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

示例

以下示例对 AdventureWorks 数据库的 Production.Product 表中的 PK_Product_ProductID 索引的所有分区进行碎片整理。

DBCC INDEXDEFRAG (AdventureWorks, "Production.Product", PK_Product_ProductID)
GO

请参阅

参考

DBCC (Transact-SQL)
sys.dm_db_index_physical_stats
CREATE TABLE (Transact-SQL)
ALTER TABLE (Transact-SQL)
ALTER INDEX (Transact-SQL)

其他资源

表和索引体系结构

帮助和信息

获取 SQL Server 2005 帮助

更改历史记录

版本 历史记录

2006 年 4 月 14 日

更改的内容:
  • 将索引和分区号子句显示为可选项,从而更正了语法。