您的位置:首页 > 其它

行迁移及行链接

2010-02-26 11:59 134 查看
对于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:移动表到其它表空间
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: