发表于: 2008.07.01 23:51
分类: ORACLE
出处: http://yangtingkun.itpub.net/post/468/465482
---------------------------------------------------------------
如果一条记录的长度超过了BLOCK_SIZE,Oracle会以行链接的形式来存放,不过Oracle到底是如何实现行链接的,一直没有深究,直到有一个网友问起这个问题。
定位行链接存储标识位。
行链接在存储结构上是如何实现的(一):http://yangtingkun.itpub.net/post/468/465165
行链接在存储结构上是如何实现的(二):http://yangtingkun.itpub.net/post/468/465376
上一篇文章中找到了BLOCK中存储的列的个数,这离最终目标又近了一步。仔细对比一下前面两篇文章中DUMP的结果信息:
T表的BLOCK1头信息:
Start dump data blocks tsn: 27 file#: 28 minblk 11 maxblk 11
buffer tsn: 27 rdba: 0x0700000b (28/11)
scn: 0x0001.78a8fb01 seq: 0x05 flg: 0x04 tail: 0xfb010605
frmt: 0x02 chkval: 0xccd4 type: 0x06=trans data
Block header dump: 0x0700000b
Object id on Block? Y
seg/obj: 0x98e9 csc: 0x01.78a8fb01 itc: 2 flg: O typ: 1 - DATA
fsl: 0 fnx: 0x0 ver: 0x01
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0003.010.00017778 0x00915927.23a1.48 ---- 1 fsc 0x0000.00000000
0x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
data_block_dump,data header at 0xb742d25c
===============
tsiz: 0x1fa0
hsiz: 0x14
pbl: 0xb742d25c
bdba: 0x0700000b
76543210
flag=--------
ntab=1
nrow=1
frre=-1
fsbo=0x14
fseo=0xfe1
avsp=0xfcd
tosp=0xfcd
0xe:pti[0] nrow=1 offs=0
0x12:pri[0] offs=0xfe1
block_row_dump:
tab 0, row 0, @0xfe1
tl: 4031 fb: --H-F--N lb: 0x1 cc: 2
nrid: 0x0700000a.0
T表的BLOCK2的头信息:
Start dump data blocks tsn: 27 file#: 28 minblk 10 maxblk 10
buffer tsn: 27 rdba: 0x0700000a (28/10)
scn: 0x0001.78a8fb01 seq: 0x06 flg: 0x04 tail: 0xfb010606
frmt: 0x02 chkval: 0x5e2d type: 0x06=trans data
Block header dump: 0x0700000a
Object id on Block? Y
seg/obj: 0x98e9 csc: 0x01.78a8fb01 itc: 3 flg: - typ: 1 - DATA
fsl: 0 fnx: 0x0 ver: 0x01
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0003.010.00017778 0x00915927.23a1.47 ---- 1 fsc 0x0000.00000000
0x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
0x03 0x0000.000.00000000 0x00000000.0000.00 C--- 0 scn 0x0000.00000000
data_block_dump,data header at 0xb742d274
===============
tsiz: 0x1f88
hsiz: 0x14
pbl: 0xb742d274
bdba: 0x0700000a
76543210
flag=--------
ntab=1
nrow=1
frre=-1
fsbo=0x14
fseo=0x51
avsp=0x3d
tosp=0x3d
0xe:pti[0] nrow=1 offs=0
0x12:pri[0] offs=0x51
block_row_dump:
tab 0, row 0, @0x51
tl: 7991 fb: -----LP- lb: 0x1 cc: 2
T1的BLOCK1头信息:
Start dump data blocks tsn: 27 file#: 28 minblk 19 maxblk 19
buffer tsn: 27 rdba: 0x07000013 (28/19)
scn: 0x0001.78a90adb seq: 0x05 flg: 0x04 tail: 0x0adb0605
frmt: 0x02 chkval: 0x105b type: 0x06=trans data
Block header dump: 0x07000013
Object id on Block? Y
seg/obj: 0x98ea csc: 0x01.78a90adb itc: 2 flg: O typ: 1 - DATA
fsl: 0 fnx: 0x0 ver: 0x01
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0003.011.00017519 0x00915928.23a1.02 ---- 1 fsc 0x0000.00000000
0x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
data_block_dump,data header at 0xb742d25c
===============
tsiz: 0x1fa0
hsiz: 0x14
pbl: 0xb742d25c
bdba: 0x07000013
76543210
flag=--------
ntab=1
nrow=1
frre=-1
fsbo=0x14
fseo=0xff4
avsp=0xfe0
tosp=0xfe0
0xe:pti[0] nrow=1 offs=0
0x12:pri[0] offs=0xff4
block_row_dump:
tab 0, row 0, @0xff4
tl: 4012 fb: --H-F--- lb: 0x1 cc: 1
nrid: 0x07000012.0
T1的BLOCK2信息:
Start dump data blocks tsn: 27 file#: 28 minblk 18 maxblk 18
buffer tsn: 27 rdba: 0x07000012 (28/18)
scn: 0x0001.78a90adb seq: 0x06 flg: 0x04 tail: 0x0adb0606
frmt: 0x02 chkval: 0xbcbf type: 0x06=trans data
Block header dump: 0x07000012
Object id on Block? Y
seg/obj: 0x98ea csc: 0x01.78a90adb itc: 3 flg: - typ: 1 - DATA
fsl: 0 fnx: 0x0 ver: 0x01
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0003.011.00017519 0x00915928.23a1.01 ---- 1 fsc 0x0000.00000000
0x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
0x03 0x0000.000.00000000 0x00000000.0000.00 C--- 0 scn 0x0000.00000000
data_block_dump,data header at 0xb742d274
===============
tsiz: 0x1f88
hsiz: 0x14
pbl: 0xb742d274
bdba: 0x07000012
76543210
flag=--------
ntab=1
nrow=1
frre=-1
fsbo=0x14
fseo=0x51
avsp=0x3d
tosp=0x3d
0xe:pti[0] nrow=1 offs=0
0x12:pri[0] offs=0x51
block_row_dump:
tab 0, row 0, @0x51
tl: 7991 fb: -----L-- lb: 0x1 cc: 2
T2的BLOCK1信息:
Start dump data blocks tsn: 27 file#: 28 minblk 27 maxblk 27
buffer tsn: 27 rdba: 0x0700001b (28/27)
scn: 0x0001.79f5e324 seq: 0x01 flg: 0x06 tail: 0xe3240601
frmt: 0x02 chkval: 0x5a86 type: 0x06=trans data
Block header dump: 0x0700001b
Object id on Block? Y
seg/obj: 0x98eb csc: 0x01.79f5e321 itc: 2 flg: O typ: 1 - DATA
fsl: 0 fnx: 0x0 ver: 0x01
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0009.001.00016d53 0x00910f26.075b.1f --U- 1 fsc 0x0000.79f5e324
0x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
data_block_dump,data header at 0xb742d25c
===============
tsiz: 0x1fa0
hsiz: 0x14
pbl: 0xb742d25c
bdba: 0x0700001b
76543210
flag=--------
ntab=1
nrow=1
frre=-1
fsbo=0x14
fseo=0xfd8
avsp=0xfc4
tosp=0xfc4
0xe:pti[0] nrow=1 offs=0
0x12:pri[0] offs=0xfd8
block_row_dump:
tab 0, row 0, @0xfd8
tl: 4040 fb: --H-F--N lb: 0x1 cc: 5
nrid: 0x0700001a.0
T2的BLOCK2头信息:
Start dump data blocks tsn: 27 file#: 28 minblk 26 maxblk 26
buffer tsn: 27 rdba: 0x0700001a (28/26)
scn: 0x0001.79f5e324 seq: 0x01 flg: 0x06 tail: 0xe3240601
frmt: 0x02 chkval: 0x9e47 type: 0x06=trans data
Block header dump: 0x0700001a
Object id on Block? Y
seg/obj: 0x98eb csc: 0x01.79f5e321 itc: 3 flg: - typ: 1 - DATA
fsl: 0 fnx: 0x0 ver: 0x01
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0009.001.00016d53 0x00910f26.075b.1e --U- 1 fsc 0x0000.79f5e324
0x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
0x03 0x0000.000.00000000 0x00000000.0000.00 C--- 0 scn 0x0000.00000000
data_block_dump,data header at 0xb742d274
===============
tsiz: 0x1f88
hsiz: 0x14
pbl: 0xb742d274
bdba: 0x0700001a
76543210
flag=--------
ntab=1
nrow=1
frre=-1
fsbo=0x14
fseo=0x51
avsp=0x3d
tosp=0x3d
0xe:pti[0] nrow=1 offs=0
0x12:pri[0] offs=0x51
block_row_dump:
tab 0, row 0, @0x51
tl: 7991 fb: -----LP- lb: 0x1 cc: 2
仔细对比上面这些头信息,这些标识位就显得十分明显了。观察这些头信息的红色部分,这一系列的字母就标识了行链接的信息。
可以看到所有的块头都包括H和F,而所有的结尾块都包含L,那么显然H或者F标识的是行头信息,而L标识行尾信息。
推测H这里表示HIGN END或者HEADING,而L表示LOW END或者LEAF。如果当前块包含的最后一个COLUMN的内容没有结束,会在标识中包含一个N,应该表示NEXT的含义。而对应的下一个BLOCK,如果列不是从头开始,会在标识中包含一个P,应该是PRIOR的含义。











