|
请先移步从底向上了解DML操作http://www.itpub.net/thread-1283537-1-1.html
从底向上第一篇--了解DML操作
从底向上第二篇--了解行迁移
从底向上第三篇--了解index的compress
从底向上第四篇--了解行链接
从底向上第五篇--了解表的压缩属性
从底向上第六篇--compress for oltp真正压缩的阈值触发条件
从底向上第七篇--超255列表的存储
从底向上第八篇--伪造基于ASSM表空间的数据块
在上一篇从底向上了解DML操作的帖子里,描述了insert、update、delete操作,在block里是如何进行的。
这篇来介绍行迁移。
上篇的最后,block里剩下3条记录,id分别为C50B(1000000000),C103(2),C104(3)
前两个的text列长度都已经是4000了,如果我们修改最后一个列的长度为4000,那么3*4000肯定大于8192的block大小,这时会发生什么呢?
SQL> update tt set text=lpad('a',4000) where id=3;
已更新 1 行。
提交完成。
SQL> alter system dump datafile 1 block 134578;
系统已更改。
7702290 00000000 00000000 00000000 0202002C [............,...]
77022A0 A0FE0BC5 2020200F 20202020 20202020 [..... ]
77022B0 20202020 20202020 20202020 20202020 [ ]
Repeat 248 times
7703240 20202020 00012061 B30D4200 64630000 [ a ...B....cd]
7703250 2C676665 C1020200 0FA0FE03 20202020 [efg,........ ]
7703260 20202020 20202020 20202020 20202020 [ ]
Repeat 248 times
77041F0 20202020 20202020 61202020 1F760604 [ a..v.]
Block header dump: 0x00420db2
Object id on Block? Y
seg/obj: 0xbf1e csc: 0x00.e1f74 itc: 2 flg: O typ: 1 - DATA
fsl: 0 fnx: 0x0 ver: 0x01
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0002.001.000001c1 0x008010ad.011f.3f --U- 1 fsc 0x0005.000e1f76
0x02 0x0003.01b.000001c1 0x00800eeb.00a6.2d C--- 0 scn 0x0000.000e1ca0
data_block_dump,data header at 0x770225c
===============
tsiz: 0x1fa0
hsiz: 0x18
pbl: 0x0770225c
bdba: 0x00420db2
76543210
flag=--------
ntab=1
nrow=3
frre=-1
fsbo=0x18
fseo=0x40
avsp=0x28
tosp=0x2d
0xe:pti[0] nrow=3 offs=0
0x12:pri[0] offs=0x40
0x14:pri[1] offs=0xff7
0x16:pri[2] offs=0xfe9
block_row_dump:
tab 0, row 0, @0x40
tl: 4009 fb: --H-FL-- lb: 0x0 cc: 2
col 0: [ 2] c5 0b
col 1: [4000]
20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
…
20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61
tab 0, row 1, @0xff7
tl: 4009 fb: --H-FL-- lb: 0x0 cc: 2
col 0: [ 2] c1 03
col 1: [4000]
20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
…
20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61
tab 0, row 2, @0xfe9
tl: 9 fb: --H----- lb: 0x1 cc: 0
nrid: 0x00420db3.0
end_of_block_dump
还记得H是什么意思么?
H Head of row piece
呵呵,发生行迁移了,这里只是存了这行记录的头信息,那各位又要问了,真正的数据哪去了呢?答案就在nrid:0x00420db3.0,您又问了,这个乱起八糟的东西又是啥捏?那我们就要看一下当前的block bdba了,0x00420db2,0x00420db3=0x00420db2+1,也就是下一个块里。那.0又是什么意思呢?我们先放一下,先看看下一个块的内容。
SQL> conn / as sysdba
已连接。
SQL> alter system dump datafile 1 block 134579;
系统已更改。
4E53180 A0FE04C1 2020200F 20202020 20202020 [..... ]
4E53190 20202020 20202020 20202020 20202020 [ ]
Repeat 248 times
4E54120 20202020 02013C61 1A02C102 64636261 [ a<......abcd]
4E54130 68676665 6C6B6A69 706F6E6D 74737271 [efghijklmnopqrst]
4E54140 78777675 013C7A79 02C10202 6362611A [uvwxyz<......abc]
4E54150 67666564 6B6A6968 6F6E6D6C 73727170 [defghijklmnopqrs]
4E54160 77767574 3C7A7978 C1020201 62611A02 [tuvwxyz<......ab]
4E54170 66656463 6A696867 6E6D6C6B 7271706F [cdefghijklmnopqr]
4E54180 76757473 7A797877 0202013C 611A02C1 [stuvwxyz<......a]
4E54190 65646362 69686766 6D6C6B6A 71706F6E [bcdefghijklmnopq]
4E541A0 75747372 79787776 02013C7A 1A02C102 [rstuvwxyz<......]
4E541B0 64636261 68676665 6C6B6A69 706F6E6D [abcdefghijklmnop]
4E541C0 74737271 78777675 002C7A79 02C10202 [qrstuvwxyz,.....]
4E541D0 63626103 0202002C 610302C1 002C6362 [.abc,......abc,.]
4E541E0 02C10202 63626103 0202002C 610302C1 [.....abc,......a]
4E541F0 002C6362 02C10202 63626103 1F760602 [bc,......abc..v.]
Block header dump: 0x00420db3
Object id on Block? Y
seg/obj: 0xbf1e csc: 0x00.e1f74 itc: 3 flg: O typ: 1 - DATA
fsl: 0 fnx: 0x0 ver: 0x01
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x000a.002.0000014e 0x00801017.008c.2f C--- 0 scn 0x0000.000e1c59
0x02 0x0002.001.000001c1 0x008010ad.011f.3e --U- 1 fsc 0x0000.000e1f76
0x03 0x0000.000.00000000 0x00000000.0000.00 C--- 0 scn 0x0000.00000000
data_block_dump,data header at 0x4e52274
===============
tsiz: 0x1f88
hsiz: 0x1c
pbl: 0x04e52274
bdba: 0x00420db3
76543210
flag=--------
ntab=1
nrow=5
frre=1
fsbo=0x1c
fseo=0xf02
avsp=0xfbd
tosp=0xfbd
0xe:pti[0] nrow=5 offs=0
0x12:pri[0] offs=0xf02
0x14:pri[1] sfll=2
0x16:pri[2] sfll=3
0x18:pri[3] sfll=4
0x1a:pri[4] sfll=-1
block_row_dump:
tab 0, row 0, @0xf02
tl: 4015 fb: ----FL-- lb: 0x2 cc: 2
hrid: 0x00420db2.2
col 0: [ 2] c1 04
col 1: [4000]
20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
…
20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61
end_of_block_dump
先看看,这个块的bdba: 0x00420db3,OK,看来是找对地方了。对照看一下这条记录的标志----FL--,没有H标志。再看看,还有一个hrid: 0x00420db2.2,OK,这下搞清楚.代表什么意思了,其实,就是bdba.row#,根据这个,就可以向下或向上链接了。
SQL> alter system dump datafile 1 block 134579;
系统已更改。
SQL> analyze table tt compute statistics;
表已分析。
SQL> select t.chain_cnt
2 from user_tables t
3 where t.table_name='TT';
CHAIN_CNT
----------
1
统计信息也显示这个表有一个行产生了链接。
尝试解决一下:
SQL> alter table tt move tablespace users;
表已更改。
SQL> select t.header_file,t.header_block from dba_segments t
2 where t.segment_name='TT';
HEADER_FILE HEADER_BLOCK
----------- ------------
4 11
SQL> conn / as sysdba
已连接。
SQL> alter system dump datafile 4 block 12;
系统已更改。
SQL> alter system dump datafile 4 block 13;
系统已更改。
SQL> alter system dump datafile 4 block 14;
系统已更改。
Block 12:
4E53250 2C000000 C5020200 0FA0FE0B 20202020 [...,........ ]
4E53260 20202020 20202020 20202020 20202020 [ ]
Repeat 248 times
4E541F0 20202020 20202020 61202020 22CB0602 [ a..."]
Block header dump: 0x0100000c
Object id on Block? Y
seg/obj: 0xbf1f csc: 0x00.e22ca itc: 3 flg: E typ: 1 - DATA
brn: 0 bdba: 0x1000009 ver: 0x01 opc: 0
inc: 0 exflg: 0
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0008.007.000001c5 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
0x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
0x03 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
data_block_dump,data header at 0x4e5227c
===============
tsiz: 0x1f80
hsiz: 0x14
pbl: 0x04e5227c
bdba: 0x0100000c
76543210
flag=--------
ntab=1
nrow=1
frre=-1
fsbo=0x14
fseo=0xfd7
avsp=0xfc3
tosp=0xfc3
0xe:pti[0] nrow=1 offs=0
0x12:pri[0] offs=0xfd7
block_row_dump:
tab 0, row 0, @0xfd7
tl: 4009 fb: --H-FL-- lb: 0x0 cc: 2
col 0: [ 2] c5 0b -- 1000000000
col 1: [4000]
20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
…
20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61
end_of_block_dump
Block 13:
4E53250 2C000000 C1020200 0FA0FE03 20202020 [...,........ ]
4E53260 20202020 20202020 20202020 20202020 [ ]
Repeat 248 times
4E541F0 20202020 20202020 61202020 22CB0602 [ a..."]
Block header dump: 0x0100000d
Object id on Block? Y
seg/obj: 0xbf1f csc: 0x00.e22ca itc: 3 flg: E typ: 1 - DATA
brn: 0 bdba: 0x1000009 ver: 0x01 opc: 0
inc: 0 exflg: 0
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0008.007.000001c5 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
0x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
0x03 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
data_block_dump,data header at 0x4e5227c
===============
tsiz: 0x1f80
hsiz: 0x14
pbl: 0x04e5227c
bdba: 0x0100000d
76543210
flag=--------
ntab=1
nrow=1
frre=-1
fsbo=0x14
fseo=0xfd7
avsp=0xfc3
tosp=0xfc3
0xe:pti[0] nrow=1 offs=0
0x12:pri[0] offs=0xfd7
block_row_dump:
tab 0, row 0, @0xfd7
tl: 4009 fb: --H-FL-- lb: 0x0 cc: 2
col 0: [ 2] c1 03 -- 2
col 1: [4000]
20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
…
20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61
end_of_block_dump
Block 14:
4E53250 2C000000 C1020200 0FA0FE04 20202020 [...,........ ]
4E53260 20202020 20202020 20202020 20202020 [ ]
Repeat 248 times
4E541F0 20202020 20202020 61202020 22CB0602 [ a..."]
Block header dump: 0x0100000e
Object id on Block? Y
seg/obj: 0xbf1f csc: 0x00.e22ca itc: 3 flg: E typ: 1 - DATA
brn: 0 bdba: 0x1000009 ver: 0x01 opc: 0
inc: 0 exflg: 0
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0008.007.000001c5 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
0x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
0x03 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
data_block_dump,data header at 0x4e5227c
===============
tsiz: 0x1f80
hsiz: 0x14
pbl: 0x04e5227c
bdba: 0x0100000e
76543210
flag=--------
ntab=1
nrow=1
frre=-1
fsbo=0x14
fseo=0xfd7
avsp=0xfc3
tosp=0xfc3
0xe:pti[0] nrow=1 offs=0
0x12:pri[0] offs=0xfd7
block_row_dump:
tab 0, row 0, @0xfd7
tl: 4009 fb: --H-FL-- lb: 0x0 cc: 2
col 0: [ 2] c1 04 -- 3
col 1: [4000]
20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
…
20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61
end_of_block_dump
move tablespace 后,数据空间重新进行了分配。没有了行迁移的情况。
SQL> analyze table tt compute statistics;
表已分析。
SQL> select t.chain_cnt
2 from user_tables t
3 where t.table_name='TT';
CHAIN_CNT
----------
0
[ 本帖最后由 sundog315 于 2010-6-25 14:50 编辑 ] |
|