Oracle Memory Structures

Oracle Instance關聯的基本記憶體結構包括
  • System Global Area (SGA):由所有Server Process和Background Processes共用.(主要功能是做為各種資料交換的暫存記憶體空間)
  • Program Global Area (PGA):專用於每一個Server Process或Background Processes。每一個Process獨享一個 PGA
SGA 是包含Instance的資料和控制資訊的記憶體區。(為什麼要叫System Global Area;SGA因為它可以被Oracle所在的作業系統上所有的Process來共享裡面的資料,所以叫共享記憶體System Global Area簡稱為SGA,因此如果今天當你在不同的Process上要交換資料要如何做呢?就是把那些資料丟到SGA裡面去,如此大家都可以存取資料,因此SGA是Oracle裡主要交易的地方,因為在Oracle裡所有的交易都是在SGA裡面處理的,由此得知SGA對Oracle是一個非常重要的地方。)
SGA 包含以下資料結構
Database Buffer Cache從資料庫中Catch資料區塊.(DB Buffer Cache主要的功能是用來暫時存放最近讀取自資料庫裡面的資料,也就是Data file內的資料,而Data File是以Block為單位,讀取到DB Buffer Cache中。當使用者透過應用程式第一次向Oracle資料庫送出查詢需求時,Oracle會先在資料庫緩衝快取區內尋找該資料,如果有需要的資料,就直接從資料庫緩衝快取區回傳給使用者,如此可減少硬碟上的I/O次數,如果Oracle發現使用者要的資料並不在裡面,會從資料庫中讀取所需要的Data blocks,先放入DB Buffer Cache裡面,再傳給使用者)
Redo Log Buffer快取記憶體重做資訊(用於Instance恢復),直到可以將其寫入磁片中存儲的實體的重做日誌檔.Redo Log Buffer主要是用來追蹤記錄最近異動過的資料記錄。
主要是存放最近執行過的SQL Statement、Data Dictionary與PL/SQL的一些資料、table的定義和權限等
Library CacheLibrary Cache包含了Shared SQL Area、Private SQL Area、Package Area以及PL/SQL程式區,其主要功能是將Oracle解析完成的parse tree與execution plan,放在Shared SQL Area。
Data Dictionary CacheData Dictionary Cache主要是存放table或view的名稱、欄位名稱、資料型態與使用者權限等。由於Oracle在解析SQL或執行的過程中,必須不斷查閱data dictionary內所有記錄的相關資訊,以備查詢之用。
Large Pool是一個可選區域,可為某些大型Process(如 Oracle 備份和恢復作業、I/O Server Process)提供大量記憶體分配(Large Pool是SGA中的一塊可選記憶體區塊,同時Large Pool的功能是類似Shared Pool的記憶體緩衝區,與Shared Pool不同的是Large Pool在特殊的情況下才會使用,Large Pool,在以下情況下需要Large Pool:在多工處理架構模式MTS下,透過從Large Pool中分配給使用者連線使用排序(Sort Area)及雜湊演算(Hash Area)等作用。使用平行作業查詢(Parallel Query)時,作為大型連續檔案的I/O的緩衝區,使用Oracle RMAN時,Large Pool為其I/O緩衝區)
Java Pool用於 Java JVM 中特定Session的所有 Java Code和資料
Streams Pool提供 Oracle Streams 使用
透過使用 Enterprise Manager 或 SQL*Plus 啟動Instance,可以顯示為 SGA 分配的記憶體量。
Program Global Area (PGA) :是包含各個Server Process的資料及控制資訊的記憶體區。Oracle Server Process為Client的請求提供服務。每個Server Process都有自己專用的 PGA,這個 PGA 是在Server Process啟動時建置的。由該Server Process對 PGA 進行獨享的權利,只有Oracle Code能對PGA進行讀寫。(PGA是一塊記憶體區塊,和共享記憶體(System Global Area;SGA)不同的是SGA是共用的記憶體區塊,而PGA是一塊私有的記憶體區塊,也就是說當一個使用者連線到Oracle資料庫時就會產生一個Server Process連線同時也會建立一個PGA的記憶體區塊,而PGA就是只提供給那一個Server Process專門使用,如果有10個Server Process就會產生10個PGA,因此在PGA裡面是不需要Latch所保護,因為專屬那個使用者連線,所以沒有別的連線來搶資源,而PGA 裡面包含server process正在執行的工作資訊與控制資訊)


注意
  • 使用動態 SGA結構時,可以在不關閉實例的情況下,更改資料庫緩衝區快取記憶體、Shared Pool、Large Pool和 Java Pool以及 Streams Pool的大小。
  • Oracle 資料庫使用初始化參數建置並分配記憶體結構。例如,SGA_TARGET 參數可指定SGA的總大小。如果 SGA_TARGET 設置為 0,則會禁用“Automatic Shared Memory Management”。
  • Oracle有一個很重要的觀念,就是不到絕對必要,不會等待磁碟I/O,因為磁碟I/O是電腦系統運作中最慢的一個部份,因此,所執行的I/O是越少越好,在Oracle的資料庫架構設計裡面這種觀念是無所不在

沒有留言:

張貼留言