理解儲存結構2,理解儲存結構
接上篇http://blog.csdn.net/ashic/article/details/44117867
上篇中我們dump出了L1 L2 L3塊,現在來瞭解一下它們中包含的資訊
內容 |
注釋 |
L1 |
FIRST LEVEL BITMAP BLOCK |
L2 |
SECOND LEVEL BITMAP BLOCK |
L3(段頭) |
PAGETABLE SEGMENT HEADER |
通過上面的表格再去看Dump檔案我們可以很清楚的發現
在這個uniform size 1M的資料表空間中,一個區中又兩個L1塊,1個L2,1個L3
第一個L1塊中
Dump of First Level Bitmap Block -------------------------------- nbits : 4 nranges: 1 parent dba: 0x01800082 poffset: 0 unformatted: 60 total: 64 first useful block: 4 owning instance : 1 instance ownership changed at 03/07/2015 17:19:38 Last successful Search 03/07/2015 17:19:38 Freeness Status: nf1 0 nf2 0 nf3 0 nf4 0 Extent Map Block Offset: 4294967295 First free datablock : 4 Bitmap block lock opcode 9 Locker xid: : 0x0006.020.00000594 Dealloc scn: 2275418.0 Flag: 0x00000021 (OBJD/-/-/-/-/HWM) Inc #: 0 Objd: 77412 HWM Flag: HWM Set Highwater:: 0x01800084 ext#: 0 blk#: 4 ext size: 128 #blocks in seg. hdr's freelists: 0 #blocks below: 0 mapblk 0x00000000 offset: 0
parent dba: 0x01800082表是管理它的L2塊位置
可以通過DBMS_UTILITY.DATA_BLOCK_ADDRESS包來得出L1塊位置
sys@PROD>select dbms_utility.data_block_address_file(TO_NUMBER('&entervalue', 'XXXXXXXX')) file_id,dbms_utility.data_block_address_block(TO_NUMBER('&entervalue', 'XXXXXXXX')) block_id from dual;Enter value for entervalue: 01800082Enter value for entervalue: 01800082 FILE_ID BLOCK_ID---------- ---------- 6 130
unformatted: 60 total: 64 first useful block: 4
表示未格式化的塊有60個,此L1總共管理64個資料區塊,第一個可用的資料區塊是4號塊,也就是6號檔案的132號塊
HWM Flag: HWM Set Highwater:: 0x01800084 ext#: 0 blk#: 4 ext size: 128
高水位先在 0x01800084 也就是6號檔案第132好塊,這是因為FAN表在我剛才的實驗中被TRUNCATE了沒有資料,所以高水位線在第一個可用塊
需要注意的一點是,ASSM中高水位線的移動規則是: 當在區中插入第一行時,高水點移到區的第一個 L1
塊中最大的資料區塊後。然後在移動到第二個L2塊中最大的資料區塊後,以此類推
ext#:0 表示第一個區
blk#:4 第四個塊
ext size: 128 該區包含128個塊
-------------------------------------------------------- DBA Ranges : -------------------------------------------------------- 0x01800080 Length: 64 Offset: 0 0:Metadata 1:Metadata 2:Metadata 3:Metadata 4:unformatted 5:unformatted 6:unformatted 7:unformatted 8:unformatted 9:unformatted 10:unformatted 11:unformatted 12:unformatted 13:unformatted 14:unformatted 15:unformatted 16:unformatted 17:unformatted 18:unformatted 19:unformatted 20:unformatted 21:unformatted 22:unformatted 23:unformatted 24:unformatted 25:unformatted 26:unformatted 27:unformatted 28:unformatted 29:unformatted 30:unformatted 31:unformatted 32:unformatted 33:unformatted 34:unformatted 35:unformatted 36:unformatted 37:unformatted 38:unformatted 39:unformatted 40:unformatted 41:unformatted 42:unformatted 43:unformatted 44:unformatted 45:unformatted 46:unformatted 47:unformatted 48:unformatted 49:unformatted 50:unformatted 51:unformatted 52:unformatted 53:unformatted 54:unformatted 55:unformatted 56:unformatted 57:unformatted 58:unformatted 59:unformatted 60:unformatted 61:unformatted 62:unformatted 63:unformatted --------------------------------------------------------
0x01800080表示L1塊的位置
可以通過DBMS_UTILITY.DATA_BLOCK_ADDRESS包來得出L1塊位置
sys@PROD>set verify offsys@PROD>select dbms_utility.data_block_address_file(TO_NUMBER('&entervalue', 'XXXXXXXX')) file_id,dbms_utility.data_block_address_block(TO_NUMBER('&entervalue', 'XXXXXXXX')) block_id from dual;Enter value for entervalue: 01800080Enter value for entervalue: 01800080 FILE_ID BLOCK_ID---------- ---------- 6 128
這裡塊號其實不用包可以直接算
繼續看我們可以發現L1塊中管理了64個資料區塊,即128~191塊
通過>75%,50%-75%,25%-50%和<25%來標記塊的使用方式
目前我們的L1中管理的64個塊0~3號塊為metadata塊,就是128,129,130,131塊
4~63這60個塊是資料區塊,狀態為unformatted未格式化
什麼是未格式化?
在上一篇中我們說過,初始情況下,表ID和段ID是一樣的
scott@PROD>select object_id,data_object_id from dba_objects where object_name='FAN'; OBJECT_ID DATA_OBJECT_ID---------- -------------- 77411 77411
表ID一旦建立就不會變化,但是段ID會變化,比如當Truncate該表後
scott@PROD>truncate table fan;Table truncated.scott@PROD>select object_id,data_object_id from dba_objects where object_name='FAN'; OBJECT_ID DATA_OBJECT_ID---------- -------------- 77411 77412
段ID和表ID不同後,格式化了的塊就是塊中記錄的seg/obj號為段ID
沒格式化的就是和truncate前的段ID一樣
可以dump一個未格式化的快查看seg/obj,比較一下就知道了,我就不做實驗了
繼續看L2塊
第二個L1和第一個L1差不多,不說了,看L2
Dump of Second Level Bitmap Block number: 2 nfree: 2 ffree: 0 pdba: 0x01800083 Inc #: 0 Objd: 77412 opcode:4 xid: L1 Ranges : -------------------------------------------------------- 0x01800080 Free: 5 Inst: 1 0x01800081 Free: 5 Inst: 1 --------------------------------------------------------
L2塊中記錄了pdba也就是L3塊的地址0x01800083和L1塊的地址
這裡Free:5啥意思我不知道,╮(╯_╰)╭,誰知道告訴我吧
L3塊
Extent Control Header ----------------------------------------------------------------- Extent Header:: spare1: 0 spare2: 0 #extents: 1 #blocks: 128 last map 0x00000000 #maps: 0 offset: 2716 Highwater:: 0x018000c0 ext#: 0 blk#: 4 ext size: 128 #blocks in seg. hdr's freelists: 0 #blocks below: 0 mapblk 0x00000000 offset: 0 Unlocked -------------------------------------------------------- Low HighWater Mark : Highwater:: 0x01800084 ext#: 0 blk#: 4 ext size: 128 #blocks in seg. hdr's freelists: 0 #blocks below: 0 mapblk 0x00000000 offset: 0 Level 1 BMB for High HWM block: 0x01800080 Level 1 BMB for Low HWM block: 0x01800080
這裡要注意的是 Highwater:: 0x018000c0 Low HighWater Mark
:0x01800084 低高水位線和高高水位線
低高水位線以下的時已經格式化了的塊
低高水位和高高水位之間的塊,則可能是格式化了的,也可能是沒有
引一張官方文檔的的說明
總之你要記住的是 全表掃描時,通常都是讀至低高水位線,然後根據位元影像去讀低高與高高之間格式化過的塊,避開未格式化的塊
查看高水位線的方法最簡單的就是dump段頭塊
sys@PROD>select header_file,header_block from dba_segments where segment_name='FAN' and owner='SCOTT';HEADER_FILE HEADER_BLOCK----------- ------------ 6 131
通過上面的命令可以輕鬆找出段頭塊
-------------------------------------------------------- Segment Type: 1 nl2: 1 blksz: 8192 fbsz: 0 L2 Array start offset: 0x00001434 First Level 3 BMB: 0x00000000 L2 Hint for inserts: 0x01800082 Last Level 1 BMB: 0x01800081 Last Level II BMB: 0x01800082 Last Level III BMB: 0x00000000 Map Header:: next 0x00000000 #extents: 1 obj#: 77412 flag: 0x10000000 Inc # 0
內容 |
注釋 |
First Level 3 BMB: 0x00000000 |
庫超大、區超多、塊超多時才出現 |
Last Level 1 BMB: 0x01800081 |
最後一個L1 BMB的地址 |
Last Level II BMB: 0x01800082 |
最後一個L2 BMB的地址 |
Last Level III BMB: 0x0000000 |
最後一個L3 BMB的地址 |
Extent Map ----------------------------------------------------------------- 0x01800080 length: 128
L3中記錄的區的資訊
第一個區開始自0x01800080,但是需要注意的是全表掃描是Oracle讀取的並不是這裡的區地圖
而是下面的
Auxillary Map -------------------------------------------------------- Extent 0 : L1 dba: 0x01800080 Data dba: 0x01800084 -------------------------------------------------------- Second Level Bitmap block DBAs -------------------------------------------------------- DBA 1: 0x01800082
區0 第一個L1為0x01800080 第一個非中繼資料資料區塊為0x01800084
Oracle 全掃描時,是按照“Data dba : **” 後的 DBA 尋找區的。但這裡沒有區長度,所以,上面那部分區地圖資訊還是要讀的。