pga_aggregate_target 通常縮寫為P_A_T,該參數同時限制全域pga分配和私人工作區記憶體配置
在Oracle9i以及10gr1中,單個sql操作記憶體使用量存在如下限制:
對於串列操作,單個sql操作能夠使用的pga記憶體按照一下原則分配:
MIN(5%*PGA_AGGREGATE_TARGET,100MB)
此處的5%*PGA_AGGREGATE_TARGET實際上是由_smm_nax_size決定的,該參數限制自動工作區模式下最大的工作區使用
對於並行操作:
30%PGA_AGGREGATE_TARGET/DOP(DOP=DEGREE IF PARALLELISM,並行度)
在oracle10gr2以及oracle11g中,記憶體使用量存在如下限制:
對於串列操作,能夠使用的pga記憶體按照以下原則分配:
如果P_A_T<500MB,則_smm_max_size=20%P_A_T
如果P_A_T在500MB和1000MB之間,_smm_max_size=100MB
如果P_A_T介於1001MB和2560MB之間,_smm_max_size=10%*P_A_T
如果P_A_T>2560MB則_smm_max_size=262060MB
對於並行操作,能夠使用的pga記憶體按照以下原則分配:
50%PGA_AGGREGATE_TARGET/DOP (DOP=Degree of parallelism,並行度)
但是注意,當dop<5時,_smm_max_size限制生效,並行度超過5時另外一個限制並行的參數_smm_px_max_size才會生效
從oralce10g開始 pga演算法受一個新增的隱含參數_newsort_abled影響,如果將該參數設定為false,則資料庫會使用之前oracle9i中的演算法規則:
sys@ORCL>@gethidpar.sql
輸入 name 的值: newsort_enabled
原值 4: and x.ksppinm like'%&name%'
新值 4: and x.ksppinm like'%newsort_enabled%'
KSPPINM KSPPSTVL
_newsort_enabled TRUE
上述@gethidpar.sql內容:
select x.ksppinm,y.ksppstvl,x.ksppdesc from x$ksppi x,x$ksppcv y wherex.indx=y.indx
and y.inst_id=userenv('Instance')
and x.inst_id=userenv('Instance')
and x.ksppinm like '%&name%';
要理解pga的自動調整,還需要區分可調整記憶體(TUNABLE MEMORY SIZE) 與不可調整記憶體(UNTUNABLE MEMORY SIZE),可調整記憶體是由sql工作區使用的,其餘部分是不可調整記憶體
Oracle在評估執行計畫時會更具PGA_AGGREGATE_TARGET參數評估在sort,HASH_JOIN或Bitmap操作時能夠使用的最大或最小記憶體,從而選擇最優的執行計畫
對於一個單純的資料庫伺服器,通常我們需要儲存20%的實體記憶體給作業系統使用,剩餘80%可以分配給oracle使用,而oracle的記憶體由pga和sga構成,pga可以佔用oracle消耗記憶體的20%(OLTP系統)至50%(DSS系統)
通過v$process 可以查詢pga的相關使用方式:
V$PROCESS displays information about the currently active processes.
Column |
Datatype |
Description |
ADDR |
RAW(4 | 8) |
Address of the process state object |
PID |
NUMBER |
Oracle process identifier |
SPID |
VARCHAR2(24) |
Operating system process identifier |
PNAME |
VARCHAR2(5) |
Name of this process |
USERNAME |
VARCHAR2(15) |
Operating system process username Note: Any two-task user coming across the network has "-T" appended to the username. |
SERIAL# |
NUMBER |
Process serial number |
TERMINAL |
VARCHAR2(30) |
Operating system terminal identifier |
PROGRAM |
VARCHAR2(48) |
Program in progress |
TRACEID |
VARCHAR2(255) |
Trace file identifier |
TRACEFILE |
VARCHAR2(513) |
Trace file name of the process |
BACKGROUND |
VARCHAR2(1) |
1 for a background process; NULL for a normal process |
LATCHWAIT |
VARCHAR2(8) |
Address of the latch the process is waiting for; NULL if none |
LATCHSPIN |
VARCHAR2(8) |
This column is obsolete |
PGA_USED_MEM |
NUMBER |
PGA memory currently used by the process |
PGA_ALLOC_MEM |
NUMBER |
PGA memory currently allocated by the process (including free PGA memory not yet released to the operating system by the server process) |
PGA_FREEABLE_MEM |
NUMBER |
Allocated PGA memory which can be freed |
PGA_MAX_MEM |
NUMBER |
Maximum PGA memory ever allocated by the process |
更多詳情見請繼續閱讀下一頁的精彩內容:
修改Oracle資料庫SGA和PGA大小
Oracle記憶體結構研究-PGA篇
Oracle在專用與共用的模式下SGA和PGA的區別
Oracle 記憶體管理PGA
Oracle記憶體全面分析之PGA
Oracle的記憶體配置-記憶體配置(SGA和PGA)SGA和PGA結構圖