Oracle內(nèi)存管理PGA詳解
Oracle 10g數(shù)據(jù)庫中需要設(shè)置workarea_size_policy為AUTO,并設(shè)置pga_aggregate_target參數(shù)來實(shí)現(xiàn)PGA的內(nèi)存管理。接下來我們就來介紹這一設(shè)置過程的實(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的簡單方法可以查看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,也就是說不能用自動(dòng)管理模式。10G則無此限制。
PGA_AGGREGATE_TARGET是一個(gè)上限(理論上的***值,PL/SQL就很容易超過),ORACLE啟動(dòng)時(shí)并不分配那么多,你甚至可以設(shè)置大于物理MEM的大?。ㄉa(chǎn)庫不要這么做呀,要設(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。這一段中所說的5%,30%不知是否正確,沒有時(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ù)的說明:
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超過pga_aggregate_target的次數(shù).這個(gè)參數(shù)可以判斷pga_aggregate_target是否設(shè)置的太小。
cache hit percentage 自從instance啟動(dòng)后的PGA命中率,如果所有的操作都在MEM中進(jìn)行沒有在TEMP里運(yùn)行的話應(yīng)該是100%。
【編輯推薦】