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博客 ” ,链接:https://blog.itpub.net/26015009/viewspace-751836/
,如需转载,请注明出处,否则将追究法律责任。