行连接(row chaining):指一行存储在多个块中的情况,这是因为该行的长度超过了一个块的可用空间大小,即行链接是跨越多块的行。

行迁移(row migrate):当一行的记录初始插入时是可以存储在一个block中的,由于更新操作导致行增加了,而block的自由空间已经完全满了,这个时候就产生了行迁移。在这种情况下,oracle将会把整行数据迁移到一个新的block中(假设一个block中可以存储下整行数据),oracle会保留被迁移的行的原始指针指向新的存放行数据的block,这就意味着被迁移行的ROW ID是不会改变的指一个数据行不适合放入当前块而被重新定位到另一个块(那里有充足的空间)中,但在原始块中保留一个指针的情形。原始块中的指针是必需的,因为索引的ROWID项仍然指向原始位置


三.行迁移(Row Chaining)与行链接(Row Migration)的清除

         行链接主要是由于数据库的db_block_size不够大,对于一些大的字段没法在一个block中存储下而产生的。对于行链接,除了增大db_block_size之外没有别的任何办法避免,但是因为数据库建立后db_block_size是不可以改变的(9i以前),对于oracle 9i数据库意义对不同的表空间指定不同的db_block_size,因此行链接的产生几乎是不可避免的,也没有太多可以调整的地方。行迁移主要是由于更新表的时候,由于block上的PCTFREE参数设置过小所置,要实现控制行迁移的增长,就必须设置一个合理的PCTFREE参数,否则即使清除了当前的行迁移后马上又会产生新的行迁移。如果PCTFREE参数设置过大则会导致block的利用率低,大量的空间浪费。如何设置一个合理的PCTFREE值有两种方法可参考:

         1.定量设定法:

           就是利用公式来设定PCTFREE的大小,选使用ANALYZE TABLE table_name ESTIMATE STATISTICS命令来分析要修改的PCTFREE的表,然后查看user_table中的AVG_ROW_LEN列值,得到第一个平均长度AVG_ROW_LEN1,然后大量的操作以后,再次得到第二个平均长度AVG_ROW_LEN2,然后用公式:100*(AVG_ROW_LEN2-AVG_ROW_LEN1)/(AVG_ROW_LEN2-AVG_ROW_LEN1+AVG_ROW_LEN) 的出的结果就是定量计算出来的一个合适的PCTFREE数值。这种方法因为是定量计算出来的,不一定会准确,而且因为要分析表,所以对于使用RBO执行计划的系统不是很适用,例如,AVG_ROW_LEN1=60。AVG_ROW_LEN2=70,则平均修改量为10,PCTFREE应该调整为100*10/(10+60)=16.7%。

         2.差分微调法:

           先查询到当前的PCTFREE值,然后监控和调整PCTFREE参数,每次增加一点PCTFREE的大小,每次增加的比例不要超过5个百分点,然后使用ANALYZE TABLE table_name LIST CHAINED ROWS INTO chained_rows命令分析每次所有的行迁移和行连接的增长情况,对于不同的表采取不同的增长比例,对于行迁移增长的比较快的表的PCTFREE值就增加的多点,对于增加的慢的表的PCTFREE值增加少点,知道表的行迁移基本保持不增长为止。但是PCTFREE不应该增加的过大,一般在40%以下就可以了,否则就会造成空间的很大浪费和增加数据库访问I/O。