首先,我們通過一張圖片來瞭解一下Oracle資料庫的記憶體結構,如下: 每個資料庫實例有兩個關聯的記憶體結構—系統全局區(SGA),程式全局區(PGA)。 系統全局(SGA):一組共用的記憶體結構(稱為SGA 組件),其中包含一個OracleDB 實例的數據和控制信息。SGA 由所有伺服器進程和後臺進程共 ...
首先,我們通過一張圖片來瞭解一下Oracle資料庫的記憶體結構,如下:
每個資料庫實例有兩個關聯的記憶體結構—系統全局區(SGA),程式全局區(PGA)。
- 系統全局(SGA):一組共用的記憶體結構(稱為SGA 組件),其中包含一個OracleDB 實例的數據和控制信息。SGA 由所有伺服器進程和後臺進程共用。SGA 中存儲的數據有高速緩存的數據塊和共用SQL 區域等;SGA的大小由參數sga_target決定。
- 程式全局區(PGA):包含某個伺服器進程或後臺進程的數據及控制信息的記憶體區域。PGA 是Oracle DB 在伺服器進程或後臺進程啟動時創建的非共用記憶體。伺服器進程對PGA 的訪問是獨占式的。每個伺服器進程和後臺進程都具有自己的PGA。PGA的大小由參數pga_aggregate_target決定。
SGA幾個關鍵組件做以說明:
- 共用池:shared pool,用於緩存可在用戶間共用的各種構造,比如給定SQL 語句的語法分析樹和執行計劃。
- 資料庫緩衝區高速緩存:buffer cache,從資料庫中檢索到的數據塊是緩存在此,數據塊從此記憶體組件對數據塊進行操作,降低了硬碟IO負擔,如果用戶進程所需的數據在該區域能很找到,我們稱之為高速緩存區命中,高的命中率反映出來的效果就是操作反應快,這點很好理解,資料庫優化中很有必要考慮這點。
在buffer cache中,存在以下的緩衝區:
(*)KEEP 緩衝區池:一種專用資料庫緩衝區高速緩存,用於長時間在記憶體中保留數據塊。一些頻繁使用的數據塊可相對長期的保留在此,不至於每次都從硬碟獲取,從而優化了資料庫的性能;
(*)RECYCLE 緩衝區池:一種專用資料庫緩衝區高速緩存,用於從記憶體中快速回收或刪除數據塊。相對於KEEP的對立面,很好理解;
(*) nK 緩衝區高速緩存:多種專用資料庫緩衝區高速緩存中的一種,用於存放大小不同於預設資料庫塊大小的數據塊。註意預設數據塊為8K
- 重做日誌緩衝區:log buffer,用於存放有關對資料庫所做更改的信息,重做信息在寫入磁碟中重做日誌文件(即redo文件)前,將緩存在此處。
- 大型池,用於為某些大型進程(例如Oracle 備份和恢復操作)和I/O 伺服器進程提供大型記憶體分配。
- Java池和流池