行迁移及行链接
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:移动表到其它表空间
行链接一般发生在插入时,这时一个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:移动表到其它表空间
相关文章推荐
- 关于Oracle数据库中行迁移/行链接的问题
- 行链接和行迁移的秘密
- 关于Oracle数据库中行迁移/行链接的问题 (1)
- 什么是行链接和行迁移
- GIT 如何 迁移仓库——————附:git和github教程链接
- 行链接和行迁移
- 行迁移与行链接问题解决实例
- Oracle中行迁移和行链接的清除及检测
- 行链接和行迁移的秘密
- 关于Oracle数据库中行迁移/行链接的问题 (2)
- 行链接(Row chaining) 与行迁移(Row Migration)
- oracle技术之行迁移和行链接
- 行链接(Row chaining) 与行迁移(Row Migration)
- 行迁移和行链接(row chaining or row migration)
- 微软CRM 3.0迁移后”报表”链接打开报错解决方法!
- oracle 行链接和行迁移
- 行迁移和行链接详解
- MySQL与Oracle的数据迁移注意事项,另附转换工具链接
- 行链接 行迁移的消除
- 行链接和行迁移的秘密