Oracle內存管理PGA詳解
Oracle 10g數據庫中需要設置workarea_size_policy為AUTO,并設置pga_aggregate_target參數來實現PGA的內存管理。接下來我們就來介紹這一設置過程的實現。首先看看如下代碼:
- 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參數可以根據經驗值進行設置,評估PGA的簡單方法可以查看AWR報告中的PGA命中率(PGA Cache Hit%),以及分析direct path read temp和direct path write temp等待事件是否比較高,這些等待表示PGA設置參數有限而導致大量臨時表空間操作出現的等待事件。當然還有復雜的評估PGA的方法,以后再看吧。
注意,9I的shared server連接需要明確設置SORT_AREA_SIZE 和 HASH_AREA_SIZE,也就是說不能用自動管理模式。10G則無此限制。
PGA_AGGREGATE_TARGET是一個上限(理論上的***值,PL/SQL就很容易超過),ORACLE啟動時并不分配那么多,你甚至可以設置大于物理MEM的大?。ㄉa庫不要這么做呀,要設置pga_aggregate_target+sga<MEM ,別挑戰ORACLE的極限)。一個SESSION可能有多個sort,hash的workarea,每一個workarea最多會用到5%或100M(由兩個隱藏參數控制),因此如果預計每個sort,hash的workarea是5M,應該設置PGA_AGGREGATE_TARGET成100M。但是,隨著用戶的增加或工作量的增大,給每個workarea的容量可能會減少,因為有總量PGA_AGGREGATE_TARGET的限制,比如需要100個workarea,那么每個只能分配到1M。
parallel query會用到最多30%(由隱藏參數控制)的PGA_AGGREGATE_TARGET,每一個parallel query的PIECE會分配相應的30%,也就是parallel query可能會用到30M,10個PARALLEL,那么每個用3M。這也就是建議用auto管理的原因,一個系統通常workload,session是隨時間變化的,早上可能3個用戶,中午可能300個用戶,所以用固定sort,hash的參數是不合時宜的.自動管理才可以實現在用戶并發少的時候分配更多的內存,在并發多的時候照顧大眾,分配少的內存。ORACLE 9.2以后有了PGA advisory。這一段中所說的5%,30%不知是否正確,沒有時間看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
幾個重要參數的說明:
aggregate PGA target parameter 設置的pga的目標參數值。
aggregate PGA auto target 在自動管理模式下,oracle工作區可使用的pga。
total PGA inuse 當前實例使用的pga。
total PGA allocated 當前實例實際分配的pga。
maximum PGA allocated 可分配的***pga。
over allocation count ORACLE分配的PGA超過pga_aggregate_target的次數.這個參數可以判斷pga_aggregate_target是否設置的太小。
cache hit percentage 自從instance啟動后的PGA命中率,如果所有的操作都在MEM中進行沒有在TEMP里運行的話應該是100%。
【編輯推薦】