程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> ASSM內部存儲研究大揭密

ASSM內部存儲研究大揭密

編輯:Oracle數據庫基礎

一、      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 !vml]--><!--[endif]-->

 

<!--[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表的組成與結構了吧。大家有興趣,可以繼續研究插入與刪除的情況,按照這個方法,應當就很簡單了

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved