【发布时间】:2010-08-05 17:45:53
【问题描述】:
ibm db2 db 中 reorg 命令有什么用? Reorg 在内部做什么? 如果在表上创建了新索引,是否需要运行 reorg ?
【问题讨论】:
-
我投票结束这个问题,因为它不是关于编程的。
标签: sql db2 ddl reorganize
ibm db2 db 中 reorg 命令有什么用? Reorg 在内部做什么? 如果在表上创建了新索引,是否需要运行 reorg ?
【问题讨论】:
标签: sql db2 ddl reorganize
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)操作都会导致错误消息指出必须重新组织索引。您必须先执行 REORG 操作,然后才能访问表以进行 INSERT、UPDATE、DELETE 或 LOAD 操作。
在以下情况下不需要 REORG:
如果没有对数据库进行更改,除非完全加载数据。
如果表和索引被类似分段并且新索引数据被加载到与新表段对应的新索引段中。
【讨论】:
当您删除(至少对于 iSeries 而言)DB2 中的一条记录(或行)时,它会将记录标记为要删除,但不会实际删除该记录。运行 reorg 时,它会获取那些标记为删除的记录,然后将它们物理删除。我相信它还会移动所有数据记录,以便在此过程中获得最佳性能。在 iSeries 上,可以通过告诉文件(或表)重用删除记录来消除这种需求。
正如我所暗示的,我知道 DB2 for iSeries(或 IBM i)就是这种情况。我只能假设这个过程在 DB2 上是类似的。
【讨论】:
它实际上所做的是将物理记录放回主键顺序,并在正确的位置使用正确数量的可用空间(由 PCTFREE 指定)。
显然,这也需要重建索引,从而产生平衡良好的 btree。
【讨论】: