行链接和行迁移

行链接和行迁移
1)什么是行链接和行迁移
①行链接:指一行存储在多个块中的情况,即行链接是跨越多块的行。
②行迁移:指一个数据行由于update语句导致当前块被重新定位到另一个块(那里有充足的空间)中,但在原始块中会保留一个指针。原始块中的指针是必需的,因         为索引的ROWID项仍然指向原始位置。
        行迁移是update语句当pctfree空间不足时引起的,它与insert和delete语句无关。

2)如何知道发生了行链接或行迁移
查看dba_tables的AVG_ROW_LEN列和CHAIN_CNT列。当CHAIN_CNT有值时,看AVG_ROW_LEN,它表示行的平均长度(byte),如果AVG_ROW_LEN<块大小,发生的是行迁 移,否则可能有行链接。

测试:
(一)行迁移
1、构建环境

f5c2dfd212aa56a57eec031d540468887ffa1dba

2、先分析一下test表,确定无行迁移
analyze table test compute statistics;
067cc7f2251856d248ba4dd922f233b7d720330d

可以观察到表test使用了5个块,行平均大小为3。
3、v$bh视图可以显示出t1表一共分配了8个块,具体是那些块。

4aa43209cac55cfc22c0be8299d7b58f618b31c2

4、填充这些空列,再分析test,有了行迁移

17e4054c0d42649010ec5b0593841864f035756a

说明1000行中有865行发生了行迁移,使用的块也增加了,从之前的5个增加到了13个。

5、怎样确定那些行发生了行迁移
SQL> @/u01/oracle/rdbms/admin/utlchain.sql
SQL> analyze table scott.t1 LIST CHAINED ROWS;
SQL> select count(*) from chained_rows;

1b517f8037a93ae44f5a346cb4509be6ce24354e

通过chained_rows表可以看到发生行迁移的列。
SQL> select table_name, HEAD_ROWID from chained_rows where rownum<=3;

bdcb11a51c0e7814f8e588eca70ac7bb0d48623c

Select dbms_rowid.ROWID_RELATIVE_FNO(rowid) fn,dbms_rowid.rowid_block_number(rowid) bn, rowid,c1 from test where rowid='AAASRpAAEAAAAE+AGl';
7f15500dcd655ee42f30f06977c2f44a69153147

6、解决行迁移的多方法
①移动表
  alter table test move;
17b94d759e2853e3f52c27ed0fa1aa6054eac477

②删除发生行迁移的行重新插入
SQL>create table test1 as select * from test where rowid in (select HEAD_ROWID from chained_rows);
SQL>delete test where rowid in (select HEAD_ROWID from chained_rows);
SQL>insert into test select * from test1;
SQL>drop table test1;
3a70256eadf823e589b2ca7ee848915cb9dbde51
896fe2fe5fba12d0e99a54f5caeda0f53b775621


(二)行链接
1、创建环境
SQL>create table t1 (c1 varchar2(3000),c2 varchar2(3000),c3 varchar2(3000));
SQL>insert into t1 values(lpad('a',3000,'*'),lpad('b',3000,'*'),lpad('c',3000,'*'));
SQL>commit;
SQL>analyze table t1 compute statistics;
SQL>select table_name, AVG_ROW_LEN,CHAIN_CNT from user_tables where table_name='T1';
8f73b963457aed6e7d09a20c84ed2c4b19bb7948

2、解决方法
SQL>create tablespace ttt datafile '/u01/oradata/vbox8db/ttt01.dbf' size 10m blocksize 16k;
SQL>alter table t1 move tablespace ttt;
SQL>analyze table t1 compute statistics;
SQL>select table_name, AVG_ROW_LEN,CHAIN_CNT from user_tables where table_name='T1';

3c8e82a56a2bed52fa7a6f22dac2de797aabfae9


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值