理解儲存結構2,理解儲存結構

來源:互聯網
上載者:User

理解儲存結構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 尋找區的。但這裡沒有區長度,所以,上面那部分區地圖資訊還是要讀的。

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.