LMT下表FREELIST的初步探索
2024-07-21 02:36:10
供稿:網友
由于LMT下不再具有freelist參數,但理解了freelist的作用后都知道,這是難以通過其他途徑來解決的,freelist本身的作用不可抹殺,具有很多的好處,據說Oracle其中一個副總裁當初是一個程序員,就是因為在 空間治理和分配算法中的出色表現而平步青云的, 其中最重要的一環就是 freelist 的設計
廢話不說了
根據兩個表(LMT0,LMT1)的實驗可以看出:
SQL> begin
2 for i in 1..10000 loop
3 insert into lmt0 values(i);
4 end loop;
5 end;
6 /
我們這時來看 segment header :
*** 2003-02-18 10:07:19.984
Start dump data blocks tsn: 7 file#: 8 minblk 9 maxblk 9
buffer tsn: 7 rdba: 0x02000009 (8/9)
scn: 0x0000.0008dc4a seq: 0x03 flg: 0x00 tail: 0xdc4a1003
frmt: 0x02 chkval: 0x0000 type: 0x10=DATA SEGMENT HEADER - UNLIMITED
Extent Control Header
-----------------------------------------------------------------
Extent Header:: spare1: 0 space2: 0 #extents: 4 #blocks: 63
last map 0x00000000 #maps: 0 offset: 4128
Highwater:: 0x02000023 ext#: 1 blk#: 10 ext size: 16
#blocks in seg. hdr's freelists: 10
#blocks below: 25
mapblk 0x00000000 offset: 1
Unlocked
Map Header:: next 0x00000000 #extents: 4 obj#: 25098 flag: 0x40000000
Extent Map
-----------------------------------------------------------------
0x0200000a length: 15
0x02000019 length: 16
0x02000029 length: 16
0x020000d9 length: 16
nfl = 1, nfb = 1 typ = 1 nxf = 0
SEG LST:: flg: USED lhd: 0x02000019 ltl: 0x02000022
End dump data blocks tsn: 7 file#: 8 minblk 9 maxblk 9
我們發現:
#blocks in seg. hdr's freelists: 10 freeslit從0變成了10,
但暫時只有一個freelist被使用: SEG LST:: flg: USED lhd: 0x02000019 ltl: 0x02000022
再看另一個表:
SQL> insert into lmt1 select rownum from all_objects;
已創建24746行。
SQL> commit;
Start dump data blocks tsn: 7 file#: 8 minblk 57 maxblk 57
buffer tsn: 7 rdba: 0x02000039 (8/57)
scn: 0x0000.0008dc60 seq: 0x02 flg: 0x00 tail: 0xdc601002
frmt: 0x02 chkval: 0x0000 type: 0x10=DATA SEGMENT HEADER - UNLIMITED
Extent Control Header
-----------------------------------------------------------------
Extent Header:: spare1: 0 space2: 0 #extents: 10 #blocks: 159
last map 0x00000000 #maps: 0 offset: 4128
Highwater:: 0x02000063 ext#: 2 blk#: 10 ext size: 16
#blocks in seg. hdr's freelists: 4
#blocks below: 41
mapblk 0x00000000 offset: 2
Unlocked
Map Header:: next 0x00000000 #extents: 10 obj#: 25099 flag: 0x40000000
Extent Map
-----------------------------------------------------------------
0x0200003a length: 15
0x02000049 length: 16
0x02000059 length: 16
0x02000069 length: 16
0x02000079 length: 16
0x02000089 length: 16
0x02000099 length: 16
0x020000a9 length: 16
0x020000b9 length: 16
0x020000c9 length: 16
nfl = 1, nfb = 1 typ = 1 nxf = 0
SEG LST:: flg: USED lhd: 0x0200005f ltl: 0x02000062
End dump data blocks tsn: 7 file#: 8 minblk 57 maxblk 57
我們發現這樣插入的時候,
#blocks in seg. hdr's freelists: 4
SEG LST:: flg: USED lhd: 0x0200005f ltl: 0x02000062
再繼續插入:
SQL> begin for i in 1..10000 loop
2 insert into lmt1 values(i);
3 end loop;
4 end;
5 /
PL/SQL 過程已成功完成。
這個時候再看segment header:
Start dump data blocks tsn: 7 file#: 8 minblk 57 maxblk 57
buffer tsn: 7 rdba: 0x02000039 (8/57)
scn: 0x0000.0008dcbc seq: 0x01 flg: 0x00 tail: 0xdcbc1001
frmt: 0x02 chkval: 0x0000 type: 0x10=DATA SEGMENT HEADER - UNLIMITED
Extent Control Header
-----------------------------------------------------------------
Extent Header:: spare1: 0 space2: 0 #extents: 10 #blocks: 159
last map 0x00000000 #maps: 0 offset: 4128
Highwater:: 0x02000073 ext#: 3 blk#: 10 ext size: 16
#blocks in seg. hdr's freelists: 5
#blocks below: 57
mapblk 0x00000000 offset: 3
Unlocked
Map Header:: next 0x00000000 #extents: 10 obj#: 25099 flag: 0x40000000
Extent Map
-----------------------------------------------------------------
0x0200003a length: 15
0x02000049 length: 16
0x02000059 length: 16
0x02000069 length: 16
0x02000079 length: 16
0x02000089 length: 16
0x02000099 length: 16
0x020000a9 length: 16
0x020000b9 length: 16
0x020000c9 length: 16
nfl = 1, nfb = 1 typ = 1 nxf = 0
SEG LST:: flg: USED lhd: 0x0200006e ltl: 0x02000072
End dump data blocks tsn: 7 file#: 8 minblk 57 maxblk 57
*** 2003-02-18 10:21:23.171
我們發現:
#blocks in seg. hdr's freelists: 5
SEG LST:: flg: USED lhd: 0x0200006e ltl: 0x02000072
這個時候找到 lhd: 0x0200006e 這個塊來看:
Start dump data blocks tsn: 7 file#: 8 minblk 110 maxblk 110
buffer tsn: 7 rdba: 0x0200006e (8/110)
scn: 0x0000.0008dcbe seq: 0x10 flg: 0x00 tail: 0xdcbe0610
frmt: 0x02 chkval: 0x0000 type: 0x06=trans data
Block header dump: 0x0200006e
Object id on Block? Y
seg/obj: 0x620b csc: 0x00.8dc9e itc: 1 flg: O typ: 1 - DATA
fsl: 0 fnx: 0x200006f ver: 0x01
Itl Xid Uba Flag Lck Scn/Fsc
0x01 xid: 0x0006.049.000000c1 uba: 0x008005ae.00c4.10 ---- 322 fsc 0x0000.00000000
data_block_dump
===============
tsiz: 0x1fb8
hsiz: 0x296
pbl: 0x08196c44
bdba: 0x0200006e
flag=-----------
ntab=1
nrow=322
frre=-1
fsbo=0x296
fSEO=0x16ee
avsp=0x11d0
tosp=0x11d0
0xeti[0] nrow=322 offs=0
0x12ri[0] offs=0x1fb1
0x14ri[1] offs=0x1faa
0x16ri[2] offs=0x1fa3
該塊中:有 0xeti[0] nrow=322 offs=0 可看出已經插入 322 條數據
因為該塊是 : 0x200006e, 所以該塊freelist指向的next 是下面所指
fsl: 0 fnx: 0x200006f ver: 0x01
由此可以看出,LMT在本質上,和 DMT的freelist是一樣的原理
只不過在擴展和治理的算法上有了重大差異
但到底這個算法是怎樣的,暫時不得而知了
FW:
關于LMT的存儲結構問題
順便簡單交代一下:
如上:
Map Header:: next 0x00000000 #extents: 4 obj#: 25098 flag: 0x40000000
Extent Map
-----------------------------------------------------------------
0x0200000a length: 15
0x02000019 length: 16
0x02000029 length: 16
0x020000d9 length: 16
由于 空間的擴展,
可能會有多個塊被用來記錄 bitmap ,在本例子中只有一個塊記錄,所以
Map Header:: next 0x00000000 #extents: 4 obj#: 25098
next 是沒有值的, 該表只有4 extents ,obj編號 25098
0x0200000a length: 15 表示,該 extent 從 0x0200000a 這個塊開始,一共15塊
之所以這里是15而后面都是16是因為有一個block被多做了 segment geader
我們可以看出
0x0200000a + 15 正好是 0x02000019 ,這表示這兩個extent是連續的