在IBM DB2中使用reorg命令有什么用?

时间:2010-08-05 17:45:53

标签: sql db2 ddl reorganize

在ibm db2 db中使用reorg命令有什么用? Reorg在内部做什么? 如果在表上创建新索引,是否有必要运行reorg?

3 个答案:

答案 0 :(得分:3)

REORG操作执行以下功能:

  • 检查参照完整性(如果适用于目标表),并删除违反它的行或使任何受影响的索引无效。 (参照完整性是表中的每个外键值作为引用表中的主键值存在的关系属性。

  • 对表(所有类型)的一个或多个索引执行内部重组,以改善此信息的内部存储,从而改善索引用于访问数据时的性能。它可以重建所有索引,有选择地重建一个或多个命名索引,或者有选择地重建一个或多个命名索引的一个或多个段。

  • 填充使用CREATE INDEX语句创建的DEFERRED索引。 DEFERRED索引是一个空索引结构,可以在以后填充。

  • 重建预先计算的视图。例如,如果应用程序中的预计算视图维护设置为OFF,则可以使用REORG命令仅重建预计算视图,而无需触及目标表上的索引。或者,您可以使用REORG命令重建索引和视图。

除了重建聚合表数据外,REORG命令还会在聚合表上重建索引。

在以下情况下需要进行REORG操作:

  • 如果使用数据库还原操作还原表或索引的各个段,则重建受影响的索引。

  • 每当对数据库的修改影响超过大约30%的数据时,对于直接修改的任何表,使用REORG语句运行TMU。使用REORG语句定期重建此类表和索引可确保参照完整性和最佳性能。

  • 重组无效的STAR索引。某些操作可能使STAR索引无效。例如,增加表上的MAXROWS PER SEGMENT或MAXSEGMENTS参数,或使用ALTER语句扩展段,可以使引用已更改表的表上的STAR索引无效。这些操作总是生成一条警告消息,指出基于更改的表的STAR索引可能无效,在这种情况下,需要重新组织受影响的STAR索引。您可以在发出消息时重新组织受影响的索引,也可以在更方便的时间安排REORG操作。但是,对具有无效索引的表的任何非查询(INSERT,UPDATE或DELETE)操作都会导致出现错误消息,指出必须重新组织索引。在为INSERT,UPDATE,DELETE或LOAD操作访问表之前,必须执行REORG操作。

在以下情况下不需要REORG:

  • 如果没有对数据库进行任何更改,除非是完整的数据加载。

  • 如果表和索引是相同的分段,并且新索引数据被加载到与新表段对应的新索引段中。

答案 1 :(得分:1)

当您删除(至少对于iSeries)DB2中的记录(或行)时,它会标记要删除的记录,但不会物理删除记录。运行reorg时,会将那些标记为删除的记录删除,然后进行物理删除。我相信它也会移动所有数据记录,以便在此过程中获得最佳性能。在iSeries上,通过告诉文件(或表)重用删除记录,可以使这种需求过时。

正如我所暗示的那样,我知道DB2 for iSeries(或IBM i)就是这种情况。我只能假设这个过程在DB2上类似。

答案 2 :(得分:0)

它实际上做的是将物理记录放回主键顺序,并在正确的位置使用正确的可用空间量(由PCTFREE指定)。

显然,这也需要重建索引,这会产生很好的平衡btree。