ITPub博客

首页 > Linux操作系统 > Linux操作系统 > ORACLE PGA程序全局区

ORACLE PGA程序全局区

原创 Linux操作系统 作者:eric0435 时间:2012-12-28 22:11:21 0 删除 编辑
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/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: pga的调整建议
请登录后发表评论 登录
全部评论
系统架构师 Oracle ACE

注册时间:2011-10-12

  • 博文量
    716
  • 访问量
    6626137