行鏈接
當(dāng)?shù)?次插入行時,由于行太長而不能容納在1個數(shù)據(jù)塊中時,就會產(chǎn)生行鏈接。在這類情況下,oracle會使用與該塊鏈接的1塊或多塊數(shù)據(jù)塊來容納該行的數(shù)據(jù)。行連接常常在插入比較大的行時才會產(chǎn)生,如包括long, long row, lob等類型的數(shù)據(jù)。在這些情況下行鏈接是不可避免的。
行遷移
當(dāng)修改不是行鏈接的行時,當(dāng)修改后的行長度大于修改前的行長度,并且該數(shù)據(jù)塊中的空閑空間已比較小而不能完全容納該行的數(shù)據(jù)時,就會產(chǎn)生行遷移。在這類情況下,Oracle會將整行的數(shù)據(jù)遷移到1個新的數(shù)據(jù)塊上,而將該行本來的空間只放1個指針,指向該行的新的位置,并且該行本來空間的剩余空間不再被數(shù)據(jù)庫使用,這些剩余的空間我們將其稱之為空洞,這就是產(chǎn)生表碎片的主要
少許的行鏈接不會對性能有很大的影響,1個大致準(zhǔn)則是如果表中超過15%的數(shù)據(jù)行是行鏈接的,那末就要注意了
可以再MOVE同時設(shè)置更高的PCTFREE
alter table emp move picture 40
使用ANALYZE命令查看行鏈接情況
@?/rdbms/admin/utlchain.sql
上面的腳本創(chuàng)建了名為chained_rows的表,現(xiàn)在可以運行ANALYZE命令,填充該表
analyze table emp list chain rows;
接下來查詢chain_rows表
select count(*) from chained_rows where table_name=‘EMP’;
消除行鏈接:
1.創(chuàng)建1個臨時表保存原來存儲行鏈接的行
2.從原始表中刪除連接的行
3.將臨時表中的數(shù)據(jù)行插入到原始表中
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;