行链接
当第一次插入行时,由于行太长而不能容纳在一个数据块中时,就会发生行链接。在这种情况下,oracle会使用与该块链接的一块或多块数据块来容纳该行的数据。行连接经常在插入比较大的行时才会发生,如包含long, long row, lob等类型的数据。在这些情况下行链接是不可避免的。
行迁移
当修改不是行链接的行时,当修改后的行长度大于修改前的行长度,并且该数据块中的空闲空间已经比较小而不能完全容纳该行的数据时,就会发生行迁移。在这种情况下,Oracle会将整行的数据迁移到一个新的数据块上,而将该行原先的空间只放一个指针,指向该行的新的位置,并且该行原先空间的剩余空间不再被数据库使用,这些剩余的空间我们将其称之为空洞,这就是产生表碎片的主要
少量的行链接不会对性能有很大的影响,一个大致准则是如果表中超过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.创建一个临时表保存原来存储行链接的行
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;
时间: 2024-10-10 15:23:19