yangtingkun
===========================================================
行链接在存储结构上是如何实现的(四)
===========================================================

如果一条记录的长度超过了BLOCK_SIZEOracle会以行链接的形式来存放,不过Oracle到底是如何实现行链接的,一直没有深究,直到有一个网友问起这个问题。

通过例子来验证对标识位的推测。

行链接在存储结构上是如何实现的(一):http://yangtingkun.itpub.net/post/468/465165

行链接在存储结构上是如何实现的(二):http://yangtingkun.itpub.net/post/468/465376

行链接在存储结构上是如何实现的(三):http://yangtingkun.itpub.net/post/468/465482


上一篇文章中确定了行链接记录中列信息的标识位,根据前面几个例子推测了H/L/N/P等几个标识的含义,下面通过几个简单的例子,进行简单的验证:

SQL> create table t3
2 (col1 varchar2(4000),
3 col2 varchar2(4000),
4 col3 varchar2(4000),
5 col4 varchar2(4000),
6 col5 varchar2(4000),
7 col6 varchar2(4000))
8 tablespace test;

表已创建。

SQL> insert into t3 values
2 (lpad('1', 4000, '1'),
3 lpad('2', 4000, '2'),
4 lpad('3', 4000, '3'),
5 lpad('4', 4000, '4'),
6 lpad('5', 4000, '5'),
7 lpad('6', 4000, '6'));

已创建 1 行。

SQL> alter system checkpoint;

系统已更改。

SQL> SELECT DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID), DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID) FROM T3;

DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID) DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)
------------------------------------ ------------------------------------
28 37

SQL> ALTER SYSTEM DUMP DATAFILE 28 BLOCK 37;

系统已更改。

SQL> ALTER SYSTEM DUMP DATAFILE 28 BLOCK 36;

系统已更改。

SQL> ALTER SYSTEM DUMP DATAFILE 28 BLOCK 35;

系统已更改。

SQL> ALTER SYSTEM DUMP DATAFILE 28 BLOCK 34;

系统已更改。

下面检查trace文件,观察对应的标识信息:

Start dump data blocks tsn: 27 file#: 28 minblk 37 maxblk 37
buffer tsn: 27 rdba: 0x07000025 (28/37)
scn: 0x0001.79f6489f seq: 0x05 flg: 0x04 tail: 0x489f0605
frmt: 0x02 chkval: 0x6ec1 type: 0x06=trans data
Block header dump: 0x07000025
Object id on Block? Y
seg/obj: 0x98ed csc: 0x01.79f6489f itc: 2 flg: O typ: 1 - DATA
fsl: 0 fnx: 0x0 ver: 0x01

Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0002.006.00016ef8 0x008a7832.1cd7.07 ---- 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: 0x07000025
76543210
flag=--------
ntab=1
nrow=1
frre=-1
fsbo=0x14
fseo=0x1f5a
avsp=0x1f46
tosp=0x1f46
0xe:pti[0] nrow=1 offs=0
0x12:pri[0] offs=0x1f5a
block_row_dump:
tab 0, row 0, @0x1f5a
tl: 70 fb: --H-F--N lb: 0x1 cc: 1
nrid: 0x07000024.0
col 0: [60]
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31
31 31 31 31 31 31 31 31 31 31
end_of_block_dump
End dump data blocks tsn: 27 file#: 28 minblk 37 maxblk 37
*** 2008-04-18 17:27:33.096
Start dump data blocks tsn: 27 file#: 28 minblk 36 maxblk 36
buffer tsn: 27 rdba: 0x07000024 (28/36)
scn: 0x0001.79f6489f seq: 0x06 flg: 0x04 tail: 0x489f0606
frmt: 0x02 chkval: 0x0461 type: 0x06=trans data
Block header dump: 0x07000024
Object id on Block? Y
seg/obj: 0x98ed csc: 0x01.79f6489f itc: 3 flg: - typ: 1 - DATA
fsl: 0 fnx: 0x0 ver: 0x01

Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0002.006.00016ef8 0x008a7832.1cd7.06 ---- 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: 0x07000024
76543210
flag=--------
ntab=1
nrow=1
frre=-1
fsbo=0x14
fseo=0x4d
avsp=0x39
tosp=0x39
0xe:pti[0] nrow=1 offs=0
0x12:pri[0] offs=0x4d
block_row_dump:
tab 0, row 0, @0x4d
tl: 7995 fb: ------PN lb: 0x1 cc: 3
nrid: 0x07000023.0
col 0: [3940]
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31
.
.
.
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31
col 1: [4000]
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32
.
.
.
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32
col 2: [39]
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
33 33 33 33 33 33 33 33 33 33 33 33 33 33
end_of_block_dump
End dump data blocks tsn: 27 file#: 28 minblk 36 maxblk 36
*** 2008-04-18 17:30:19.583
Start dump data blocks tsn: 27 file#: 28 minblk 35 maxblk 35
buffer tsn: 27 rdba: 0x07000023 (28/35)
scn: 0x0001.79f6489f seq: 0x06 flg: 0x04 tail: 0x489f0606
frmt: 0x02 chkval: 0x4a91 type: 0x06=trans data
Block header dump: 0x07000023
Object id on Block? Y
seg/obj: 0x98ed csc: 0x01.79f6489f itc: 3 flg: - typ: 1 - DATA
fsl: 0 fnx: 0x0 ver: 0x01

Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0002.006.00016ef8 0x008a7832.1cd7.05 ---- 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: 0x07000023
76543210
flag=--------
ntab=1
nrow=1
frre=-1
fsbo=0x14
fseo=0x4d
avsp=0x39
tosp=0x39
0xe:pti[0] nrow=1 offs=0
0x12:pri[0] offs=0x4d
block_row_dump:
tab 0, row 0, @0x4d
tl: 7995 fb: ------PN lb: 0x1 cc: 3
nrid: 0x07000022.0
col 0: [3961]
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
.
.
.
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
33 33 33 33 33 33 33 33 33 33 33
col 1: [4000]
34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34
34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34
.
.
.
34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34
col 2: [18] 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35
end_of_block_dump
End dump data blocks tsn: 27 file#: 28 minblk 35 maxblk 35
*** 2008-04-18 17:31:43.248
Start dump data blocks tsn: 27 file#: 28 minblk 34 maxblk 34
buffer tsn: 27 rdba: 0x07000022 (28/34)
scn: 0x0001.79f6489f seq: 0x06 flg: 0x04 tail: 0x489f0606
frmt: 0x02 chkval: 0x1b87 type: 0x06=trans data
Block header dump: 0x07000022
Object id on Block? Y
seg/obj: 0x98ed csc: 0x01.79f6489f itc: 3 flg: - typ: 1 - DATA
fsl: 0 fnx: 0x0 ver: 0x01

Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0002.006.00016ef8 0x008a7832.1cd7.04 ---- 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: 0x07000022
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
col 0: [3982]
35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35
35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35
.
.
.
35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35
35 35 35 35 35 35 35
col 1: [4000]
36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36
36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36
.
.
.
36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36
end_of_block_dump
End dump data blocks tsn: 27 file#: 28 minblk 34 maxblk 34

观察上面4BLOCKDUMP信息中红色部分,第一个BLOCK是记录头信息包含HF,而且由于COL1没有完全写完,因此还包含了N标识,标识下一个BLOCK中包含当前列的部分内容。

而第二个BLOCK包含了前面一个BLOCK中的最后列的部分信息,因此包含P标识,而且这个BLOCK的最后一列也未写完,因此还包括了一个N标识。

第三个BLOCK的情况和第二个BLOCK完全相同,也是开头列和结尾列都不完整,因此包含P/N标识。

最后一个BLOCK由于是结尾列,因此包含L标识,而且由于前面一个BLOCK的最后一列未写完,因此还包含了一个P标识。

为了更好的说明情况,建立一张新表,插入两条记录,这两条记录不会形成表链接:

SQL> create table t4 (col1 varchar2(4000), col2 varchar2(4000), col3 varchar2(4000))
2 tablespace test;

表已创建。

SQL> insert into t4 values
2 (lpad('1', 100, '1'),
3 lpad('2', 100, '2'),
4 lpad('3', 100, '3'));

已创建 1 行。

SQL> insert into t4 values
2 (lpad('1', 2000, '1'),
3 lpad('2', 2000, '2'),
4 lpad('3', 2000, '3'));

已创建 1 行。

SQL> select rownum,
2 dbms_rowid.rowid_relative_fno(rowid),
3 dbms_rowid.rowid_block_number(rowid)
4 from t4;

ROWNUM DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID) DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)
---------- ------------------------------------ ------------------------------------
1 28 50
2 28 50

SQL> alter system checkpoint;

系统已更改。

SQL> alter system dump datafile 28 block 50;

系统已更改。

检查dump文件:

Start dump data blocks tsn: 27 file#: 28 minblk 50 maxblk 50
buffer tsn: 27 rdba: 0x07000032 (28/50)
scn: 0x0001.c489e644 seq: 0x06 flg: 0x04 tail: 0xe6440606
frmt: 0x02 chkval: 0x7bcc type: 0x06=trans data
Block header dump: 0x07000032
Object id on Block? Y
seg/obj: 0x9a9b csc: 0x01.c489e644 itc: 2 flg: O typ: 1 - DATA
fsl: 0 fnx: 0x0 ver: 0x01

Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0004.00c.000185a0 0x00976be3.1cff.11 ---- 2 fsc 0x0000.00000000
0x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000

data_block_dump,data header at 0xad7cc5c
===============
tsiz: 0x1fa0
hsiz: 0x16
pbl: 0x0ad7cc5c
bdba: 0x07000032
76543210
flag=--------
ntab=1
nrow=2
frre=-1
fsbo=0x16
fseo=0x6f2
avsp=0x6dc
tosp=0x6dc
0xe:pti[0] nrow=2 offs=0
0x12:pri[0] offs=0x1e6e
0x14:pri[1] offs=0x6f2
block_row_dump:
tab 0, row 0, @0x1e6e
tl: 306 fb: --H-FL-- lb: 0x1 cc: 3
col 0: [100]
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31
col 1: [100]
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32
col 2: [100]
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
tab 0, row 1, @0x6f2
tl: 6012 fb: --H-FL-- lb: 0x1 cc: 3
col 0: [2000]
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31
.
.
.
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31
col 1: [2000]
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32
.
.
.
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32
col 2: [2000]
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
.
.
.
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
end_of_block_dump
End dump data blocks tsn: 27 file#: 28 minblk 50 maxblk 50

如果没有行链接的存在,就不会出现PN的标识,这条记录会包含完整的HFL标识。

yangtingkun 发表于:2008.07.02 23:07 ::分类: ( ORACLE ) ::阅读:(143次) :: 评论 (0)

发表评论
标题

在此添加评论
表情符号: smile laughing tongue angry crying sad wassat wink

称呼

邮箱地址(可选)

个人主页(可选)

 authimage


切换风格
新闻聚合
博客日历
文章归档...
最新发表...
最新评论...
最多阅读文章...
最多评论文章...
博客统计...
Blog信息
网站链接...