行迁移及行链接

对于oracle的一个block来说,分为三块,数据块头(header)自由空间(free space)和实际数据空间,当数据插数bolck时会有三种情况,一种是正常插入,一种是行迁移,一种是行链接
行链接一般发生在插入时,这时一个block不足以存储一行数据,这时就会链接其它block来存储,导致行链接
行迁移一般发生在修改数据时,这时剩余的自由空间不足以保证数据更新时需求的空间,这时就会把数据迁移到新的block中(前提是一个block能放的下),导致行迁移

 

测试库测试行迁移/行链接
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as yuzh

 

建一张大表
SQL> create table testaaa (axx int primary key,aaa char(2000),bbb char(2000),ccc char(2000),ddda char(2000),eee char(2000));

Table created

SQL> select * from testaaa;

AXX AAA  BBB   CCC     DDDA    EEE
--- ---- ----- ------- ------- ---

 

插入一条空记录
SQL> insert into testaaa(axx) values(1);

1 row inserted

SQL> commit;

Commit complete

 

查看表的block的id

SQL> select dbms_rowid.rowid_block_number(rowid) from testaaa;

DBMS_ROWID.ROWID_BLOCK_NUMBER(
------------------------------
                            16

 

输出udump目录trac日志

SQL> alter system dump datafile 7 block 16;

System altered

 

查看日志如下:

flag=--------
ntab=1
nrow=1
frre=-1
fsbo=0x14
fseo=0x1f92
avsp=0x1f7b
tosp=0x1f7b
0xe:pti[0] nrow=1 offs=0
0x12:pri[0] offs=0x1f92
block_row_dump:
tab 0, row 0, @0x1f92
tl: 6 fb: --H-FL-- lb: 0x1  cc: 1
col  0: [ 2]  c1 02
end_of_block_dump

 

更新记录使之超过8k限制
SQL> update testaaa set aaa='111111',bbb='111111',ccc='11111',ddda='1',eee='11111';

1 row updated

SQL> commit;

Commit complete

SQL> select * from testaaa;

 AXX AAA      BBB     CCC    DDDA  EEE
---- -------- ------- ------ ----- -----
   1 111111   111111  11111  1     11111
SQL> alter system dump datafile 7 block 16;

System altered

 

再查看日志:

flag=--------
ntab=1
nrow=1
frre=-1
fsbo=0x14
fseo=0x1782
avsp=0x1774
tosp=0x1774
0xe:pti[0] nrow=1 offs=0
0x12:pri[0] offs=0x1782
block_row_dump:
tab 0, row 0, @0x1782
tl: 2064 fb: --H-F--N lb: 0x2  cc: 3
nrid:  0x01c0000c.0
col  0: [ 2]  c1 02
col  1: [2000]

 

可以看出下一个的rowid的nrid出来了

 

如何得到哪些表行迁移或行链接的

执行脚本生成分析表

SQL> @H:/oracle/product/10.2.0/db_1/RDBMS/ADMIN/utlchain.sql;

Table created

分析是否行迁移或链接了

SQL> analyze table testaaa list chained rows into chained_rows;

Table analyzed

查看结果

SQL> select * from  chained_rows;

OWNER_NAME  TABLE_NAME  CLUSTER_NAME  PARTITION_NAME SUBPARTITION_NAME HEAD_ROWID         ANALYZE_TIMESTAMP
----------- ----------- ------------- -------------- ----------------- ------------------ -----------------
YUZH        TESTAAA                                  N/A               AAAMnmAAHAAAAAQAAA 2010-2-26 12:20:4

想得到所有表的状况运行

select 'analyze table '||table_name||' list chained rows into chained_rows; ' from user_tables;

 

 

想一般要想从源头根治行迁移或链接,只能是从建表时开始设定自由空间和数据空间比例,合适的比例会减少行迁移的可能

然后就是表字段的大小类型设计,像上面例子中建表不管怎样都得超过一个block大小,这时不对的,所以字段要设置合理

 

清除行迁移方法:

1:根据表chained_rows记录来处理

根据rowid提取数据插入临时表,然后删除原表数据,最后把临时表数据重新插入。

2:表的备份然后重建

3:exp/imp导入导出

4:移动表到其它表空间

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值