行迁移:
Oracle的数据块会保留部分空间供之后更新使用。
PCTFREE定义一个块保留的空间百分比,默认是10,表示当数据块的可用空间低于10%后,就不能够被insert了,只能被update(具体看下面的PCTFREE介绍)。
当一条记录被更新时,数据库引擎首先会尝试在它保存的数据块中寻找足够的空闲空间,若是没有足够的空闲空间可用,这条记录将被拆分为两个部分,第一个部分进包括指向第二个部分的rowid,该部分任然保留在原来的数据块中,第二个部分包含全部的具体数据,将保存到另一个新的数据块中,这个就成为行迁移。
行连接:
行连接和行迁移不一样,行连接是当一条记录太大,在一个数据块中没法存入,这时会被拆分为2个或以上的部分,存储在多个块中,这多个块之间会构造一个链。
行迁移是因为更新致使的,而行连接的缘由则可能为:
1)直接插入大的记录;
2)更新记录致使记录大于一个数据块,在这时,这样记录可能会同时变为行迁移和行连接。
带来的问题:
行迁移不会影响全扫描,由于第一个部分不包含数据,会被直接跳过;但对于经过rowid进行访问(索引扫描或者直接使用rowid查询),则开销会翻倍,主要因为一次读取须要访问两个块。
行连接则和数据访问方式无关,每次访问到第一个记录片断以后,都须要经过rowid去访问其余的记录片断。
行迁移和行连接也会影响行级锁,由于每一个记录片断都须要持有锁,锁的开销和记录片断的个数的增加成正比。
分析:
$ORACLE_HOME/rdbms/admin/UTLCHAIN.SQL建立表
analyze table <table_name> list chained rows(会锁表)
select table_name,head_rowid from CHAINED_ROWS;
解决:
行迁移:
1.将迁移的数据复制到临时表中,在原表上删除再从新插入这些数据
2.经过导出、导入或者ALTER TABLE MOVE对表进行重整;
行连接:
只能经过修改块大小来解决。可经过将常常访问的字段放在前面,不常常访问的字段放在后面,以提高数据访问性能。数据库