PGA 一点认识
pga program global area 又名process global area
操作已加载到内存中的数据时所需要的工作区域,这块内存区对于每个服务器进程都是私有的,不允许其它进程或线程的访问,PGA 一般是通过C 语言在运行时调用malloc() 和memmap() 来分配的,运行时可以动态的扩大,在8i后甚至可以动态的收缩,如果使用的是专用服务器模式,PGA 中除了进程内存区还会包含UGA(MTS时UGA是在SGA中)
专用服务器
PGA----FIXED PGA | |---Variable PGA(x$ksmpp) |--base table perm | |--CALL GLOBAL AREA |--UGA---FIXED UGA | |--variable UGA(X$KSMUP) | |--session info |--private sql area | |--永久内存区(绑定变量就在次) |--运行时区域
从9ir1 开始ORACLE 提供了两种管理PGA中除了UGA的内存区域,受初始化参数workarea_size_policy的值manual和auto影响,9IR2版本后AUTO成为默认值,10GR1以前MTS只能MANUAL,从10G开始才没有了这个限制。
通常pga_aggregate_target越大越好,但是调整正在运行的系统时要小心,因为改变pga_aggregate_target会影响查询优化器的评估结果从而改变现有执行计划,所以要先测试。理想情况下,workarea 应该可以容纳SQL执行过程中所涉及到的所有输入数据和控制信息,但有时往往sql workarea 无法满足sql 执行所需要的内存空间,所以超出部分就被写入TEMP 表空间,oracle 用三种状态来表示sql WORKAREA大小:
optimal:SQL语句能够完全在所分配的SQL工作区内完成所有的操作。
onepass:SQL语句需要与磁盘上的临时表空间交互一次才能够在所分配的SQL工作区中完成所有的操作。
multipass:由于SQL工作区过小,从而导致SQL语句需要与磁盘上的临时表空间交互多次才能完成所有的操作。
非并行模式下,按照通常的说法是“期望尺寸”不能超过min(5%*pga_aggregate_target,100MB)。100M=_pga_max_size(默认都是200m)/2,但实际上,这是在不修改_pga_max_size和_smm_max_size这两个隐藏参数的前提下,可以简单的这么认为。严格说来,应该是不能超过min(5%*pga_aggregate_target,50%*_pga_max_size,_smm_max_size)。对于并行的情况,就更加复杂,可以简单认为不超过30%*pga_aggregate_target。(10gr1及之前版本)
当你修改参数pga_aggregate_target的值时,Oracle系统会根据pga_aggregate_target和_pga_max_size这两个值来自动修改参数_smm_max_size。具体修改的规则是:
如果_pga_max_size大于5%*pga_aggregate_target,则_smm_max_size为5%*pga_aggregate_target。
如果_pga_max_size小于等于5%*pga_aggregate_target,则_smm_max_size为50%*_pga_max_size。
注意_smm_max_size单位是K,_pga_max_size是Byte
SQL> alter system set pga_aggregate_target=500m; 系统已更改。 SQL> show parameter pga NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ pga_aggregate_target big integer 524288000 SQL> select ksppinm, ksppstvl, ksppdesc from x$ksppi x, x$ksppcv y where x.indx = y.indx and ksppinm in ('_pga_max_size','_smm_max_size'); KSPPINM KSPPSTVL KSPPDESC -------------------- -------------------- -------------------------------------------------- _pga_max_size 209715200 Maximum size of the PGA memory for one process _smm_max_size 25600 maximum work area size in auto mode (serial) SQL> select 25600/1024 from dual; 25600/1024 ---------- 25 --500M的5% SQL> alter system set pga_aggregate_target=1500m; 系统已更改。 SQL> select ksppinm, ksppstvl, ksppdesc from x$ksppi x, x$ksppcv y where x.indx = y.indx and ksppinm in ('_pga_max_size','_smm_max_size'); KSPPINM KSPPSTVL KSPPDESC -------------------- -------------------- -------------------------------------------------- _pga_max_size 209715200 Maximum size of the PGA memory for one process _smm_max_size 76800 maximum work area size in auto mode (serial) SQL> show parameter pga NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ pga_aggregate_target big integer 1572864000 SQL> select 76800/1024 from dual; 76800/1024 ---------- 75 SQL> select 1572864000*5/100/1024/1024 from dual; 1572864000*5/100/1024/1024 -------------------------- 75 SQL> alter system set pga_aggregate_target=15m; 系统已更改。 SQL> show parameter pga NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ pga_aggregate_target big integer 15728640 SQL> select ksppinm, ksppstvl, ksppdesc from x$ksppi x, x$ksppcv y where x.indx = y.indx and ksppinm in ('_pga_max_size','_smm_max_size'); KSPPINM KSPPSTVL KSPPDESC -------------------- -------------------- -------------------------------------------------- _pga_max_size 209715200 Maximum size of the PGA memory for one process _smm_max_size 768 maximum work area size in auto mode (serial) SQL> select 15728640*5/100/1024/1024 from dual; 15728640*5/100/1024/1024 ------------------------ .75 SQL> select 768/1024 from dual; 768/1024 ---------- .75
10GR1前因为_pga_max_size 在10GR1前总是200M,所以单个sql操作最大总是100M,如果突破这个限制,如只能修改_PGA_MAX _size 这个隐藏参数,这是不被推荐的,但是到了10GR2以后这个限制也不再存在,可以参考METAlink 147806.110gr2后单个sql workarea 的限制5%*pga_aggregate_target,根据系统资源的大小来动态调整_PGA_MAX_SIZE,下面是10204的查询
SQL> l 1* select ksppinm, ksppstvl, ksppdesc from x$ksppi x, x$ksppcv y where x.indx = y.indx and ksppinm in ('_pga_max_size','_smm_max_size') SQL> / KSPPINM KSPPSTVL KSPPDESC -------------------- -------------------- -------------------------------------------------- _pga_max_size 503316480 Maximum size of the PGA memory for one process _smm_max_size 245760 maximum work area size in auto mode (serial)
查看指定SESSION 的PGA,:sid为V$MYSTAT里的SID,下面是10G的写法,9I对临时表空间是‘%physical%direct%’,session uga memory max只是一个峰值,用完会回收到session uga memory
SQL> l 1 select a.name,b.value 2 from v$statname a,v$sesstat b 3* where a.statistic#=b.statistic# and( a.name like '%ga%' or a.name like '%direct temp%') and sid=:SID SQL> / NAME VALUE ---------------------------------------------------------------------- ---------- session uga memory 221720 session uga memory max 730588 session pga memory 912980 session pga memory max 1175124 physical reads direct temporary tablespace 0 physical writes direct temporary tablespace 0 calls to kcmgas 0 7 rows selected.
pga_aggregate_target 只是理想大小,并不是硬性限制,如果分配了1G,有时PGA可以用到1.5G甚至更多,可以通过V$PGASTAT观察, 12c后引入PGA_AGGREGATE_LIMIT <Know more about PGA_AGGREGATE_LIMIT 12c 19c>
SQL> select * from v$pgastat; NAME VALUE UNIT ---------------------------------------------------------------- ---------- ------------ aggregate PGA target parameter 2516582400 bytes aggregate PGA auto target 2208356352 bytes global memory bound 251658240 bytes total PGA inuse 62938112 bytes total PGA allocated 139757568 bytes maximum PGA allocated 2653119488 bytes total freeable PGA memory 25952256 bytes process count 62 max processes count 276 PGA memory freed back to OS 4.6186E+12 bytes total PGA used for auto workareas 0 bytes maximum PGA used for auto workareas 1421077504 bytes total PGA used for manual workareas 0 bytes maximum PGA used for manual workareas 531456 bytes over allocation count 0 bytes processed 3.9880E+12 bytes extra bytes read/written 8.1270E+11 bytes cache hit percentage 83.07 percent recompute count (total) 1290275 19 rows selected.
PGA Cache Hit Ratio = bytes processed / (bytes processed + extra bytes read/written)
对于数据仓库建议加大_pga_max_size, 可以提升较大的效率,如有人测试近50%. 对于 _SMM_(PX)_MAX_SIZE参数不建议手动调整,在配置_pga_max_size会级联的自动修改。
目前这篇文章有1条评论(Rss)评论关闭。