Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - SQL 参考 » 使用 SQL » SQL 语句 » SQL 语句 (P-Z)

 

REORGANIZE TABLE 语句

当由于需要连续访问数据库而不可能完全重建数据库时,此语句对表做碎片整理。

语法
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 子句打开的使用语句快照或事务快照的游标时,不能执行此语句。请参见快照隔离

权限
  • 必须是表的所有者,或是具有 DBA 权限的用户。

  • Windows Mobile 上不支持。

副作用

在开始重组之前,会执行一个检查点操作以设法得到尽可能多的空闲页。此外,当执行 REORGANIZE TABLE 语句时,大约每 100 行会执行一次隐式提交,因此重组大表时会发生多次提交。

标准和兼容性
  • SQL/2003   服务商扩充。

示例

以下语句重组 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;