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

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

简单描述D标识位。

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

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

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

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

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


其实上一篇文章描述的就已经和行链接没有什么关系了,不过这个问题依然是由行链接问题引起的,那么还是放在一起比较好。

在前面的几篇文章中,依次出现的标识符包括H/-/F/L/P/N,而且说明了每个标识符的含义,而这里中间还空缺了一个标识符。这个空缺的标识符又是什么呢。

前面已经通过INSERTUPDATE构造了行迁移和行链接,而唯独没有做过DELETE操作,那么这个标识符是否就是用来标识删除的呢:

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

表已创建。

SQL> insert into t5 values
2 (lpad('1', 4000, '1'),
3 lpad('2', 4000, '2'),
4 lpad('3', 4000, '3'));

已创建 1 行。

SQL> insert into t5 values
2 (lpad('1', 1000, '1'),
3 lpad('2', 1000, '2'),
4 lpad('3', 1000, '3'));

已创建 1 行。

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

已创建 1 行。

SQL> commit;

提交完成。

SQL> select rownum, rowid from t5;

ROWNUM ROWID
---------- ------------------
1 AAAJqoAAcAAAAA7AAA
2 AAAJqoAAcAAAAA7AAB
3 AAAJqoAAcAAAAA8AAA

SQL> select dbms_rowid.rowid_relative_fno(rowid), dbms_rowid.rowid_block_number(rowid) from t5;

DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID) DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)
------------------------------------ ------------------------------------
28 59
28 59
28 60

SQL> update t5 set col1 = lpad('1', 4000, '1') where rowid = 'AAAJqoAAcAAAAA7AAB';

已更新 1 行。

SQL> alter system checkpoint;

系统已更改。

SQL> alter system dump datafile 28 block 59;

系统已更改。

SQL> alter system dump datafile 28 block 60;

系统已更改。

上面构造了3条记录,一条普通记录,一条行迁移,一条行链接,观察一下DUMP的结果:

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

Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0005.018.00018f62 0x009f8c56.1b98.0a C--- 0 scn 0x0001.c48aca7c
0x02 0x0009.005.00018522 0x00976b4d.078b.2a ---- 1 fsc 0x0bbb.00000000

data_block_dump,data header at 0xad7cc5c
===============
tsiz: 0x1fa0
hsiz: 0x16
pbl: 0x0ad7cc5c
bdba: 0x0700003b
76543210
flag=--------
ntab=1
nrow=2
frre=-1
fsbo=0x16
fseo=0x41d
avsp=0x407
tosp=0xfc2
0xe:pti[0] nrow=2 offs=0
0x12:pri[0] offs=0xfe1
0x14:pri[1] offs=0x41d
block_row_dump:
tab 0, row 0, @0xfe1
tl: 4031 fb: --H-F--N lb: 0x0 cc: 2
nrid: 0x0700003a.0
col 0: [4000]
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: [18] 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32
tab 0, row 1, @0x41d
tl: 9 fb: --H----- lb: 0x2 cc: 0
nrid: 0x0700003c.1
end_of_block_dump
End dump data blocks tsn: 27 file#: 28 minblk 59 maxblk 59
Start dump data blocks tsn: 27 file#: 28 minblk 60 maxblk 60
buffer tsn: 27 rdba: 0x0700003c (28/60)
scn: 0x0001.c48acb11 seq: 0x01 flg: 0x04 tail: 0xcb110601
frmt: 0x02 chkval: 0xb1ce type: 0x06=trans data
Block header dump: 0x0700003c
Object id on Block? Y
seg/obj: 0x9aa8 csc: 0x01.c48aca7a itc: 3 flg: O typ: 1 - DATA
fsl: 0 fnx: 0x0 ver: 0x01

Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0005.018.00018f62 0x009f8c56.1b98.0b --U- 1 fsc 0x0000.c48aca7c
0x02 0x0009.005.00018522 0x00976b4d.078b.29 ---- 1 fsc 0x0000.00000000
0x03 0x0000.000.00000000 0x00000000.0000.00 C--- 0 scn 0x0000.00000000

data_block_dump,data header at 0xad7cc74
===============
tsiz: 0x1f88
hsiz: 0x16
pbl: 0x0ad7cc74
bdba: 0x0700003c
76543210
flag=--------
ntab=1
nrow=2
frre=-1
fsbo=0x16
fseo=0x6d4
avsp=0x6be
tosp=0x6be
0xe:pti[0] nrow=2 offs=0
0x12:pri[0] offs=0x1e56
0x14:pri[1] offs=0x6d4
block_row_dump:
tab 0, row 0, @0x1e56
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, @0x6d4
tl: 6018 fb: ----FL-- lb: 0x2 cc: 3
hrid: 0x0700003b.1
col 0: [4000]
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: [1000]
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: [1000]
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 60 maxblk 60

可以看到,记录2的行迁移恰好跑到记录3所在的BLOCK中,那么现在就只需要DUMP行链接的BLOCK即可:

SQL> alter system dump datafile 28 block 58;

系统已更改。

而行链接对应的trace如下:

Start dump data blocks tsn: 27 file#: 28 minblk 58 maxblk 58
buffer tsn: 27 rdba: 0x0700003a (28/58)
scn: 0x0001.c48aca7c seq: 0x01 flg: 0x06 tail: 0xca7c0601
frmt: 0x02 chkval: 0x552b type: 0x06=trans data
Block header dump: 0x0700003a
Object id on Block? Y
seg/obj: 0x9aa8 csc: 0x01.c48aca79 itc: 3 flg: - typ: 1 - DATA
fsl: 0 fnx: 0x0 ver: 0x01

Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0005.018.00018f62 0x009f8c56.1b98.08 --U- 1 fsc 0x0000.c48aca7c
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 0xad7cc74
===============
tsiz: 0x1f88
hsiz: 0x14
pbl: 0x0ad7cc74
bdba: 0x0700003a
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]
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 1: [4000]
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 58 maxblk 58

下面删除这3条记录,分别查看删除后,普通记录,行迁移记录和行链接记录的标识位如何变化:

SQL> delete t5;

已删除3行。

SQL> commit;

提交完成。

SQL> alter system checkpoint;

系统已更改。

SQL> alter system dump datafile 28 block 59;

系统已更改。

SQL> alter system dump datafile 28 block 60;

系统已更改。

SQL> alter system dump datafile 28 block 58;

系统已更改。

三个BLOCK对应的结果如下:

Start dump data blocks tsn: 27 file#: 28 minblk 59 maxblk 59
buffer tsn: 27 rdba: 0x0700003b (28/59)
scn: 0x0001.c48ad0fb seq: 0x01 flg: 0x06 tail: 0xd0fb0601
frmt: 0x02 chkval: 0x642c type: 0x06=trans data
Block header dump: 0x0700003b
Object id on Block? Y
seg/obj: 0x9aa8 csc: 0x01.c48acb11 itc: 2 flg: O typ: 1 - DATA
fsl: 2 fnx: 0x0 ver: 0x01

Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0005.018.00018f62 0x009f8c56.1b98.0a C--- 0 scn 0x0001.c48aca7c
0x02 0x0009.005.00018522 0x00976b50.078b.03 --U- 3 fsc 0x1b7f.c48ad0fb

data_block_dump,data header at 0xad7cc5c
===============
tsiz: 0x1fa0
hsiz: 0x16
pbl: 0x0ad7cc5c
bdba: 0x0700003b
76543210
flag=--------
ntab=1
nrow=2
frre=-1
fsbo=0x16
fseo=0x41d
avsp=0x407
tosp=0x1f8a
0xe:pti[0] nrow=2 offs=0
0x12:pri[0] offs=0xfe1
0x14:pri[1] offs=0x41d
block_row_dump:
tab 0, row 0, @0xfe1
tl: 2 fb: --HDF--- lb: 0x2
tab 0, row 1, @0x41d
tl: 2 fb: --HD---- lb: 0x2
end_of_block_dump
End dump data blocks tsn: 27 file#: 28 minblk 59 maxblk 59
Start dump data blocks tsn: 27 file#: 28 minblk 60 maxblk 60
buffer tsn: 27 rdba: 0x0700003c (28/60)
scn: 0x0001.c48ad0fb seq: 0x01 flg: 0x06 tail: 0xd0fb0601
frmt: 0x02 chkval: 0x3f72 type: 0x06=trans data
Block header dump: 0x0700003c
Object id on Block? Y
seg/obj: 0x9aa8 csc: 0x01.c48ad0f8 itc: 3 flg: O typ: 1 - DATA
fsl: 0 fnx: 0x0 ver: 0x01

Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0005.018.00018f62 0x009f8c56.1b98.0b C--- 0 scn 0x0001.c48aca7c
0x02 0x0009.005.00018522 0x00976b50.078b.04 --U- 2 fsc 0x18b0.c48ad0fb
0x03 0x0000.000.00000000 0x00000000.0000.00 C--- 0 scn 0x0000.00000000

data_block_dump,data header at 0xad7cc74
===============
tsiz: 0x1f88
hsiz: 0x16
pbl: 0x0ad7cc74
bdba: 0x0700003c
76543210
flag=--------
ntab=1
nrow=2
frre=-1
fsbo=0x16
fseo=0x6d4
avsp=0x6be
tosp=0x1f72
0xe:pti[0] nrow=2 offs=0
0x12:pri[0] offs=0x1e56
0x14:pri[1] offs=0x6d4
block_row_dump:
tab 0, row 0, @0x1e56
tl: 2 fb: --HDFL-- lb: 0x2
tab 0, row 1, @0x6d4
tl: 2 fb: ---DFL-- lb: 0x2
end_of_block_dump
End dump data blocks tsn: 27 file#: 28 minblk 60 maxblk 60
Start dump data blocks tsn: 27 file#: 28 minblk 58 maxblk 58
buffer tsn: 27 rdba: 0x0700003a (28/58)
scn: 0x0001.c48ad0fb seq: 0x01 flg: 0x06 tail: 0xd0fb0601
frmt: 0x02 chkval: 0x25f1 type: 0x06=trans data
Block header dump: 0x0700003a
Object id on Block? Y
seg/obj: 0x9aa8 csc: 0x01.c48ad0f7 itc: 3 flg: O typ: 1 - DATA
fsl: 2 fnx: 0x700003b ver: 0x01

Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0005.018.00018f62 0x009f8c56.1b98.08 C--- 0 scn 0x0001.c48aca7c
0x02 0x0009.005.00018522 0x00976b50.078b.01 --U- 2 fsc 0x1f35.c48ad0fb
0x03 0x0000.000.00000000 0x00000000.0000.00 C--- 0 scn 0x0000.00000000

data_block_dump,data header at 0xad7cc74
===============
tsiz: 0x1f88
hsiz: 0x14
pbl: 0x0ad7cc74
bdba: 0x0700003a
76543210
flag=--------
ntab=1
nrow=1
frre=-1
fsbo=0x14
fseo=0x51
avsp=0x3d
tosp=0x1f74
0xe:pti[0] nrow=1 offs=0
0x12:pri[0] offs=0x51
block_row_dump:
tab 0, row 0, @0x51
tl: 2 fb: ---D-L-- lb: 0x2
end_of_block_dump
End dump data blocks tsn: 27 file#: 28 minblk 58 maxblk 58

可以看到原来没有出现的标识位确实表示的删除,D应为DELETE的含义,而且D并不影响HFL标识,虽然这些标识已经没有意义。但是D会清除PN标识,虽然这些标识也没有意义了。

yangtingkun 发表于:2008.07.04 23:55 ::分类: ( ORACLE ) ::阅读:(323次) :: 评论 (5)
re: 行链接在存储结构上是如何实现的(六) [回复]

fb Flag Byte:
K = Cluster Key (Flags may change meaning if this is set to show HASH cluster)
C = Cluster table member
H = Head piece of row
D = Deleted row
F = First data piece
L = Last data piece
P = First column continues from previous piece
N = Last column continues in next piece

空虚的猫 评论于: 2008.07.08 21:34
re: 行链接在存储结构上是如何实现的(六) [回复]

metalink上还是dsi上面查到的,我倒是没有看到专门的文章。基本上含义都和我推断的一样,只是Oracle的缩写没有猜测出来。

yangtingkun 评论于: 2008.07.10 16:49
re: 行链接在存储结构上是如何实现的(六) [回复]

这个问题我曾经问过你,当时感到很疑惑,后来无意中看到一篇文章讲到这个问题,就记录下来了。

空虚的猫 评论于: 2008.07.13 17:23
re: 行链接在存储结构上是如何实现的(六) [回复]

其实就是针对你的问题写的这几篇文章,不过当时手头的事情比较忙,因此一直拖到前几天。

yangtingkun 评论于: 2008.07.14 15:01
re: 行链接在存储结构上是如何实现的(六) [回复]

谢谢杨老大,分析得很透彻,这几篇文章我都收了。

空虚的猫 评论于: 2008.07.15 13:51

发表评论
标题

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

称呼

邮箱地址(可选)

个人主页(可选)

 authimage


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