oracle中的sga包含了幾個主要的部分
1.shared pool 共享池
2.database buffer cache 數據庫高速緩沖區
3.redo log buffers 重做日志緩沖區
4.large pool 大池
5.java pool java池
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)限制。
在專有服務器(Dedicated Server)模式下,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內存