确定何时重组表和索引
行的溢出情况
溢出值表示在原始页中放不下的行数。 要监视溢出值,请查询 SYSSTAT.TABLES 视图中的 OVERFLOW 列。 当可变长度列导致记录长度扩展到某个程度,以致于某一行在数据页上分配给它的位置中放不下时,该行的数据将溢出。 如果对表添加列,那么还会发生长度更改。 在这种情况下,指针会保留在行中的原始位置,而值会存储在指针所指示的另一位置。 这可能会影响性能,因为数据库管理器必须根据该指针来查找该列的内容。 这个包括两个步骤的过程增加了处理时间,并且还可能增加所需执行的 I/O 次数。 重组表数据将消除所有行溢出情况。
如果压缩了行并然后进行更新,可能会发生溢出。 如果已更新行无法再被压缩,或者已更新压缩行变得更长,那么会发生此溢出。
访存统计信息
要确定按索引顺序访问表时预取程序的效率,请查询 SYSSTAT.INDEXES 目录视图中的以下列。 这些列中的统计信息体现对底层表执行预取程序时的平均性能特征。
AVERAGE_SEQUENCE_FETCH_PAGES 列存储可以按顺序访问的平均页数。 可以按顺序访问的页适合于预取。 数目较小表明预取程序未充分发挥作用,原因是它们无法读入由表空间的 PREFETCHSIZE 值指定的所有页数。 较大的数指示预取程序将有效地执行。 对于集群索引和表,该数字应接近 NPAGES 的值,即包含行的页数。
AVERAGE_RANDOM_FETCH_PAGES 列存储使用索引来访存表行时,在两次顺序页访问之间访存的随机表页的平均数目。 当大多数页面按顺序排列时,预取程序会忽略少量随机页面,并继续预取到配置的预取大小。 当表变得更加混乱时,随机访存页数就会增加。 这种混乱情况通常是由于在表末尾或溢出页中执行无序的插入所致,当使用索引来访问某个范围的值时,查询性能将受影响。
AVERAGE_SEQUENCE_FETCH_GAP 列存储使用索引访存表行时表页序列之间的平均间隔。 此间隔是通过扫描索引叶子页进行检测的,每个间隔都表示在各个表页序列之间必须随机访存的表页的平均数目。 随机访问许多页时就会发生这种情况,从而中断预取程序。 数目较大表明表比较混乱或者对于索引而言集群情况较差。
包含已被标记为“已删除”但尚未被移除的记录标识 (RID) 的索引叶子页的数目
将 RID 标记为“已删除”时,通常不会以物理方式将其删除。 这意味着,可用空间可能会被这些在逻辑上已被删除的 RID 占用。 要检索其中每个 RID 都被标记为“已删除”的叶子页的数目,请查询 SYSSTAT.INDEXES 视图的 NUM_EMPTY_LEAFS 列。 对于并非其中所有 RID 都被标记为“已删除”的叶子页,在逻辑上已被删除的 RID 的总数存储在 NUMRIDS_DELETED 列中。
使用此信息可通过发出带有 CLEANUP ALL 选项的 REORG INDEXES 命令来估算可回收的空间量。 要仅回收页面中标记为已删除所有 RID 的空间,请发出带有 CLEANUP PAGES 选项的 REORG
INDEXES 命令。
索引的集群比率和集群因子统计信息
通常,表只有一个索引可以具有较高的集群度。 集群比率统计信息存储在 SYSCAT.INDEXES 目录视图的 CLUSTERRATIO 列中。 此值 (0-100) 表示索引中的数据集群程度。 如果收集详细的索引统计信息,那么在 CLUSTERFACTOR 列中将存储较详细的集群因子统计信息(介于 0 与 1 之间),并且 CLUSTERRATIO 列的值为 -1。 在这两种集群统计信息中,只有一种可以记录在 SYSCAT.INDEXES 目录视图中。 要将 CLUSTERFACTOR 值与 CLUSTERRATIO 值进行比较,请将 CLUSTERFACTOR 值乘以 100 以获得一个百分比值。
在索引密度较高的情况下,并非只访问索引的索引扫描可能执行得更好。 低密度会导致此类型的扫描执行更多的 I/O,这是因为再次访问数据页时,该数据页仍在缓冲池中的可能性较小。 增大缓冲区可以改进低密度索引的性能。 如果启用了智能索引预取,那么它还可以提高低密度索引的性能,这将减少对索引发出 REORG 命令的需求。 智能索引预取通过每当存在低密度索引时就从顺序检测预取切换至提前读预取来实现此目标。
如果表数据最初根据某个索引进行集群,并且集群统计信息表明数据现在的集群情况相对于该索引而言并不好,那么您可能想重组该表以便再次对数据进行集群。 此外,如果启用了智能数据预取,那么可以提高集群情况不佳的数据的性能,这将减少对表发出 REORG 命令的需求。 智能数据预取通过每当存在低集群数据页时就从顺序检测预取切换至提前读预取来实现此目标。
叶子页的数目
要确定索引占用的叶子页数,请查询 SYSCAT.INDEXES 视图中的 NLEAF 列。 此数目指示对索引进行完整扫描所需执行的索引页 I/O 次数。
理想情况下,索引所占用的空间量应该尽可能少,以便减少索引扫描所需执行的 I/O 次数。 随机的更新活动会导致页分割,从而增大索引大小。 在表 REORG 操作期间,可以重建每个索引并使其占用的空间量最少。
缺省情况下,构建索引时,将在每个索引页中保留 10% 的可用空间。 要增加可用空间量,请在创建索引时指定 PCTFREE 选项。 每当重组索引时,都将使用指定的 PCTFREE 值。 大于 10% 的可用空间值可以降低索引重组频率,这是因为,有额外的空间可以容纳所插入的附加索引内容。
空数据页的数目
要计算表中的空页数,请查询 SYSCAT.TABLES 视图中的 FPAGES 和 NPAGES 列,然后将 FPAGES 值(使用中的总页数)减去 NPAGES 值(包含行的页数)。 空页可能是因为您删除整个范围的行而产生的。
随着空页数的增加,就需要进行表重组。 重组表时,将回收空页并减少表所使用的空间量。 另外,因为表扫描期间会将空页读入缓冲池,所以回收未使用的页可以提高扫描性能。
Table reorganization is not recommendedif the following equation evaluates to true: the total number of in-use pages (specified in the FPAGES column) in a table <= (NPARTITIONS x 1 extent size). NPARTITIONS 表示数据分区数 (如果该表是分区表); 否则,其值为 1。
In a partitioned database environment, table reorganization is not recommended if the following equation evaluates to true: value of the FPAGES column <= (the number of database partitions in a database partition group of the table) x (NPARTITIONS x 1 extent size).