|
从底向上第一篇--了解DML操作
从底向上第二篇--了解行迁移
从底向上第三篇--了解index的compress
从底向上第四篇--了解行链接
从底向上第五篇--了解表的压缩属性
从底向上第六篇--compress for oltp真正压缩的阈值触发条件
从底向上第七篇--超255列表的存储
从底向上第八篇--伪造基于ASSM表空间的数据块
在从底向上系列的第二篇,从底向上了解行迁移时我们看到了行迁移的产生,以及oracle是如何在block里处理行迁移。
行迁移、行链接是两个概念,但是很多人可能都不太了解两者的区别与相同的地方。我们这里就加以引申,来看看行链接的情况。
SQL> create table t (a varchar2(4000),b varchar2(4000),c varchar2(4000)); --这里我们建一个3个列的表
表已创建。
SQL> insert into t values ('a',null,null); --只放入第一列,后两列数据空
已创建 1 行。
SQL> select t.header_file,t.header_block from dba_segments t
2 where t.segment_name='T';
HEADER_FILE HEADER_BLOCK
----------- ------------
1 58408
SQL> alter system dump datafile 1 block 58409;
20F4BFF0 00000000 2C000000 61010101 170C0605 [.......,...a....]
Block header dump: 0x0040e429
Object id on Block? Y
seg/obj: 0xeb0e csc: 0x00.f16f9 itc: 2 flg: O typ: 1 - DATA
fsl: 0 fnx: 0x0 ver: 0x01
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0006.009.0000028d 0x00c0566c.0050.0d --U- 1 fsc 0x0000.000f170c
0x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
bdba: 0x0040e429
data_block_dump,data header at 0x20f4a05c
===============
tsiz: 0x1fa0
hsiz: 0x14
pbl: 0x20f4a05c
76543210
flag=--------
ntab=1
nrow=1
frre=-1
fsbo=0x14
fseo=0x1f9b
avsp=0x1f83
tosp=0x1f83
0xe:pti[0] nrow=1 offs=0
0x12:pri[0] offs=0x1f9b
block_row_dump:
tab 0, row 0, @0x1f9b
tl: 5 fb: --H-FL-- lb: 0x1 cc: 1
col 0: [ 1] 61
end_of_block_dump
上面是很简单的DUMP文件。
现在我们更新后两列的内容:
SQL> update t set b=lpad('b',4000,'b'),c=lpad('c',4000,'c');
已更新 1 行。
提交完成。
21861050 61010000 620FA0FE 62626262 62626262 [...a...bbbbbbbbb]
21861060 62626262 62626262 62626262 62626262 [bbbbbbbbbbbbbbbb]
Repeat 248 times
21861FF0 62626262 2C626262 61010102 172A0604 [bbbbbbb,...a..*.]
Block header dump: 0x0040e429
Object id on Block? Y
seg/obj: 0xeb0e csc: 0x00.f1729 itc: 2 flg: - typ: 1 - DATA
fsl: 0 fnx: 0x0 ver: 0x01
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0006.009.0000028d 0x00c0566c.0050.0d C--- 0 scn 0x0000.000f170c
0x02 0x0008.01d.0000027f 0x00c00c16.0064.0a --U- 1 fsc 0x0000.000f172a
bdba: 0x0040e429
data_block_dump,data header at 0x2186005c
===============
tsiz: 0x1fa0
hsiz: 0x14
pbl: 0x2186005c
76543210
flag=--------
ntab=1
nrow=1
frre=-1
fsbo=0x14
fseo=0xfed
avsp=0xfde
tosp=0xfde
0xe:pti[0] nrow=1 offs=0
0x12:pri[0] offs=0xfed
block_row_dump:
tab 0, row 0, @0xfed
tl: 4014 fb: --H-F--- lb: 0x2 cc: 2
nrid: 0x0040e42a.0
col 0: [ 1] 61
col 1: [4000]
62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62
…
62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62
end_of_block_dump
我们看到,这个block里包含了列0及列1,行标志位是Head和First,少了我们常见的Last,表示还没有读到行的结尾,并且,还有一个nrid,有关于nrid,可以参考行迁移篇。
看看下一个block
SQL> alter system dump datafile 1 block 58410;
系统已更改。
D3E5050 0107C304 0104013E 0FA0FE01 63636363 [....>.......cccc]
D3E5060 63636363 63636363 63636363 63636363 [cccccccccccccccc]
Repeat 248 times
D3E5FF0 63636363 63636363 63636363 172A0605 [cccccccccccc..*.]
Block header dump: 0x0040e42a
Object id on Block? Y
seg/obj: 0xeb0e csc: 0x00.f170c itc: 3 flg: O typ: 1 - DATA
fsl: 0 fnx: 0x0 ver: 0x01
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0008.01d.0000027f 0x00c00c16.0064.09 --U- 1 fsc 0x0000.000f172a
0x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
0x03 0x0000.000.00000000 0x00000000.0000.00 C--- 0 scn 0x0000.00000000
bdba: 0x0040e42a
data_block_dump,data header at 0xd3e4074
===============
tsiz: 0x1f88
hsiz: 0x14
pbl: 0x0d3e4074
76543210
flag=--------
ntab=1
nrow=1
frre=-1
fsbo=0x14
fseo=0xfe2
avsp=0xfce
tosp=0xfce
0xe:pti[0] nrow=1 offs=0
0x12:pri[0] offs=0xfe2
block_row_dump:
tab 0, row 0, @0xfe2
tl: 4006 fb: -----L-- lb: 0x1 cc: 1
col 0: [4000]
63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63
…
63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63
end_of_block_dump
ok,这里是第三列的内容,标志位为L。表示到此,行内容结束。
这里,就可以看出,行迁移是整行迁移到另外的block,而原来block中只存放nrid,指向新的block,行链接是将一行分为两部分(或更多),分别存放在不同的block中,并且,从行的开始(Head)都存放一个指向下一部分内容的nrid,直到行的结尾(Last)。
[ 本帖最后由 sundog315 于 2010-6-25 14:51 编辑 ] |
|