ORACLE PGA程式全域性區
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 2 Day DBA-管理Oracle例項-關於例項記憶體結構-程式全域性區(PGA)Oracle記憶體
- oracle架構之系統全域性區Oracle架構
- 記憶體四區之程式碼區,全域性區,棧區和堆區記憶體
- Oracle全域性臨時表Oracle
- 全域性變數與區域性變數變數
- 分割槽索引:區域性 locally & 全域性 global索引
- 區域性變數和全域性變數變數
- vue.js全域性元件和區域性元件區別Vue.js元件
- C語言區域性變數、全域性變數、靜態區域性變數、靜態全域性變數C語言變數
- 微信小程式的全域性彈窗以及全域性例項微信小程式
- Oracle全域性索引和本地索引Oracle索引
- Java區域性變數與全域性變數Java變數
- java 全域性變數和區域性變數Java變數
- Python的全域性和區域性變數Python變數
- JavaScript —— 區域性變數和全域性變數JavaScript變數
- jmeter全域性變數和區域性變數JMeter變數
- 【c】全域性變數與區域性變數變數
- 設定系統全域性區SGA命令
- oracle全域性臨時表的特性Oracle
- 全域性分割槽索引和區域性分割槽索引索引
- python全域性變數與區域性變數Python變數
- 小程式全域性狀態管理
- Oracle:PGA 簡介Oracle
- Oracle PGA詳解Oracle
- Oracle PGA管理(一)Oracle
- oracle PGA 構成Oracle
- Tomcat全域性/區域性https訪問配置方法TomcatHTTP
- 區域性代理ip與全域性代理ip怎麼用?
- JavaScript五:全域性變數&區域性變數;運算子JavaScript變數
- uni-app全域性樣式和區域性樣式APP
- 區域性方法$(“html”).load()和全域性方法$.get()、$.post()HTML
- python全域性變數和區域性變數, globalPython變數
- 程式程式碼,常量,區域性變數,全域性變數在記憶體中的儲存位置變數記憶體
- node 全域性物件和全域性變數物件變數
- Oracle全域性資料庫名、環境變數和sid的區別Oracle資料庫變數
- 微信小程式------全域性配置設定微信小程式
- python學習筆記 區域性和全域性作用域Python筆記
- Python中的全域性變數和區域性變數Python變數