Oracle內(nèi)存管理PGA詳解
Oracle 10g數(shù)據(jù)庫(kù)中需要設(shè)置workarea_size_policy為AUTO,并設(shè)置pga_aggregate_target參數(shù)來(lái)實(shí)現(xiàn)PGA的內(nèi)存管理。接下來(lái)我們就來(lái)介紹這一設(shè)置過(guò)程的實(shí)現(xiàn)。首先看看如下代碼:
- SQL> show parameter pga
 - NAME TYPE VALUE
 - ------------------------------------ ----------- ------------------------------
 - pga_aggregate_target big integer 169M
 - SQL> show parameter workarea
 - NAME TYPE VALUE
 - ------------------------------------ ----------- ------------------------------
 - workarea_size_policy string AUTO
 - SQL> show parameter pga
 - NAME TYPE VALUE
 - ------------------------------------ ----------- ------------------------------
 - pga_aggregate_target big integer 169M
 - SQL> show parameter workarea
 - NAME TYPE VALUE
 - ------------------------------------ ----------- ------------------------------
 - workarea_size_policy string AUTO
 
pga_aggregate_target參數(shù)可以根據(jù)經(jīng)驗(yàn)值進(jìn)行設(shè)置,評(píng)估PGA的簡(jiǎn)單方法可以查看AWR報(bào)告中的PGA命中率(PGA Cache Hit%),以及分析direct path read temp和direct path write temp等待事件是否比較高,這些等待表示PGA設(shè)置參數(shù)有限而導(dǎo)致大量臨時(shí)表空間操作出現(xiàn)的等待事件。當(dāng)然還有復(fù)雜的評(píng)估PGA的方法,以后再看吧。
注意,9I的shared server連接需要明確設(shè)置SORT_AREA_SIZE 和 HASH_AREA_SIZE,也就是說(shuō)不能用自動(dòng)管理模式。10G則無(wú)此限制。
PGA_AGGREGATE_TARGET是一個(gè)上限(理論上的***值,PL/SQL就很容易超過(guò)),ORACLE啟動(dòng)時(shí)并不分配那么多,你甚至可以設(shè)置大于物理MEM的大小(生產(chǎn)庫(kù)不要這么做呀,要設(shè)置pga_aggregate_target+sga<MEM ,別挑戰(zhàn)ORACLE的極限)。一個(gè)SESSION可能有多個(gè)sort,hash的workarea,每一個(gè)workarea最多會(huì)用到5%或100M(由兩個(gè)隱藏參數(shù)控制),因此如果預(yù)計(jì)每個(gè)sort,hash的workarea是5M,應(yīng)該設(shè)置PGA_AGGREGATE_TARGET成100M。但是,隨著用戶的增加或工作量的增大,給每個(gè)workarea的容量可能會(huì)減少,因?yàn)橛锌偭縋GA_AGGREGATE_TARGET的限制,比如需要100個(gè)workarea,那么每個(gè)只能分配到1M。
parallel query會(huì)用到最多30%(由隱藏參數(shù)控制)的PGA_AGGREGATE_TARGET,每一個(gè)parallel query的PIECE會(huì)分配相應(yīng)的30%,也就是parallel query可能會(huì)用到30M,10個(gè)PARALLEL,那么每個(gè)用3M。這也就是建議用auto管理的原因,一個(gè)系統(tǒng)通常workload,session是隨時(shí)間變化的,早上可能3個(gè)用戶,中午可能300個(gè)用戶,所以用固定sort,hash的參數(shù)是不合時(shí)宜的.自動(dòng)管理才可以實(shí)現(xiàn)在用戶并發(fā)少的時(shí)候分配更多的內(nèi)存,在并發(fā)多的時(shí)候照顧大眾,分配少的內(nèi)存。ORACLE 9.2以后有了PGA advisory。這一段中所說(shuō)的5%,30%不知是否正確,沒(méi)有時(shí)間看oracle文檔,在此提醒一下自己。
v$pgastat:
- SQL> set pagesize 200
 - SQL> select name||' '|| to_char(decode( unit,
 - 'bytes', value/1024/1024,
 - value ),'999,999,999.9')||' '||
 - decode( unit, 'bytes', 'mbytes', unit
 - from v$pgastat;
 - NAME||''||TO_CHAR(DECODE(UNIT,'BYTES',VALUE/1024/1024,VALUE),'999,999,999.9')||''||DECODE(UN
 - --------------------------------------------------------------------------------------------
 - aggregate PGA target parameter 169.0 mbytes
 - aggregate PGA auto target 124.3 mbytes
 - global memory bound 33.8 mbytes
 - total PGA inuse 30.9 mbytes
 - total PGA allocated 65.4 mbytes
 - maximum PGA allocated 82.2 mbytes
 - total freeable PGA memory .0 mbytes
 - process count 24.0
 - max processes count 33.0
 - PGA memory freed back to OS .0 mbytes
 - total PGA used for auto workareas .0 mbytes
 - maximum PGA used for auto workareas .6 mbytes
 - total PGA used for manual workareas .0 mbytes
 - maximum PGA used for manual workareas .0 mbytes
 - over allocation count .0
 - bytes processed 23.5 mbytes
 - extra bytes read/written .0 mbytes
 - cache hit percentage 100.0 percent
 - recompute count (total) 817.0
 
幾個(gè)重要參數(shù)的說(shuō)明:
aggregate PGA target parameter 設(shè)置的pga的目標(biāo)參數(shù)值。
aggregate PGA auto target 在自動(dòng)管理模式下,oracle工作區(qū)可使用的pga。
total PGA inuse 當(dāng)前實(shí)例使用的pga。
total PGA allocated 當(dāng)前實(shí)例實(shí)際分配的pga。
maximum PGA allocated 可分配的***pga。
over allocation count ORACLE分配的PGA超過(guò)pga_aggregate_target的次數(shù).這個(gè)參數(shù)可以判斷pga_aggregate_target是否設(shè)置的太小。
cache hit percentage 自從instance啟動(dòng)后的PGA命中率,如果所有的操作都在MEM中進(jìn)行沒(méi)有在TEMP里運(yùn)行的話應(yīng)該是100%。
【編輯推薦】















 
 
 

 
 
 
 