oracle中的sga包含了幾個主要的部分
1.shared pool 共用池
2.database buffer cache資料庫高速緩衝區
3.redo log buffers 重做日誌緩衝區
4.large pool 大池
5.java pooljava池
a.shared pool:
oracle shared pool包括library cache(庫緩衝)和dictionary cache(資料字典快取)
library cache中包含了共用sql區和共用pl/sql區兩部分,他們分別存放sql和pl/sql語句以及相關的資訊。oracle通過一個稱為LRU(least recently used)隊列的演算法來實現對library cache管理的。其演算法大致如下:剛剛使用過的記憶體塊(的地址)放在LRU隊列的頭上,當一個伺服器處理序需要library cache的記憶體空間時該進程就從LRU對列的尾部擷取所需的記憶體塊,這些記憶體塊一旦被使用他們(的地址)就立即放在LRU對列的最前面,這樣那些長時間沒有使用過的記憶體塊將自然地移動到LRU對列的尾部而最先被使用。為了能夠共用sql和pl/sql的代碼,library cache要足夠大。不過oracle並沒有修改library cache大小的參數。只能間接地通過修改shared pool來修改library cache的大小。長時間的使用shared pool會產生許多片段如果在shared pool中沒有足夠的連續空間來裝載目標資料就會產生錯誤,所以oracle提供了flush_shared_pool參數來重新整理shared pool
語句:
alter system set shared_pool_size=48M;
alter system flush_shared_pool;
dictionary cache:資料庫物件的資訊儲存在資料字典表中,當資料庫需要這些資訊的時候,將讀取字典表並將返回的資料存放區在dictionary cache中。dictionary cache也是通過LRU演算法來使用資料區塊。dictionary cache是shared pool的一部分,不能單獨設定其大小,只能同過修改shared_pool_size參數在修改。當查詢資料字典的速度緩慢時,應該加大shared_pool_size。
b.database buffer cache:
oracle修改資料時,伺服器處理序將首先在database buffer cache中搜尋所需要的資料,如果找到了就直接使用而不進行磁碟搜尋,如果沒有找到就進行磁碟操作,把資料檔案中的資料讀入到database buffer cache中。修改後,當達到一定條件時,會由DBWn進程負責把database buffer cache中的資料寫入到資料檔案中。oracle也是使用LRU演算法來實現對database buffer cache的管理的。可以使用db_block_size和db_block_buffers來設定database buffer cache的大小,其中db_block_size是在建立資料庫時固定了的,建立完資料庫後不可修改。而db_block_buffers的演算法是48M/db_block_size。如果SGA的大小不足以容納所使用的資料,那麼其他緩衝區將爭用database buffer cache的空間,使資料庫效能下降。多個程式共用一個SGA時易出現這種現象。 當什麼時候DBWn進程才將database buffer cache中的資料寫入到資料檔案中呢 :
1.Checkpoint的時候
2.當buffer cache中沒有足夠的free buffer的時候。
c.redo log buffers:
當資料庫中的資料被修改時,後台進程LGWR將修改的內容,記錄到redo log中,以便在資料庫恢複過程中實現復原。然而在被寫入到redo log之前,事物首先被記錄在redo log buffers中。當達到一定條件後將啟用LGWR進程來寫入redo log檔案中。而這幾個條件分別是:
1.發生提交。
2.到達LGWR非活動時限。
3.redo log buffers中的資料達到redo log buffers 1/3時。
4.DBWn在檢查點完成database buffer cache的重新整理。
d.large pool:
Large Pool是一種類似共用池的SGA緩衝池,和共用池不同的是,只有少量類型的對象可以在Large Pool中建立。Large Pool的空間不在共用池中分配,是在資料庫啟動的時候另外分配的。Large Pool的大小由LARGE_POOL_SIZE確定。Oracle資料庫也可以不配置Large Pool。從Oracle 8開始,Oracle資料庫引入了Large Pool,在Oracle 8中,Large Pool的主要功能由兩個:
1.為MTS(共用伺服器的早期版本)模式的會話分配UGA空間.
2.作為連續檔案IO的緩衝,比如系統管理的恢複和rman備份恢複(當RMAN使用了多個IO SLAVES的時候)
在一般情況下LARGE POOL使用需求不大,因此不必要設定過大的LARGE POOL.
e.java pool:
引入java pool的目的是能夠編譯java語言的命令,如果要使用java語言,就必須要設定java pool。java語言早oracle資料庫中的儲存於pl/sql語言幾乎完全相同。可以通過參數java_pool_size的值來設定java pool的大小,其單位是位元組(bytes)。在oracle9i中java pool的預設大小是24M。
PGA
(Program Global Area程式全域區)是一塊包含一個服務進程的資料和控制資訊的記憶體地區。它是Oracle在一個服務進程啟動是建立的,是非共用的。一個Oracle進程擁有一個PGA記憶體區。一個PGA也只能被擁有它的那個服務進程所訪問,只有這個進程中的Oracle代碼才能讀寫它。因此,PGA中的結構是不需要Latch保護的。
我們可以設定所有服務進程的PGA記憶體總數受到執行個體分配的總體PGA(Aggregated PGA)限制。
在專有伺服器(DedicatedServer)模式下,Oracle會為每個會話啟動一個Oracle進程;
而在多線程服務(Multi-Thread Server MTS)模式下,由多個會話共用同一個Oracle服務進程。
PGA中包含了關於進程使用到的作業系統資源的資訊,以及一些關於進程狀態的資訊。
而關於進程使用的Oracle共用資源的資訊則是在SGA中。
這樣做可以使在進程以外中止時,能夠及時釋放和清除這些資源。
相關視圖
V$PGASTAT
V$PGASTAT提供了PGA記憶體使用量情況的統計資訊和當自動PGA記憶體管理啟動時的統計資訊。
視圖裡面的累加資料是自從執行個體啟動後開始累加的。
V$SYSSTAT,V$SESSTAT
這兩個視圖顯示了系統(會話)的統計資料。他們的統計項目基本相同,
但不同之處在於一個是系統級的、一個是會話級的。
V$PROCESS
這個視圖顯示了所有Oracle進程的資訊。其中以下幾個欄位則說明了進程PGA記憶體的使用方式。
PGA_USED_MEM:進程使用的PGA記憶體
PGA_ALLOCATED_MEM:分配給進程的PGA記憶體
PGA_MAX_MEM:進程使用的最大的PGA記憶體