Oracle體系架構(四)--PGA,UGA,CGA

一、概念
PG A: 程序全局區,服務器進程使用的內存區域,包括特定服務器進程的數據和控制信息,例如私有信息和使用的操做系統資源等。
UG A: 用戶全局區,特定Session使用的內存區域,例如Session的SQL工做區、登錄認證信息等。Session的SQL工做區大小對查詢性能的影響比較關鍵,shared server模式時UG A從 SGA的large pool(若是有設置)或者shared pool(沒有設置large pool)中分配,dedicated server模式時UG A從PG A中分配。
CG A: 調用全局區,存放調用過程當中須要的數據,例如parse調用、executive調用、fetch調用等。調用過程當中實際須要的數據,例如SQL Area、Sort Area等位於UG A中,CG A存放的只是調用過程當中的臨時處理數據,例如I/O緩存、臨時堆棧空間等。CG A位於PG A中(PG A是集中管理這些資源的地方),在調用開始時建立,調用執行過程當中動態分配,調用結束後釋放。
二、參數設置
WORKAREA_SIZE_POLICY = { AUTO | MANUAL }
{ ALTER SYSTEM | ALTER SESSION } SET WORKAREA_SIZE_POLICY = { AUTO | MANUAL }
設爲AUTO時,內存使用比較多的SQL操做,例如sort, group-by, hash-join, bitmap merge和bitmap create等,由Oracle自動分配;設爲MANUAL時,這些操做將使用相應的*_AREA_SIZE參數設置的內存值。
*_AREA_SIZE做用於每一個Session,分配的太小,不少Session可能沒有足夠的內存而效率低下,分配過多,大量Session可能浪費掉不少內存空間,9i開始的PG A自動管理功能改善了這個情況。使用PG A_AGGREGATE_TARGET設置整個PG A大小,Oracle將爲每一個Session按照實際須要爲其分配PG A,並儘可能維持PG A總量不超過PG A_AGGREGATE_TARGET值。
PG A_AGGREGATE_TARGET = integer [K | M | G]
ALTER SYSTEM
設定總的PG A內存大小。Oracle將盡可能保證PG A內存總合不超過這個值,但不是絕對的,爲了不磁盤操做,有時可能會超過這個值。能夠設置爲總的內存數減去SGA的剩餘值。
將該初始化參數設置爲大於0的值,Oracle自動將WORKAREA_SIZE_POLICY設爲AUTO;將該初始化參數設置爲0,Oracle自動將WORKAREA_SIZE_POLICY設爲MANUAL。設置了PG A_AGGREGATE_TARGET以後,會忽略全部*_AREA_SIZE設置。
HASH_AREA_SIZE = Integer
ALTER SESSION
單位爲字節數。
SORT_AREA_SIZE = Integer
ALTER SESSION, ALTER SYSTEM ... DEFERRED
單位爲字節數。若是沒有設置SORT_AREA_RETAINED_SIZE,分配的內存在排序結束,開始返回記錄以前釋放,若是設置了SORT_AREA_RETAINED_SIZE,分配的內存在最後一條記錄返回後釋放。位圖索引上的插入、更新也會用到SORT_AREA_SIZE(由於掃描完索引以後必須對各個位圖進行排序,而後再合併成一個位圖)。
SORT_AREA_RETAINED_SIZE = Integer
ALTER SESSION, ALTER SYSTEM ... DEFERRED
單位爲字節數。指在UG A中保留的排序內存大小,排序操做結束,返回最後一條記錄以後釋放排序內存,只是釋放給UG A,而不是操做系統。
BITMAP_MERGE_AREA_SIZE,CREATE_BITMAP_AREA_SIZE,位圖索引建立、更新時使用的內存配置。
_PG A_max_size: Maximum size of the PG A memory for one process。ALTER SYSTEM。默認值200M。
查看_PG A_max_size值的方法:
select ksppinm "Name", ksppstvl/1024/1024 ||'M' "Value", ksppdesc "Desc"
from x$ksppi x, x$ksppcv y
where x.indx = y.indx and ksppinm ='_PG A_max_size';
_smm_max_size: Maximum work area size in auto mode (serial)。{ALTER SESSION | ALTER SYSTEM}。
網上有不少描述_smm_max_size默認值的說法,其實都不對,追究其算法也沒多少意義,反正若是你沒有手動設置過_smm_max_size的值,一旦設置_PG A_max_size或者PG A_AGGREGATE_TARGET,Oracle就會自動計算出_smm_max_size的值,若是手動設置過_smm_max_size則不會變化,Oracle自動計算出的_smm_max_size值,跟PG A_AGGREGATE_TARGET和_PG A_max_size都有關係。查看_smm_max_size值的方法以下:
select ksppinm "Name", ksppstvl/1024 ||'M' "Value", ksppdesc "Desc"
from x$ksppi x, x$ksppcv y
where x.indx = y.indx and ksppinm ='_smm_max_size';
使用PG A_AGGREGATE_TARGET讓Oracle自動分配PG A時,爲了防止單個Session佔用過多內存而致使整個服務器性能降低,這兩個隱藏參數控制了單個進程的最大內存使用量。
這兩個參數爲隱藏參數,Oracle官方不進行技術支持,若是系統中存在大量的HASH JOIN、SORT等耗費內存的操做,能夠考慮、測試這些參數對系統性能的影響,但注意其反作用。
沒有使用並行查詢時,單個Session SQL工做區內存使用最大值爲min( 5%*PG A_AGGREGATE_TARGET , 50%*_PG A_max_size , _smm_max_size)。
設置_PG A_max_size: Alter System Set "_PG A_max_size"=1024M。
設置_smm_max_size: Alter System Set "_smm_max_size"=307200,單位是K,只能以這種單位進行設置,數字後面不能使用K、M、G這些單位字符了。
三、監控、改善PGA設置
監控PG A的視圖:v$sql_workarea_active、v$sql_workarea、v$sesstat、v$process、v$sysstat、v$sql_workarea_histogram等。
使用下面的視圖查看Oracle建議的評估設置:
Select PG A_target_for_estimate/1024/1024 ||'M' "Estimate PG A Target"
,estd_PG A_cache_hit_percentage "Cache Hit(%)"
,estd_extra_bytes_rw/1024/1024 ||'M' "Extra Read/Write"
,estd_overalloc_count "Over alloc count"
From v$PG A_target_advice;
選出的4個列中,Over alloc count指示Oracle SQL工做區內存分配的三種狀況:optimal徹底能夠在內存中完成操做;onepass須要進行一次磁盤交換;multipass須要進行屢次磁盤交換。第四列的值就是須要進行磁盤交換的數量。
PG A_AGGREGATE_TARGET的值最好選擇: Over alloc count爲0、Cache Hit(%)儘量高、Extra Read/Write儘量低的Estimate PG A Target值。

相關文章
相關標籤/搜索