攻略1-14 区分行迁移和行链接

问题描述

你想要确认到底是存在行迁移还是行链接问题。这将会影响到解决问题的策略。例如,如果出现的是由于记录太长,无法容纳在一个数据块的空闲空间中而导致的行链接问题,那也没有什么好办法。但是,行迁移问题可以通过移动表来解决。

解决方案

有三种基本的方法来区分行链接和行迁移。

 重新组织表(例如移动表)总是能够解决行迁移问题,但有时可能解决不了行链接问题。因此要想区分行迁移和行链接,可以重新组织表,然后计算统计信息。如果在CHAIN_CNT列中还有值,则这些是不能通过移动表来解决的行链接。在执行移动运算的时候,可以考虑将PCTFREE设置为更小的值。 
 分析表并将ROWID记录在CHAINED_ROWS表中,然后基于ROWID单独移动那一行具有行迁移或行链接的数据。重复该步骤,新填充到CHAINED_ROWS表中的数据行就具有行链接问题。 
 计算每一行的长度。如果这个长度比空数据块中可用的空闲空间还要大,则很有可能产生行链接问题。如果这个长度比空数据块中可用的空闲空间小,则可能存在的是行迁移问题。 
前两点已经在攻略1-12中进行了讨论。对于最后一点,可以通过将所有列的长度相加,来手工计算出数据行的长度。例如:

enter image description here

数据行长度比空闲数据块的大小还要大的时候,就很有可能出现的是行链接问题。

工作原理

手工计算数据行的长度是到目前为止最准确的区分出现的是行链接还是行迁移问题的方法。如果一行数据的长度接近于数据块空闲空间,则可能无法避免行链接的发生。如果数据行的长度比数据块空闲空间要小得多,则很可能是出现了行迁移,可以通过移动表来解决(参考攻略1-12)。

提示 考虑使用Oracle的压缩选项来实现每个数据块能容纳的数据行的最大化(更多详情,参见攻略1-20和攻略1-21)。

目录