shared pool的物理結構和邏輯結構
從物理角度上看Oracle shared pool ,它是由多個記憶體塊組成。這裡的記憶體塊相當於資料檔案中的資料塊,是最小的分配單位。這個最小分配單位稱為chunk ,它裡面的記憶體位元組是連續的。但每個chunk 的大小是不固定的。
shared pool 的記憶體分配由heap (堆)來實現。heap 的個數由隱含引數”_kghdsidx_count “ 來決定。
每個heap 下又有多個sub-heap ,他們之間的關係稱為高階堆和副堆。他們的結構大致相同。
heap 由一個或多個extent 和heap header 組成,而extent 又由若干個chunk 和extent header 組成,而chunk 由chunk header 和chunk body 組成。
每個extent 的體積是若干個granule (有文件說是一個,但dump 出來看不只一個)。granule 是shared pool 邏輯角度上的組成單位。這個granule 是固定值,不同的SGA 下大小不同,如10g 中SGA_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 出來的結果如下:
在chunk 的 header 中,有一個16 位元組的固定區域,儲存分配該heap 記憶體的原因或者說是註釋,如”KGL handles” 、”KQR PO” 等等。
Oracle shared pool 中這些實體記憶體的分配、管理都是由一個叫做KGH Heap Manager 的C 程式來實現的。Heap Manager 預先分配所有的shared pool 所定義的記憶體空間。Heap Manager 還管理PGA 記憶體,但這個操作需要經常同作業系統互動來分配和回收記憶體。
從邏輯角度看Oracle shared pool ,它主要分為library cache 、dictionary cache 和control structure 三個部分。
Shared pool 的library cache 主要儲存了已執行的SQL 語句和PL/SQL 物件,以及它們的執行計劃等等。
採用hash table 對這些物件進行管理。例如一個SQL 在經過hash 演算法分析後得到一個hash 值。hash table 下由若干個hash bucket ,hash 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 。如下圖所示:
根據library cache 的結構,延伸到heap 0 這個級別上。heap 0 的組成部分包括object type,object name,flags,tables,data blocks 。其中tables 和data blocks 又進一步延伸。
tables 的組成部分包括dependency table ,child table ,translation table ,authorization table ,access table ,r-o dependency table ,schema name table 。
data blocks 的組成部分包括object, source,diana,pcode,mcode,errors,sql context 。其中source 也稱為heap 1 用於儲存sql 文字,sql context 稱為heap 6 用於儲存SQL 執行計劃。如下圖所示:
library cache 中不同bucket 的library cache object handle 是有不同型別的。可以根據object handle 中的namespace 進行區別。不同object handle 之間可能採用雙向連結串列的形式相互關聯。
如namespace 為CRSR 的,有parent cursor 和child cursor ,分別在不同的bucket 中的object handle 裡。
使用”library_cache level 11 “將library cache 的記憶體dump 出來。
使用的SQL 如下:
alter session set events 'immediate trace name library_cache level 11';
dump 出來的結果如下:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28878983/viewspace-2137033/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 物理結構和邏輯結構更通俗解釋
- HBase學習之Hbase的邏輯結構和物理結構
- 一張圖看懂Oracle邏輯結構和物理結構的關係Oracle
- 邏輯架構和物理架構架構
- shared pool記憶體結構記憶體
- oracle的邏輯結構Oracle
- PostgreSQL:邏輯結構SQL
- oracle 邏輯結構Oracle
- 3:Oracle體系結構(邏輯結構)Oracle
- [zt] Oracle的邏輯結構Oracle
- 資料結構知識點--儲存結構與邏輯結構資料結構
- 基礎知識1——資料物理,邏輯儲存結構
- Oracle OCP(41):邏輯結構Oracle
- Oracle 邏輯結構簡介Oracle
- shared pool之三:library cache結構/library cache object的結構-dump LibraryHandleObject
- oracle邏輯儲存結構理解Oracle
- Oracle記憶體結構(二)----Shared Pool的詳細資訊Oracle記憶體
- SHARED POOL總結
- 檔案的邏輯結構、檔案目錄
- PostgreSQL:物理結構SQL
- Oracle體系結構之-物理結構Oracle
- Oracle記憶體結構(二)----Shared Pool的詳細資訊(轉)Oracle記憶體
- Mysql-Innodb : 從一個位元組到整個資料庫表瞭解物理儲存結構和邏輯儲存結構MySql資料庫
- 事務日誌邏輯體系結構
- IC卡檔案系統的邏輯結構【轉】
- SQL Server中TempDB管理(version store的邏輯結構)SQLServer
- Oracle Data block 的物理結構OracleBloC
- 4.2.1.2 規劃物理結構
- MySQL的物理儲存結構和session過程MySqlSession
- Oracle Data block 的物理結構-體系架構OracleBloC架構
- 資料庫體系結構-共享池(shared pool),largepool,Java池,流池資料庫Java
- Vue原始碼探究-資料繫結邏輯架構Vue原始碼架構
- 邏輯表空間管理結構(Logical Storage Structures)Struct
- Oracle OCP(38):Database 物理結構OracleDatabase
- oracle物理儲存結構理解Oracle
- Oracle物理讀和邏輯讀Oracle
- Go快速入門 03 | 控制結構:if、for、switch 邏輯語句Go
- 檔案系統的物理結構分配