Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.
当由于需要连续访问数据库而不可能完全重建数据库时,对表做碎片整理。
REORGANIZE TABLE [ owner.]table-name [ { PRIMARY KEY | FOREIGN KEY foreign-key-name | INDEX index-name } ]
根据下面其中一项的值重组表:
PRIMARY KEY 子句 重组表的主键索引。
FOREIGN KEY 子句 重组指定的外键。
INDEX 子句 重组指定的索引。
表碎片可能会降低性能。使用该语句可对一个表中的行进行碎片整理,或压缩由于 DELETE 变得稀疏的索引。它还可以减少用于存储表及其索引的总页数,并且可以减少索引树中的级别数。但是,它不会使数据库文件的总大小减少。建议使用 sa_table_fragmentation 和 sa_index_density 系统过程选择值得处理的表。
如果未指定索引或键,则重组过程通过删除和重新插入行组来整理表中的行碎片。要为每个组获取表的独占锁。处理完组后,立即释放并重新获取锁(必要时需等待),为其它连接提供访问表的机会。处理组时,检查点操作挂起;处理完组后,可能会发生检查点操作。行按聚簇索引(如果存在)的顺序进行处理;如果没有聚簇索引,则按主键的顺序进行处理。如果表没有聚簇索引或主键,则会返回错误。经过处理的行重新插入到表的末尾,这使得行在处理结束时按主键聚簇。注意,无论行最初的破碎程度如何,所需的工作量是相同的。
如果指定了索引或键,则处理指定的索引。在操作期间,保持表的独占锁并挂起检查点操作。其它连接对表的任何访问尝试都将阻塞或失败,具体取决于它们的 blocking 选项设置。通过在获取独占锁之前预读取索引页,可以尽可能缩短锁定期限。
由于重组操作可能会修改许多页,检查点日志可能会变得很大。这可能导致数据库文件大小的增加。但是,这只是暂时增大,因为检查点日志在关闭时会被删除,且文件此时也会被截断。
此语句不会记录到事务日志中。
当存在使用 WITH HOLD 子句打开的使用语句快照或事务快照的游标时,不能执行此语句。
在执行此语句期间,可以请求进度消息。
也可以使用 Progress 连接属性确定语句的执行进度。
必须是表的所有者,或是具有 DBA 权限的用户。
Windows Mobile 上不支持。
在开始重组之前,会执行一个检查点操作以设法得到尽可能多的空闲页。此外,当执行 REORGANIZE TABLE 语句时,大约每 100 行会执行一次隐式提交,因此重组大表时会发生多次提交。
SQL/2008 服务商扩充。
以下语句重组 Employees 表的主键索引:
REORGANIZE TABLE Employees PRIMARY KEY;
以下语句重组 Employees 表的表页:
REORGANIZE TABLE Employees;
以下语句重组 Products 表的 IX_product_name 索引:
REORGANIZE TABLE Products INDEX IX_product_name;
以下语句重组 Employees 表的 FK_DepartmentID_DepartmentID 外键:
REORGANIZE TABLE Employees FOREIGN KEY FK_DepartmentID_DepartmentID;