行链接
当第1次插入行时,由于行太长而不能容纳在1个数据块中时,就会产生行链接。在这类情况下,oracle会使用与该块链接的1块或多块数据块来容纳该行的数据。行连接常常在插入比较大的行时才会产生,如包括long, long row, lob等类型的数据。在这些情况下行链接是不可避免的。
行迁移
当修改不是行链接的行时,当修改后的行长度大于修改前的行长度,并且该数据块中的空闲空间已比较小而不能完全容纳该行的数据时,就会产生行迁移。在这类情况下,Oracle会将整行的数据迁移到1个新的数据块上,而将该行本来的空间只放1个指针,指向该行的新的位置,并且该行本来空间的剩余空间不再被数据库使用,这些剩余的空间我们将其称之为空洞,这就是产生表碎片的主要
少许的行链接不会对性能有很大的影响,1个大致准则是如果表中超过15%的数据行是行链接的,那末就要注意了
可以再MOVE同时设置更高的PCTFREE
alter table emp move picture 40
使用ANALYZE命令查看行链接情况
@?/rdbms/admin/utlchain.sql
上面的脚本创建了名为chained_rows的表,现在可以运行ANALYZE命令,填充该表
analyze table emp list chain rows;
接下来查询chain_rows表
select count(*) from chained_rows where table_name=‘EMP’;
消除行链接:
1.创建1个临时表保存原来存储行链接的行
2.从原始表中删除连接的行
3.将临时表中的数据行插入到原始表中
create table temp_emp as select * from emp where rowid in(select headword from chained_rows where table_name=‘EMP’);
delete from emp where rowid in(select headword from chained_rows where table_name=‘EMP’);
insert into emp select * from temp_emp;