shared pool的物理結構和邏輯結構

xypincle發表於2017-04-11

從物理角度上看Oracle shared pool ,它是由多個記憶體塊組成。這裡的記憶體塊相當於資料檔案中的資料塊,是最小的分配單位。這個最小分配單位稱為chunk ,它裡面的記憶體位元組是連續的。但每個chunk 的大小是不固定的。

shared pool 的記憶體分配由heap (堆)來實現。heap 的個數由隱含引數”_kghdsidx_count “ 來決定。

每個heap 下又有多個sub-heap ,他們之間的關係稱為高階堆和副堆。他們的結構大致相同。

heap 由一個或多個extentheap header 組成,而extent 又由若干個chunkextent header 組成,而chunkchunk headerchunk body 組成。

每個extent 的體積是若干個granule (有文件說是一個,但dump 出來看不只一個)。granuleshared pool 邏輯角度上的組成單位。這個granule 是固定值,不同的SGA 下大小不同,如10gSGA_MAX_SIZE<=1024MB ,則granule  的值為4MB  SGA_MAX_SIZE>1024MB  ,則granule  的值為16MB 。可以透過v$sgainfo 去查證。

從檢視 select   ksmchcls, count (*)  from   x$ksmsp  group   by   ksmchcls; 中可以看到shared pool 的每個chunk 的型別。

KSMCHCLS

COUNT(*)

free

3299

freeabl

13634

no acce

17

perm

43

R-free

31

R-freea

76

recr

18519

 

free :這種型別的 chunk 不包含有效的物件,可以不受限制地被分配。

recr :意味著 recreatable ,這種型別的 chunk 裡包含的物件可以在需要的時候被臨時移走,並且在需要的時候重新建立。比如對於很多有關共享 SQL 語句的 chunk 就是 recreatable 的。

freeabl :這種型別的 chunk 包含的物件都是曾經被 session 使用過的,並且隨後會被完全或部分釋放。這種型別的 chunk 不能臨時從記憶體移走,因為它們是在處理過程中間產生的,如果移走的話就無法被重建。

perm :意味著 permanent ,這種型別的 chunk 包含永久的物件,大型的 permanent 型別的 chunk 也可能含有可用空間,這部分可用空間可以在需要的時候釋放回 shared pool 裡。

 

(miki西遊 @mikixiyou 原文連結: http://mikixiyou.iteye.com/blog/1667933 )

 

使用”heapdump at level 2”shared pool 空間dump 出來,可以看到heap 的組成。

使用的SQL 如下:

alter session set events 'immediate trace name heapdump level 2';

dump 出來的結果如下:

******************************************************
HEAP DUMP heap name="sga heap"   desc=0x2000002c
 extent sz=0x32c8 alt=108 het=32767 rec=9 flg=-126 opc=0
 parent=(nil) owner=(nil) nex=(nil) xsz=0x0
******************************************************
HEAP DUMP heap name="sga heap(1,1)"   desc=0x2001b598
 extent sz=0xfc4 alt=108 het=32767 rec=9 flg=-126 opc=0
 parent=(nil) owner=(nil) nex=(nil) xsz=0x1000000
EXTENT 0 addr=0x9d000000
   Chunk 9d000038 sz=        24   R-freeable   "reserved stoppe"
   Chunk 9d000050 sz=    839576   R-free       "                "
  Chunk 9d0ccfe8 sz=        24   R-freeable   "reserved stoppe"
   Chunk 9d0cd000 sz= 10274952     free       "                "
   Chunk 9da99888 sz=       796     recreate   "KGL handles     "   latch=(nil)
   Chunk 9da99ba4 sz=      1036     freeable   "parameter table"
   Chunk 9da99fb0 sz=        96     freeable   "library cache   "
   Chunk 9da9a010 sz=       228     recreate   "KGL handles     "   latch=(nil)
   Chunk 9da9a0f4 sz=        96     freeable   "library cache   "
   Chunk 9da9a154 sz=       284     recreate   "KQR PO          "   latch=0x9baaf310
   Chunk 9da9a270 sz=       284     recreate   "KQR PO          "   latch=0x9baaf310
   Chunk 9da9a38c sz=       540     recreate   "KQR PO          "   latch=0x9baaf568
   Chunk 9da9a5a8 sz=        96     freeable   "library cache   "
   Chunk 9da9a608 sz=       540     recreate   "KGL handles     "   latch=(nil)
   Chunk 9da9a824 sz=       540     recreate   "KGL handles     "   latch=(nil)
   Chunk 9da9aa40 sz=       540     recreate   "KGL handles     "   latch=(nil)
   Chunk 9da9ac5c sz=       540     recreate   "KGL handles     "   latch=(nil)
   Chunk 9da9ae78 sz=       540     recreate   "KGL handles     "   latch=(nil)

chunk  header 中,有一個16 位元組的固定區域,儲存分配該heap 記憶體的原因或者說是註釋,如”KGL handles””KQR PO” 等等。

Oracle shared pool 中這些實體記憶體的分配、管理都是由一個叫做KGH Heap ManagerC 程式來實現的。Heap Manager 預先分配所有的shared pool 所定義的記憶體空間。Heap Manager 還管理PGA 記憶體,但這個操作需要經常同作業系統互動來分配和回收記憶體。

 

從邏輯角度看Oracle shared pool ,它主要分為library cachedictionary cachecontrol structure 三個部分。

Shared pool library cache 主要儲存了已執行的SQL 語句和PL/SQL 物件,以及它們的執行計劃等等。

採用hash table 對這些物件進行管理。例如一個SQL 在經過hash 演算法分析後得到一個hash 值。hash table 下由若干個hash buckethash bucket 下又有若干個library cache handle 組成。這些handle 的組成部分包括name,namespace,lock owners,lock waiters,pin owners,pin waiters,flags,heap 0(object) 。其中heap 0 儲存的是指向object 的指標。因此這個heap 0 也稱為object 。如下圖所示:


shared pool的物理結構和邏輯結構

根據library cache 的結構,延伸到heap 0 這個級別上。heap 0 的組成部分包括object type,object name,flags,tables,data blocks 。其中tablesdata blocks 又進一步延伸。

tables 的組成部分包括dependency tablechild tabletranslation tableauthorization tableaccess tabler-o dependency tableschema name table

data blocks 的組成部分包括object, source,diana,pcode,mcode,errors,sql context 。其中source 也稱為heap 1 用於儲存sql 文字,sql context 稱為heap 6 用於儲存SQL 執行計劃。如下圖所示:


shared pool的物理結構和邏輯結構

library cache 中不同bucketlibrary cache object handle 是有不同型別的。可以根據object handle 中的namespace 進行區別。不同object handle 之間可能採用雙向連結串列的形式相互關聯。

namespaceCRSR 的,有parent cursorchild cursor ,分別在不同的bucket 中的object handle 裡。

使用”library_cache level 11 “將library cache 的記憶體dump 出來。

使用的SQL 如下:

 alter session set events 'immediate trace name library_cache level 11';

dump 出來的結果如下:


BUCKET 5944:
   LIBRARY OBJECT HANDLE:   handle=1895899e8 mtx=0x189589b18(1) cdp=1
   name=select* from sys.obj$ where obj#=:x
   hash=8cd0bd4dbb09ea7c3d007f1ce9b01738 timestamp=08-21-2012 10:02:35
   namespace= CRSR  flags=RON/KGHP/TIM/PN0/SML/KST/DBN/MTX/[120100d0]
   kkkk-dddd-llll=0000-0001-0001 lock=N pin=0 latch#=6 hpc=0002 hlc=0002
   lwt=0x189589a90[0x189589a90,0x189589a90] ltm=0x189589aa0[0x189589aa0,0x189589aa0]
   pwt=0x189589a58[0x189589a58,0x189589a58] ptm=0x189589a68[0x189589a68,0x189589a68]
   ref=0x189589ac0[0x189589ac0,0x189589ac0] lnd=0x189589ad8[0x189589ad8,0x189589ad8]
     LOCK OWNERS:
         lock      user   session count mode flags
     -------- -------- -------- ----- ---- ------------------------
     17f72e938 1852c9890 1852c9890      1 N     [00]
     LIBRARY OBJECT: object=1786e6168
     type=CRSR flags=EXS[0001] pflags=[0000] status=VALD load=0
     CHILDREN: size=16
     child#     table reference    handle
     ------ -------- --------- --------
          0 17816fa10 17816f680 144768330
     DATA BLOCKS:
     data#      heap   pointer     status pins change whr
     ----- -------- -------- --------- ---- ------ ---
         0 144773248 1786e6280 I/P/A/-/-     0 NONE    00
   BUCKET 5944 total object count=1
  

LIBRARY OBJECT HANDLE: handle=144768330 mtx=0x144768460(0) cdp=0
   namespace=CRSR flags=RON/KGHP/PN0/EXP/[10010100]
   kkkk-dddd-llll=0000-0001-0001 lock=N pin=0 latch#=6 hpc=fffe hlc=fffe
   lwt=0x1447683d8[0x1447683d8,0x1447683d8] ltm=0x1447683e8[0x1447683e8,0x1447683e8]
   pwt=0x1447683a0[0x1447683a0,0x1447683a0] ptm=0x1447683b0[0x1447683b0,0x1447683b0]
   ref=0x144768408[0x17816f680,0x17816f680] lnd=0x144768420[0x144768420,0x144768420]
     CHILD REFERENCES:
     reference latch flags
     --------- ----- -------------------
     17816f680     11 CHL[02]
     LOCK OWNERS:
         lock      user   session count mode flags
     -------- -------- -------- ----- ---- ------------------------
     17f72f1d8 1852c9890 1852c9890      1 N     [00]
     LIBRARY OBJECT: object=178161a10
     type=CRSR flags=EXS[0001] pflags=[0000] status=VALD load=0
     DEPENDENCIES: count=1 size=16
     dependency#     table reference    handle position flags
     ----------- -------- --------- -------- -------- -------------------
               0 17837dae8 17837d828 189addbb8        17 DEP[01]
     AUTHORIZATIONS: count=1 size=16 minimum entrysize=16
     00000000 00000000 00020000 00000000
     ACCESSES: count=1 size=16
     dependency# types
     ----------- -----
               0 0009
     SCHEMA: count=1 size=262144
     00000000
     DATA BLOCKS:
     data#      heap   pointer     status pins change whr
     ----- -------- -------- --------- ---- ------ ---
         0 144e55298 178161b28 I/P/A/-/-     0 NONE    00
         6 1786cd5a0 16ece5dc0 I/-/A/-/E     0 NONE    00

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28878983/viewspace-2137033/,如需轉載,請註明出處,否則將追究法律責任。

相關文章