Oracle中PGA内存分配原则
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 |
相关阅读: