一、 ASSM的基本情況
在920以前,表的剩余空間的管理與分配都是由連接列表freelist來完成的,因為freelist存在串行的問題,因此容易引起往往容易引起段頭的爭用與空間的浪費(其實這一點並不明顯),最主要的還是因為需要DBA 花費大量的精力去管理這些爭用並監控表的空間利用。
自動段空間管理(ASSM),它首次出現在Oracle920裡。有了ASSM,連接列表freelist被位圖所取代,它是一個二進制的數組,能夠迅速有效地管理存儲擴展和剩余區塊(free block),因此能夠改善分段存儲本質,ASSM表空間上創建的段還有另外一個稱呼叫Bitmap Managed Segments(BMB 段)。
讓我們看看位圖freelist是如何實現的。我會從使用區段空間管理自動參數創建tablespace開始:
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->
Create tablespace demo
datafile '/ora01/oem/demo01.dbf '
size 5m
EXTENT MANAGEMENT LOCAL -- Turn on LMT
SEGMENT SPACE MANAGEMENT AUTO -- Turn on ASSM;
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->
一旦你定義好了tablespace,那麼表和索引就能夠使用各種方法很容易地被移動到新的tablespace裡,帶有ASSM的本地管理tablespace會略掉任何為PCTUSED、NEXT和FREELISTS所指定的值。
當表格或者索引被分配到這個tablespace以後,用於獨立對象的PCTUSED的值會被忽略,而Oracle9i會使用位圖數組來自動地管理tablespace裡表格和索引的freelist。對於在LMT的tablespace內部創建的表格和索引而言,這個NEXT擴展子句是過時的,因為由本地管理的tablespace會管理它們。但是,INITIAL參數仍然是需要的,因為Oracle不可能提前知道初始表格加載的大小。對於ASSM而言,INITIAL最小的值是三個塊。
新的管理機制用位圖來跟蹤或管理每個分配到對象的塊,每個塊有多少剩余空間根據位圖的狀態來確定,如>75%,50%-75%,25%-50%和<25%,也就是說位圖其實采用了四個狀態位來代替以前的pctused,什麼時候該利用該數據塊則由設定的pctfree來確定。
使用ASSM的一個巨大優勢是,位圖freelist肯定能夠減輕緩沖區忙等待(buffer busy wait)的負擔,這個問題在Oracle9i以前的版本裡曾是一個嚴重的問題。
在沒有多個freelist的時候,每個Oracle表格和索引在表格的頭部都曾有一個數據塊,用來管理對象所使用的剩余區塊,並為任何SQL插入聲明所創建的新數據行提供數據塊。當數據緩沖內的數據塊由於被另一個DML事務處理鎖定而無法使用的時候,緩沖區忙等待就會發生。當你需要將多個任務插入到同一個表格裡的時候,這些任務就被強制等待,而同時Oracle會在同時分派剩余的區塊,一次一個。
有了ASSM之後,Oracle宣稱顯著地提高了DML並發操作的性能,因為(同一個)位圖的不同部分可以被同時使用,這樣就消除了尋找剩余空間的串行化。根據Oracle的測試結果,使用位圖freelist會消除所有分段頭部(對資源)的爭奪,還能獲得超快的並發插入操作。
盡管ASSM顯示出了令人激動的特性並能夠簡化Oracle DBA的工作,但是Oracle9i的位圖分段管理還是有一些局限性的:
· 一旦DBA被分配之後,它就無法控制tablespace內部的獨立表格和索引的存儲行為。
· 你不能夠使用ASSM創建臨時的tablespace。這是由排序時臨時分段的短暫特性所決定的。
· 只有本地管理的tablespace才能夠使用位圖分段管理。
· 使用超高容量的DML(例如INSERT、UPDATE和DELETE等)的時候可能會出現性能上的問題,但是在最新的版本上如9204以上,ASSM也開始了被廣泛的應用。
<!--[if !supportLists]-->二、<!--[endif]-->ASSM到底是怎麼回事,表是怎麼結構的呢?
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->
關鍵字:
ASSM,自動段管理
BMB Segment 位圖段管理
1、我們先創建一個本地管理的表空間,采用段自動管理方式
Create tablespace demo
datafile '/ora01/oem/demo01.dbf '
size 50m
EXTENT MANAGEMENT LOCAL
SEGMENT SPACE MANAGEMENT AUTO;
2、創建同樣一個表
SQL> create table demotab ( x number ) tablespace demo
storage (initial 1000K);
Table created
SQL> select t.table_name,t.initial_extent,t.next_extent,t.pct_free,t.pct_used from user_tables t where t.table_name = 'DEMOTAB';
TABLE_NAME INITIAL_EXTENT NEXT_EXTENT PCT_FREE PCT_USED
------------------------------ -------------- ----------- ---------- ----------
DEMOTAB 1024000 10
可以看到,NEXT_EXTENT與PCT_USED都為空。
3、執行該過程,檢查表的初始狀態
SQL> exec show_space('demotab');
Total Blocks............................128
Total Bytes.............................1048576
Unused Blocks...........................125
Unused Bytes............................1024000
Last Used Ext FileId....................7
Last Used Ext BlockId...................8
Last Used Block.........................3
從這裡我們能看到一些該表的特性,其中最引人注意的就是表頭了,占用了三個塊的大小。
另外一個注意的地方就是該表從第8個塊開始,但是實際上這裡是錯誤的,應當是從第9個塊開始,文件頭占用了64K的空間等於8個塊。
我們從dba_extent中也能看到這樣的信息,實際上是從第9個塊開始的。
SQL> select t.segment_name,t.extent_id,t.block_id from dba_extents t where t.segment_name = 'DEMOTAB';
SEGMENT_NAME EXTENT_ID BLOCK_ID
-------------------------------------------------------------------------------- ---------- ----------
DEMOTAB 0 9
DEMOTAB 1 17
……
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->
4、我直接開始分析第9,10,11個塊(段頭)
SQL> alter system dump datafile 7 block 9;
System altered
SQL> alter system dump datafile 7 block 10;
System altered
SQL> alter system dump datafile 7 block 11;
System altered
Start dump data blocks tsn: 6 file#: 7 minblk 9 maxblk 9
buffer tsn: 6 rdba: 0x06800009 (7/9)
scn: 0x0000.00181a2c seq: 0x01 flg: 0x04 tail: 0x1a2c2001
frmt: 0x02 chkval: 0x30a6 type: 0x20=FIRST LEVEL BITMAP BLOCK
Dump of First Level Bitmap Block
--------------------------------
nbits : 4 nranges: 2 parent dba: 0x0680000a poffset: 0
unformatted: 13 total: 16 first useful block: 3
owning instance : 1
instance ownership changed at
Last successful Search
Freeness Status: nf1 0 nf2 0 nf3 0 nf4 0
Extent Map Block Offset: 4294967295
First free datablock : 3
Bitmap block lock opcode 0
Locker xid: : 0x0000.000.00000000
Highwater:: 0x0680000c ext#: 0 blk#: 3 ext size: 8
#blocks in seg. hdr's freelists: 0
#blocks below: 0
mapblk 0x00000000 offset: 0
HWM Flag: HWM Set
--------------------------------------------------------
DBA Ranges :
--------------------------------------------------------
0x06800009 Length: 8 Offset: 0
0x06800011 Length: 8 Offset: 8
0:Metadata 1:Metadata 2:Metadata 3:unformatted
4:unformatted 5:unformatted 6:unformatted 7:unformatted
8:unformatted 9:unformatted 10:unformatted 11:unformatted
12:unformatted 13:unformatted 14:unformatted 15:unformatted
--------------------------------------------------------
End dump data blocks tsn: 6 file#: 7 minblk 9 maxblk 9
Start dump data blocks tsn: 6 file#: 7 minblk 10 maxblk 10
buffer tsn: 6 rdba: 0x0680000a (7/10)
scn: 0x0000.00181a39 seq: 0x01 flg: 0x04 tail: 0x1a392101
frmt: 0x02 chkval: 0x2738 type: 0x21=SECOND LEVEL BITMAP BLOCK
Dump of Second Level Bitmap Block
number: 8 nfree: 8 ffree: 0 pdba: 0x0680000b
opcode:0
xid:
L1 Ranges :
--------------------------------------------------------
0x06800009 Free: 5 Inst: 1
0x06800019 Free: 5 Inst: 1
0x06800029 Free: 5 Inst: 1
0x06800039 Free: 5 Inst: 1
0x06800049 Free: 5 Inst: 1
0x06800059 Free: 5 Inst: 1
0x06800069 Free: 5 Inst: 1
0x06800079 Free: 5 Inst: 1
--------------------------------------------------------
End dump data blocks tsn: 6 file#: 7 minblk 10 maxblk 10
Start dump data blocks tsn: 6 file#: 7 minblk 11 maxblk 11
buffer tsn: 6 rdba: 0x0680000b (7/11)
scn: 0x0000.00181a3d seq: 0x01 flg: 0x04 tail: 0x1a3d2301
frmt: 0x02 chkval: 0x4904 type: 0x23=PAGETABLE SEGMENT HEADER
Extent Control Header
-----------------------------------------------------------------
Extent Header:: spare1: 0 spare2: 0 #extents: 16 #blocks: 128
last map 0x00000000 #maps: 0 offset: 2716
Highwater:: 0x0680000c ext#: 0 blk#: 3 ext size: 8
#blocks in seg. hdr's freelists: 0
#blocks below: 0
mapblk 0x00000000 offset: 0
Unlocked
--------------------------------------------------------
Low HighWater Mark :
Highwater:: 0x0680000c ext#: 0 blk#: 3 ext size: 8
#blocks in seg. hdr's freelists: 0
#blocks below: 0
mapblk 0x00000000 offset: 0
Level 1 BMB for High HWM block: 0x06800009
Level 1 BMB for Low HWM block: 0x06800009
--------------------------------------------------------
Segment Type: 1 nl2: 1 blksz: 8192 fbsz: 0
L2 Array start offset: 0x00001434
First Level 3 BMB: 0x00000000
L2 Hint for inserts: 0x0680000a
Last Level 1 BMB: 0x06800079
Last Level II BMB: 0x0680000a
Last Level III BMB: 0x00000000
Map Header:: next 0x00000000 #extents: 16 obj#: 29929 flag: 0x20000000
Extent Map
-----------------------------------------------------------------
0x06800009 length: 8
0x06800011 length: 8
0x06800019 length: 8
0x06800021 length: 8
0x06800029 length: 8
0x06800031 length: 8
0x06800039 length: 8
0x06800041 length: 8
0x06800049 length: 8
0x06800051 length: 8
0x06800059 length: 8
0x06800061 length: 8
0x06800069 length: 8
0x06800071 length: 8
0x06800079 length: 8
0x06800081 length: 8
Auxillary Map
--------------------------------------------------------
Extent 0 : L1 dba: 0x06800009 Data dba: 0x0680000c
Extent 1 : L1 dba: 0x06800009 Data dba: 0x06800011
Extent 2 : L1 dba: 0x06800019 Data dba: 0x0680001a
Extent 3 : L1 dba: 0x06800019 Data dba: 0x06800021
Extent 4 : L1 dba: 0x06800029 Data dba: 0x0680002a
Extent 5 : L1 dba: 0x06800029 Data dba: 0x06800031
Extent 6 : L1 dba: 0x06800039 Data dba: 0x0680003a
Extent 7 : L1 dba: 0x06800039 Data dba: 0x06800041
Extent 8 : L1 dba: 0x06800049 Data dba: 0x0680004a
Extent 9 : L1 dba: 0x06800049 Data dba: 0x06800051
Extent 10 : L1 dba: 0x06800059 Data dba: 0x0680005a
Extent 11 : L1 dba: 0x06800059 Data dba: 0x06800061
Extent 12 : L1 dba: 0x06800069 Data dba: 0x0680006a
Extent 13 : L1 dba: 0x06800069 Data dba: 0x06800071
Extent 14 : L1 dba: 0x06800079 Data dba: 0x0680007a
Extent 15 : L1 dba: 0x06800079 Data dba: 0x06800081
--------------------------------------------------------
Second Level Bitmap block DBAs
--------------------------------------------------------
DBA 1: 0x0680000a
End dump data blocks tsn: 6 file#: 7 minblk 11 maxblk 11
從這裡,我們能獲得什麼信息?這個是很重要的。
分析塊9,這個塊叫FIRST LEVEL BITMAP BLOCK。我們可以看到,這裡保留了16個塊的信息(注意,不是16個區間的信息),它記錄的是塊的空間使用信息,開始16個塊中間有3個塊是Metadata類型(塊9,10,11),這部分塊就是以下將要說明的位圖塊與段頭塊,因為不能存放數據,所以標記為Metadata類型。除此之外,其它的都是未使用的數據塊類型為unformatted,有13個。
問題?為什麼這裡只保留16個塊的信息呢?這需要我們進一步研究(往下看)。
分析塊10,叫SECOND LEVEL BITMAP BLOCK。這個就比較有意思了,記錄了可能出現的類似於塊9的塊出現的地址(DBA)。剛才在上面不是說了嗎,塊9只能記錄16個塊的信息,那16個塊之後的信息怎麼辦?BMB段采用了分布的策略,在第25個塊的地方,Oracle將增加一個新的塊用來記錄下16個塊(等會兒看測試),那麼塊10記錄的就是這些塊的地址了,如:
0x06800019 Free: 5 Inst: 1 代表下一個塊的地址是19(十六進制),其實是就是十進制的25。那麼我們想象,再下一個是25+16=41。應當是十六進制的29,再查看塊10的內容,大家可以知道這個塊的作用了吧。
再看塊11,是該表的段頭,這裡記錄了表的區間地圖,包括表段的16個區間的分布地址,如果沒有創建表,是沒有該塊的,這個塊與ASSM位圖塊本身沒有多大關系,在每個段的頭部都會有一個,因為這個是該表空間的第一個段,所以位置放在了塊11。
可以看到其實在ASSM的表裡面,取消了原來的freelist,其實增加了很多塊來管理塊的數據,這些塊不再分布在塊的頭部,而是分布在表的內部,每隔16個塊(這個數目與不同的環境可能有差別),就有一個塊來記錄下16個塊的數據保留的情況。
位圖數據的級別可以分為三個級別,當存在一個或多個一級位圖塊(如塊9,19)的時候,將由二級位圖(如塊10)塊來保存一級位圖塊的地址,同理,一個二級位圖塊不夠使用而出現多個二級位圖塊的時候,將由三級位圖塊來保存二級位圖塊的地址(類似索引結構,由於三級位圖塊的出現需要很多數據塊,所以這裡不討論三級位圖塊)。整個位圖數組的結構形成一個樹狀結構,有利於Oracle跟蹤所有的位圖數據塊的位置。
附圖:
<!--[if !supportLists]-->三、 <!--[endif]-->我們開始插入數據,進一步說明情況。
SQL>insert into demotab
select rownum from dba_objects;
28985 rows inserted;
然後我們運行
SQL> exec show_space('demotab');
Total Blocks............................128
Total Bytes.............................1048576
Unused Blocks...........................72
Unused Bytes............................589824
Last Used Ext FileId....................26
Last Used Ext BlockId...................56
Last Used Block.........................8
這裡有一個新的過程,用於專門分析自動段管理的段中的塊的組成
declare
v_unformatted_blocks number;
v_unformatted_bytes number;
v_fs1_blocks number;
v_fs1_bytes number;
v_fs2_blocks number;
v_fs2_bytes number;
v_fs3_blocks number;
v_fs3_bytes number;
v_fs4_blocks number;
v_fs4_bytes number;
v_full_blocks number;
v_full_bytes number;
begin
dbms_space.space_usage ('SYS', 'DEMOTAB', 'TABLE', v_unformatted_blocks,
v_unformatted_bytes, v_fs1_blocks, v_fs1_bytes, v_fs2_blocks, v_fs2_bytes,
v_fs3_blocks, v_fs3_bytes, v_fs4_blocks, v_fs4_bytes, v_full_blocks, v_full_bytes);
dbms_output.put_line('Unformatted Blocks = '||v_unformatted_blocks);
dbms_output.put_line('FS1 Blocks = '||v_fs1_blocks);
dbms_output.put_line('FS2 Blocks = '||v_fs2_blocks);
dbms_output.put_line('FS3 Blocks = '||v_fs3_blocks);
dbms_output.put_line('FS4 Blocks = '||v_fs4_blocks);
dbms_output.put_line('Full Blocks = '||v_full_blocks);
end;/
Unformatted Blocks = 0
FS1 Blocks = 1
FS2 Blocks = 0
FS3 Blocks = 0
FS4 Blocks = 6
Full Blocks = 43
PL/SQL procedure successfully completed
在這裡
FS1表示0-25%空閒空間的塊
FS2表示25-50%空閒空間的塊
FS3表示50-75%空閒空間的塊
FS4表示 75-100%空閒空間的塊
這裡我們能看到什麼呢?
可以看到的是,
Total Blocks............................128
Unused Blocks...........................72
就是說,我們這次插入用了56個塊。
但是看下面的數據,也就是數據塊只有1+6+43=50個,還有6個的差別在哪裡呢?我們已知的就是段頭有3個,那還有3個應當就是分布在表中的位圖塊了(假定)。我們進一步分析。
用了56個塊,其實就是7個區間,7個區間,每個位圖塊只能管理16個塊(2個區間),這裡應當用到了4個位圖塊才能夠管理過來,4個中有一個屬於段頭的3個,那正好是50+3+3=56了。我們進一步分析。
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->
再看那段頭變成什麼樣了?
Start dump data blocks tsn: 6 file#: 7 minblk 9 maxblk 9
buffer tsn: 6 rdba: 0x06800009 (7/9)
scn: 0x0000.0018b7ca seq: 0x2d flg: 0x00 tail: 0xb7ca202d
frmt: 0x02 chkval: 0x0000 type: 0x20=FIRST LEVEL BITMAP BLOCK
Dump of First Level Bitmap Block
--------------------------------
nbits : 4 nranges: 2 parent dba: 0x0680000a poffset: 0
unformatted: 0 total: 16 first useful block: 3
owning instance : 1
instance ownership changed at 08/19/2003 10:41:42
Last successful Search 08/19/2003 10:41:42
Freeness Status: nf1 0 nf2 0 nf3 0 nf4 0
Extent Map Block Offset: 4294967295
First free datablock : 16
Bitmap block lock opcode 0
Locker xid: : 0x0000.000.00000000
Highwater:: 0x00000000 ext#: 0 blk#: 0 ext size: 0
#blocks in seg. hdr's freelists: 0
#blocks below: 0
mapblk 0x00000000 offset: 0
HWM Flag: Not Set
--------------------------------------------------------
DBA Ranges :
--------------------------------------------------------
0x06800009 Length: 8 Offset: 0
0x06800011 Length: 8 Offset: 8
0:Metadata 1:Metadata 2:Metadata 3:FULL
4:FULL 5:FULL 6:FULL 7:FULL
8:FULL 9:FULL 10:FULL 11:FULL
12:FULL 13:FULL 14:FULL 15:FULL
--------------------------------------------------------
End dump data blocks tsn: 6 file#: 7 minblk 9 maxblk 9
Start dump data blocks tsn: 6 file#: 7 minblk 10 maxblk 10
buffer tsn: 6 rdba: 0x0680000a (7/10)
scn: 0x0000.0018b7cb seq: 0x07 flg: 0x00 tail: 0xb7cb2107
frmt: 0x02 chkval: 0x0000 type: 0x21=SECOND LEVEL BITMAP BLOCK
Dump of Second Level Bitmap Block
number: 8 nfree: 5 ffree: 3 pdba: 0x0680000b
opcode:0
xid:
L1 Ranges :
--------------------------------------------------------
0x06800009 Free: 1 Inst: 1
0x06800019 Free: 1 Inst: 1
0x06800029 Free: 1 Inst: 1
0x06800039 Free: 5 Inst: 1
0x06800049 Free: 5 Inst: 1
0x06800059 Free: 5 Inst: 1
0x06800069 Free: 5 Inst: 1
0x06800079 Free: 5 Inst: 1
--------------------------------------------------------
End dump data blocks tsn: 6 file#: 7 minblk 10 maxblk 10
Start dump data blocks tsn: 6 file#: 7 minblk 11 maxblk 11
buffer tsn: 6 rdba: 0x0680000b (7/11)
scn: 0x0000.0018b7cb seq: 0x03 flg: 0x00 tail: 0xb7cb2303
frmt: 0x02 chkval: 0x0000 type: 0x23=PAGETABLE SEGMENT HEADER
Extent Control Header
-----------------------------------------------------------------
Extent Header:: spare1: 0 spare2: 0 #extents: 16 #blocks: 128
last map 0x00000000 #maps: 0 offset: 2716
Highwater:: 0x06800041 ext#: 6 blk#: 8 ext size: 8
#blocks in seg. hdr's freelists: 0
#blocks below: 50
mapblk 0x00000000 offset: 6
Unlocked
--------------------------------------------------------
Low HighWater Mark :
Highwater:: 0x0680000c ext#: 0 blk#: 3 ext size: 8
#blocks in seg. hdr's freelists: 0
#blocks below: 0
mapblk 0x00000000 offset: 0
Level 1 BMB for High HWM block: 0x06800039
Level 1 BMB for Low HWM block: 0x06800009
--------------------------------------------------------
Segment Type: 1 nl2: 1 blksz: 8192 fbsz: 0
L2 Array start offset: 0x00001434
First Level 3 BMB: 0x00000000
L2 Hint for inserts: 0x0680000a
Last Level 1 BMB: 0x06800079
Last Level II BMB: 0x0680000a
Last Level III BMB: 0x00000000
Map Header:: next 0x00000000 #extents: 16 obj#: 29929 flag: 0x20000000
Extent Map
-----------------------------------------------------------------
0x06800009 length: 8
0x06800011 length: 8
0x06800019 length: 8
0x06800021 length: 8
0x06800029 length: 8
0x06800031 length: 8
0x06800039 length: 8
0x06800041 length: 8
0x06800049 length: 8
0x06800051 length: 8
0x06800059 length: 8
0x06800061 length: 8
0x06800069 length: 8
0x06800071 length: 8
0x06800079 length: 8
0x06800081 length: 8
Auxillary Map
--------------------------------------------------------
Extent 0 : L1 dba: 0x06800009 Data dba: 0x0680000c
Extent 1 : L1 dba: 0x06800009 Data dba: 0x06800011
Extent 2 : L1 dba: 0x06800019 Data dba: 0x0680001a
Extent 3 : L1 dba: 0x06800019 Data dba: 0x06800021
Extent 4 : L1 dba: 0x06800029 Data dba: 0x0680002a
Extent 5 : L1 dba: 0x06800029 Data dba: 0x06800031
Extent 6 : L1 dba: 0x06800039 Data dba: 0x0680003a
Extent 7 : L1 dba: 0x06800039 Data dba: 0x06800041
Extent 8 : L1 dba: 0x06800049 Data dba: 0x0680004a
Extent 9 : L1 dba: 0x06800049 Data dba: 0x06800051
Extent 10 : L1 dba: 0x06800059 Data dba: 0x0680005a
Extent 11 : L1 dba: 0x06800059 Data dba: 0x06800061
Extent 12 : L1 dba: 0x06800069 Data dba: 0x0680006a
Extent 13 : L1 dba: 0x06800069 Data dba: 0x06800071
Extent 14 : L1 dba: 0x06800079 Data dba: 0x0680007a
Extent 15 : L1 dba: 0x06800079 Data dba: 0x06800081
--------------------------------------------------------
Second Level Bitmap block DBAs
--------------------------------------------------------
DBA 1: 0x0680000a
End dump data blocks tsn: 6 file#: 7 minblk 11 maxblk 11
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->
看塊9,可以看到,段頭的三個塊沒有動。另外的13個塊都是FULL(100%充滿)狀態。
看塊10,可以看到,充分利用的位圖塊的位置是:
0x06800009 Free: 1 Inst: 1 --對應9
0x06800019 Free: 1 Inst: 1 --對應25
0x06800029 Free: 1 Inst: 1 --對應41
應當還有一個不完全利用的
0x06800039 Free: 5 Inst: 1 --對應57
下面我們證實一下
塊25的信息:
Start dump data blocks tsn: 6 file#: 7 minblk 25 maxblk 25
buffer tsn: 6 rdba: 0x06800019 (7/25)
scn: 0x0000.0018b7cb seq: 0x0e flg: 0x04 tail: 0xb7cb200e
frmt: 0x02 chkval: 0x261c type: 0x20=FIRST LEVEL BITMAP BLOCK
Dump of First Level Bitmap Block
--------------------------------
nbits : 4 nranges: 2 parent dba: 0x0680000a poffset: 1
unformatted: 0 total: 16 first useful block: 1
owning instance : 1
instance ownership changed at 08/19/2003 10:41:42
Last successful Search 08/19/2003 10:41:42
Freeness Status: nf1 0 nf2 0 nf3 0 nf4 0
Extent Map Block Offset: 4294967295
First free datablock : 16
Bitmap block lock opcode 0
Locker xid: : 0x0000.000.00000000
Highwater:: 0x00000000 ext#: 0 blk#: 0 ext size: 0
#blocks in seg. hdr's freelists: 0
#blocks below: 0
mapblk 0x00000000 offset: 0
HWM Flag: Not Set
--------------------------------------------------------
DBA Ranges :
--------------------------------------------------------
0x06800019 Length: 8 Offset: 0
0x06800021 Length: 8 Offset: 8
0:Metadata 1:FULL 2:FULL 3:FULL
4:FULL 5:FULL 6:FULL 7:FULL
8:FULL 9:FULL 10:FULL 11:FULL
12:FULL 13:FULL 14:FULL 15:FULL
--------------------------------------------------------
End dump data blocks tsn: 6 file#: 7 minblk 25 maxblk 25
塊41的信息
Start dump data blocks tsn: 6 file#: 7 minblk 41 maxblk 41
buffer tsn: 6 rdba: 0x06800029 (7/41)
scn: 0x0000.0018b7cb seq: 0x35 flg: 0x04 tail: 0xb7cb2035
frmt: 0x02 chkval: 0x260f type: 0x20=FIRST LEVEL BITMAP BLOCK
Dump of First Level Bitmap Block
--------------------------------
nbits : 4 nranges: 2 parent dba: 0x0680000a poffset: 2
unformatted: 0 total: 16 first useful block: 1
owning instance : 1
instance ownership changed at 08/19/2003 10:41:42
Last successful Search 08/19/2003 10:41:42
Freeness Status: nf1 0 nf2 0 nf3 0 nf4 0
Extent Map Block Offset: 4294967295
First free datablock : 16
Bitmap block lock opcode 0
Locker xid: : 0x0000.000.00000000
Highwater:: 0x00000000 ext#: 0 blk#: 0 ext size: 0
#blocks in seg. hdr's freelists: 0
#blocks below: 0
mapblk 0x00000000 offset: 0
HWM Flag: Not Set
--------------------------------------------------------
DBA Ranges :
--------------------------------------------------------
0x06800029 Length: 8 Offset: 0
0x06800031 Length: 8 Offset: 8
0:Metadata 1:FULL 2:FULL 3:FULL
4:FULL 5:FULL 6:FULL 7:FULL
8:FULL 9:FULL 10:FULL 11:FULL
12:FULL 13:FULL 14:FULL 15:FULL
--------------------------------------------------------
End dump data blocks tsn: 6 file#: 7 minblk 41 maxblk 41
塊57的信息
Start dump data blocks tsn: 6 file#: 7 minblk 57 maxblk 57
buffer tsn: 6 rdba: 0x06800039 (7/57)
scn: 0x0000.0018b7cb seq: 0x04 flg: 0x04 tail: 0xb7cb2004
frmt: 0x02 chkval: 0x27d2 type: 0x20=FIRST LEVEL BITMAP BLOCK
Dump of First Level Bitmap Block
--------------------------------
nbits : 4 nranges: 2 parent dba: 0x0680000a poffset: 3
unformatted: 8 total: 16 first useful block: 1
owning instance : 1
instance ownership changed at 08/19/2003 10:41:42
Last successful Search 08/19/2003 10:41:42
Freeness Status: nf1 1 nf2 0 nf3 0 nf4 6
Extent Map Block Offset: 4294967295
First free datablock : 1
Bitmap block lock opcode 0
Locker xid: : 0x0000.000.00000000
Highwater:: 0x06800041 ext#: 6 blk#: 8 ext size: 8
#blocks in seg. hdr's freelists: 0
#blocks below: 50
mapblk 0x00000000 offset: 6
HWM Flag: HWM Set
--------------------------------------------------------
DBA Ranges :
--------------------------------------------------------
0x06800039 Length: 8 Offset: 0
0x06800041 Length: 8 Offset: 8
0:Metadata 1:75-100% free 2:75-100% free 3:75-100% free
4:75-100% free 5:75-100% free 6:75-100% free 7:0-25% free
8:unformatted 9:unformatted 10:unformatted 11:unformatted
12:unformatted 13:unformatted 14:unformatted 15:unformatted
--------------------------------------------------------
End dump data blocks tsn: 6 file#: 7 minblk 57 maxblk 57
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->
塊9:2個段頭+1個位圖+13個FULL
塊25:1個位圖+15個FULL
塊41:1個位圖+15個FULL
塊57:1個位圖+6個75-100% free+1個0-25% free
大家可以看到正好滿足上面的:
FS1 Blocks = 1
FS2 Blocks = 0
FS3 Blocks = 0
FS4 Blocks = 6
Full Blocks = 43
到這裡,大家也明白了
3*16+8=56了
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->
最後,我們討論高水點的確定。
到這裡,大家該知道高水點的位置是多少了吧,應該是56+8(文件頭)+1=65。但是看我們的塊11,怎麼解釋這個呢?
Highwater:: 0x06800041 ext#: 6 blk#: 8 ext size: 8
#blocks in seg. hdr's freelists: 0
#blocks below: 50
mapblk 0x00000000 offset: 6
Unlocked
--------------------------------------------------------
Low HighWater Mark :
Highwater:: 0x0680000c ext#: 0 blk#: 3 ext size: 8
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->
其中有兩個Highwater,第一個記錄了真正的高水點,H41,就是十進制65。第二個表示底的高水點,從哪裡開始,很明顯,從12(十六進制的c)個塊開始(前面是8個文件頭+3個段頭)。其實,我們從最後一個位圖塊(57)的dump中也可以看到這樣的信息
Locker xid: : 0x0000.000.00000000
Highwater:: 0x06800041 ext#: 6 blk#: 8 ext size: 8
到這裡,該明白ASSM表的組成與結構了吧。大家有興趣,可以繼續研究插入與刪除的情況,按照這個方法,應當就很簡單了