ORACLE PGA程式全域性區

eric0435發表於2012-12-28
pga指的是程式全域性區(program global area),是伺服器程式(server process)使用的
一塊包含資料和控制資訊的記憶體區域,pga是非共享的記憶體,在伺服器程式啟動或建立時
分配(在系統執行時,排序,連線等操作也可能需要進行更進一步的pga分配),併為
server process排他訪問.pga的內容會根據伺服器是專用模式還是共享伺服器模式而
不同,但是通常來說,pga中包含私有sql區(存放繫結資訊,執行時記憶體結構等)和
session資訊等待內容.

所有伺服器進行分配的pga總和通常被稱為pga合計(aggregated pga).在9i以前的版本
pga由一系列的記憶體區域組成,這些區域主要由*_area_size引數來控制

這些引數有:
sort_area_size
hash_area_size
bitmap_merge_area_size
create_bitmap_area_size
可以使用以下命令來檢視當前資料庫這些引數的設定
SQL> show parameter area_size

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
bitmap_merge_area_size               integer     1048576
create_bitmap_area_size              integer     8388608
hash_area_size                       integer     2097152
sort_area_size                       integer     1048576
workarea_size_policy                 string      AUTO

可以透過手動修改sort_area_size,hash_area_size等引數來控制pga的使用.
在9i以前,pga的計算和控制都是比較複雜的,從9i開始,oracle提供了一種
pga記憶體管理的新方法.自動化sql執行記憶體管理(Automated SQL Execution Memory Management)
使用這個新特性,oracle可以自動調整sql記憶體區,而不用關閉資料庫

為了實現自動的pga記憶體管理,oracle引入了幾個新的初始化引數
pga_aggregate_target:此引數用來指定所有session總計可以使用的最大pga的值.
這個引數可以進行動態的更改.

workarea_size_policy:此引數用於開關pga記憶體自動管理功能,該引數有兩個選項
auto和manual,當設定為auto時,資料庫使用自動pga管理功能,當設定為manual時,
剛仍然要使用手工管理方式.在9i中預設的情況下workarea_size_policy設定為auto.
但是在9i中,pga_aggregate_target引數僅僅對專用伺服器模式下的專屬連線有效.
對共享伺服器連線無效,但從10g開始,pga_aggregate_target對專用和共享伺服器
都是有效的.

pag_aggregate_target引數也會限制全域性pga和私有工作區的記憶體分配:
對於序列操作來說,單個sql操作能夠使用的pga記憶體按照以下規則進行分配:
min(5% pga_aggregate_target,100M)

對於並行操作:
30% pga_aggregate_target/dop (dop= degree of parallelism 並行度)

pga記憶體調整還分為可調整記憶體(tunable memory size)和不可調整記憶體(untunable memory size)
可調整記憶體是由sql工作區使用的,剩下部分是不可調整記憶體

就算啟用了pga自動調整功能,oracle還是要遵守以下規則:
untunable memory size + tunable memory size<=pga_aggregate_target

資料庫系統只能控制可調整部分的記憶體分配,如果可調整部分的記憶體過小,則oracle
永遠不會強制啟用這個規則.

另外,pga_aggregate_target引數在基於成本的最佳化模式下,對於sql的執行計劃
也會產生影響.oracle在評估執行計劃時會根據pga_aggregate_target引數來評估
在sort,hash_join或bitmap操作時能夠使用的最大或最小記憶體,從而選擇最優的執行計劃.

對於pga_aggregate_target引數的設定有以下一個建議方案
對於OLTP系統
pga_aggregate_target=(總的實體記憶體*80%)*20%

對於DSS系統
pga_aggregate_target=(總的實體記憶體*80%)*50%

對於一個單純的oracle資料庫伺服器,通常需要保留20%的實體記憶體給作業系統使用,
80%的實體記憶體分配給oracle使用.而oracle在OLTP系統中又將可用的記憶體中的80%分配給sga
20%分配給pga.在DSS系統中sga和pga各分50%

sql在工作區中有3種執行方式
optimal 最佳方式:指的是所有處理都可以在記憶體中完成
onepass: 大部分操作可以在記憶體中完成,但是需要使用到磁碟操作
multipass:大量操作需要進行磁碟互動,效能極差

對於pga的最佳化目標,就是要使得optimal的執行儘量的高些,也就是要
讓所有的排序等操作在記憶體中完成,同時使用multipass操作儘量低.
也就是要減少磁碟互動.
也就是實現以下目標
workarea execution- optimal >=90%
workarea execution -multipass=0%



SQL> select name,value,
  2  100 *(value/decode((select sum(value) from v$sysstat
  3      where name like 'workarea executions%'),
  4      0,null,
  5      (select sum(value) from v$sysstat
  6      where name like 'workarea executions%')
  7      )
  8      ) pct
  9  from v$sysstat
 10  where name like 'workarea executions%'
 11  ;

NAME                                                                  VALUE        PCT
---------------------------------------------------------------- ---------- ----------
workarea executions - optimal                                       1249376 99.9932770
workarea executions - onepass                                            81 0.00648280
workarea executions - multipass                                           0          0

伴隨自動pga調整新特性的引入,oracle引入了一系列的檢視,v$pgastat就是其中一個

在v$pagstat檢視中有一個global memory bound條目,該條目記錄資料庫允許的最高
pga記憶體使用量,可以從不同的pga引數設定來觀察oracle執行的pga上限值

SQL> select name,value/1024/1024 MB from v$pgastat
  2  where name in('aggregate PGA target parameter',
  3  'global memory bound');

NAME                                                                     MB
---------------------------------------------------------------- ----------
aggregate PGA target parameter                                         3300
global memory bound                                                     330

實際上這個330M的上限受到一個隱含引數的控制,該引數為_pga_max_size,

SQL> select x.ksppinm name,y.ksppstvl value,x.ksppdesc describ
  2  from sys.x$ksppi x,sys.x$ksppcv y
  3  where x.inst_id=USERENV('Instance')
  4  and y.inst_id=USERENV('Instance')
  5  and x.indx=y.indx
  6  and x.ksppinm like '%pga_max%';

NAME                 VALUE                   DESCRIB
-------------------- ---------------------   ------------------------------------------------
_pga_max_size         692060160              Maximum size of the PGA memory for one process

現在_pga_max_size=660M,global memory bound為_pga_max_size的一半
如果修改_pga_max_size引數的話,global memory bound將會隨之變化
如下:
當_pga_max_size=660M,global memory bound為330M
SQL> select name,value/1024/1024 MB from v$pgastat
  2  where name in('aggregate PGA target parameter',
  3  'global memory bound');

NAME                                                                     MB
---------------------------------------------------------------- ----------
aggregate PGA target parameter                                         3300
global memory bound                                                     330

現將_pga_max_size修改為1024M後,global memory bound為512M
SQL> alter system set "_pga_max_size"=1024M;

System altered

SQL> select name,value/1024/1024 MB from v$pgastat
  2  where name in('aggregate PGA target parameter',
  3  'global memory bound');

NAME                                                                     MB
---------------------------------------------------------------- ----------
aggregate PGA target parameter                                         3300
global memory bound                                                     512

對於pga的控制,還有一系列的內部引數,如下:
SQL> select x.ksppinm name,y.ksppstvl value,x.ksppdesc describ
  2  from sys.x$ksppi x,sys.x$ksppcv y
  3  where x.inst_id=USERENV('Instance')
  4  and y.inst_id=USERENV('Instance')
  5  and x.indx=y.indx
  6  and x.ksppinm like '%smm%';

NAME                          VALUE          DESCRIB
---------------------------- --------------- ---------------------------------------------------------------------- ----------
_smm_auto_min_io_size         56             Minimum IO size (in KB) used by sort/hash-join in auto mode
_smm_auto_max_io_size         248            Maximum IO size (in KB) used by sort/hash-join in auto mode
_smm_auto_cost_enabled        TRUE           if TRUE, use the AUTO size policy cost functions
_smm_control                  0              provides controls on the memory manager
_smm_trace                    0              Turn on/off tracing for SQL memory manager
_smm_min_size                 1024           minimum work area size in auto mode
_smm_max_size                 524288         maximum work area size in auto mode (serial)
_smm_px_max_size              1689600        maximum work area size in auto mode (global)
_smm_retain_size              0              work area retain size in SGA for shared server sessions (0 for AUTO)
_smm_bound                    0              overwrites memory manager automatically computed bound
_smm_advice_log_size          0              overwrites default size of the PGA advice workarea history log
_smm_advice_enabled           TRUE           if TRUE, enable v$pga_advice
_smm_freeable_retain          5120           value in KB of the instance freeable PGA memory to retain
_smm_isort_cap                0              maximum work area for insertion sort(v1)

14 rows selected

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26015009/viewspace-751836/,如需轉載,請註明出處,否則將追究法律責任。

相關文章