PGA的设置与调整

本文详细介绍了Oracle数据库中PGA内存管理的概念、结构、特性、分配原则及调整策略,包括PGA的主要特性、结构、UGA的关联、导致排序的操作、PGA的管理模式与设置、PGA的分配原则、PGA的调整建议以及通过视图获取PGA相关信息的方法。通过监控与调整,以优化系统性能。

PGA,即程序全局区(Program Global Area),是Oracle体系机构的重要组成部分。Oracle 数据库对系统内存的总开销即是PGA+SGA。SGA主
要由库缓存(共享SQL区和PL/SQL区)和数据字典缓存组成。而PGA包含客户端连接服务器所派生的服务器进程的集合,每个服务器进程都拥有存放
数据和控制信息的私有内存区域。客户端进程和服务器端进程一一对应,由服务器端进程完成用户的请求,并将数据返回给客户端进程。

一、PGA的主要特性及结构
1、主要特性
不同于SGA,此部分为非共享的内存
服务器进程启动或创建时分配,结束时释放,只能被一个进程使用(在系统运行时,排序,连接等操作可能需要进一步的PGA分配)
PGA的内容随服务器的模式(专用模式/共享服务器模式)不同而不用
所有服务器进程分配的PGA总和通常被称为PGA合计(Aggregated PGA),该值由由参数:pga_aggregate_target 决定

2、PGA的结构
PGA包括了以下几个结构:
排序区(Sort)
游标状态区(Cursor)
会话信息区(Session)
堆栈区(Stack)
PGA=UGA+排序区+散列区+位图合并区

3、UGA
与PGA相关的另一概念即是UGA(User Global Area),即用户全局区,与特定的会话相关联。
专用服务器连接模式,UGA在PGA中分配。
  共享服务器连接模式,UGA在SGA中的Large Pool中分配。
  如果采用专用服务器连接模式,PGA中包含UGA,其他区域用来排序,散列和位图合并。

4、导致排序的常用操作(耗用sort_area_size)
ORDER BY,GROUP BY,ROLLUP,DISTINCT
MINUS,INTERSECT,UNION
MIN(),MAX(),COUNT()
哈希连接
位图合并
位图创建
批量数据装载

二、PGA的管理模式与设置
  1、PGA分两种管理模式:
手动PGA内存管理:用户指定排序区和散列区所使用的内存,每个连接使用相同的内存。
自动PGA内存管理:告诉Oracle可以使用的PGA的总量,由Oraclce根据系统负载决定具体分配。即PGA内存可以动态扩大和回收

9iR1时默认为手动PGA内存管理,9iR2以后默认为自动PGA内存管理。

  2、PGA内存管理模式设置(参数workarea_size_policy)
设为MANUAL,使用手动管理方式。
   设为AUTO,并且pga_aggregate_target不为0时,启用自动内存管理。

3、PGA相关的参数
bitmap_merge_area_size -->位图合并区分配的值
create_bitmap_area_size -->创建位图分配的值
hash_area_size -->主要用于hash join时分配的大小
sort_area_size -->排序所用的内存总量,影响one-pass,multi-pass,optimal
sort_area_retained_size -->排序后在内存中保存排序信息的内存总量
这几个参数在Oracle 9i之前被使用,在Oracle 9i可以对这几个参数进行手动分配,亦可以由系统自动分配。
当使用workarea_size_policy为AUTO且pga_aggregate_target非零值时,上述四个参数建议根据系统自动负荷自动调整
SQL> show parameter area_size
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
bitmap_merge_area_size integer 1048576
create_bitmap_area_size integer 8388608
hash_area_size integer 131072
sort_area_size integer 65536
workarea_size_policy string AUTO

pga_aggregate_target
a.决定了所有session总计可使用最大PGA内存值,该参数可动态修改。连接数少时则实际分配的PGA内存通常小于target值,当连接
数多的时候则实际分配的PGA内存会超过target值。target值为尽可能保持的目标值。
b.全局PGA分配以及私有工作区分配受限于该参数
c.该参数在9i中仅支持专有服务器模式,在10g之后既支持专有服务器模式也支持共享服务器模式
d.pga_aggregate_target被分为可调整区和不可调整区,可调整区为SQL工作区,其余为不可调整区
e.当少量用户连接到数据库时,则每个用户享有相对较多的PGA内存,而当大量用户连接时则每个用户分配相对较少的PGA内存。
f.单个串行查询(非并行查询)可能包括多个排序/散列操作,每个排序/散列操作最多使用5%的PGA内存。
h.单个并行查询最多可用到30%的PGA内存,无论有多少并行进程。

SQL> select name,value,display_value
2 from v$parameter where name in ('pga_aggregate_target','workarea_size_policy');
NAME VALUE DISPLAY_VALUE
-------------------- -------------------- -------------------------
pga_aggregate_target 199229440 190M
workarea_size_policy AUTO AUTO

三、PGA 的分配原则
PGA_AGGREGATE_TARGET的值应该基于Oracle实例可利用内存的总量来设置。假定当前服务器可分配物理内存为4GB,且仅一个实例运行在
该服务器,则可以考虑分配80%的可用内存给Oracle实例,即3.2G。剩下的内存分配给操作系统和其它应用程序。此时必须在内存中划分
SGA和PGA区域。

在OLTP系统中,典型PGA内存设置应该是总内存的较小部分(例如20%),剩下80%分配给SGA。
OLTP:PGA_AGGREGATE_TARGET = (total_mem * 80%) * 20%

在DSS系统中,由于会运行一些很大的查询,典型的PGA内存最多分配70%的内存。
DSS:PGA_AGGREGATE_TARGET = (total_mem * 80%) * 50%
在这个例子中,总内存4GB,DSS系统,你可以设置PGA_AGGREGATE_TARGET为1600MB,OLTP则为655MB。

四、PGA的调整建议

对于PGA的监控与调整,可以通过下列视图作为参考 v$pgastat v$pga_target_advice v$pga_target_advice_histogram 1、查看v$pgastat视图获得PGA的相关信息 SQL> select * from v$pgastat; NAME VALUE UNIT -------------------------------------- ------------ ------------ aggregate PGA target parameter 199229440 bytes --当前PGA_AGGREGATE_TARGET设定的值 aggregate PGA auto target 127153152 bytes --剩余的能被工作区(workarea)使用的内存(AUTO模式) global memory bound 39845888 bytes --单条SQL串行操作的最高PGA内存使用量(AUTO模式) total PGA inuse 62769152 bytes --正被耗用的pga(包括workarea pl/sql等所有占用的pga) total PGA allocated 132114432 bytes --当前实例已分配的PGA内存总量 maximum PGA allocated 299982848 bytes --PGA曾经扩张到的最大值 total freeable PGA memory 10223616 bytes --PGA的可释放的大小 process count 19 --当前process max processes count 42 --最大时候的process PGA memory freed back to OS 46708359168 bytes --PGA返回给操作系统的累计值 total PGA used for auto workareas 4829184 bytes --PGA分配给auto workareas的总大小 maximum PGA used for auto workareas 39851008 bytes --PGA分配给auto workareas峰值 total PGA used for manual workareas 0 bytes maximum PGA used for manual workareas 531456 bytes over allocation count 1 --使用量超过pga大小的次数 bytes processed 96178293760 bytes --pga使用的字节 extra bytes read/written 1855111168 bytes --向临时段写的字节 cache hit percentage 98 percent --命中率 recompute count (total) 1473108 -->从上面的统计信息可以看出maximum PGA allocated的值远大于aggregate PGA target parameter的值,且over allocation count, -->此时应考虑增加PGA target的值

2、v$pga_target_advice_histogram视图 该视图可以显示各种不同排序工作区的使用情况, OPTIMAL_EXECUTIONS是不需要通过临时表空间交换的操作的次数。 ONEPASS_EXECUTIONS是需要进行一次临时表空间交换的操作次数。 MULTIPASSES_EXECUTIONS是需要多次临时表空间交换的操作次数。 原则上,如果100%的操作都是内存操作,是最佳的选择。如果内存不足,某些大型操作是ONEPASS的,也是可以接受的。 出现MULTIPASSES的操作会引起性能的急剧下降,此时应考虑调整PGA target /**************************************************/ /* Author: Robinson Cheng */ /* Blog: http://blog.youkuaiyun.com/robinson_0612 */ /* MSN: robinson_0612@hotmail.com */ /* QQ: 645746311 */ /**************************************************/ SQL> SELECT LOW_OPTIMAL_SIZE/1024 low_kb,(HIGH_OPTIMAL_SIZE+1)/1024 high_kb, 2 optimal_executions opt_exec, onepass_executions onepass_exec, multipasses_executions multipass_exec 3 FROM v$sql_workarea_histogram 4 WHERE total_executions != 0; LOW_KB HIGH_KB OPT_EXEC ONEPASS_EXEC MULTIPASS_EXEC ---------- ---------- ---------- ------------ -------------- 2 4 1013515 0 0 64 128 7041 0 0 128 256 1499 0 0 256 512 1222 0 0 512 1024 67917 0 0 1024 2048 19057 0 0 2048 4096 3450 0 0 4096 8192 770 4 0 8192 16384 37 0 0 32768 65536 2 7 0 131072 262144 0 24 0 LOW_KB HIGH_KB OPT_EXEC ONEPASS_EXEC MULTIPASS_EXEC ---------- ---------- ---------- ------------ -------------- 262144 524288 0 4 0 3、从v$pga_target_advice获取pga设置的建议值 SQL> select pga_target_for_estimate / 1024 / 1024 pgamb, 2 pga_target_factor p_tr_fct, 3 estd_pga_cache_hit_percentage e_p_c_hit_prct, 4 estd_overalloc_count e_or_cnt 5 from v$pga_target_advice; PGAMB P_TR_FCT E_P_C_HIT_PRCT E_OR_CNT ---------- ---------- -------------- ---------- 23.75 .125 82 1179 47.5 .25 82 1179 95 .5 95 233 142.5 .75 99 6 190 1 99 1 228 1.2 99 0 266 1.4 99 0 304 1.6 99 0 342 1.8 99 0 380 2 99 0 570 3 99 0 760 4 99 0 1140 6 99 0 1520 8 99 0 --从上面的查询中可以看出当设置PGA的大小为228MB时,可以消除PGA过载的情形。

4、通过V$SYSSTAT查看排序区的情况 -->下面查看当前系统中optimal,onepass,multipass几种不同排序下所占的比率 -->关于排序应当尽可能的为optimal,避免过多的multipass SQL> col profile format a40 SQL> SELECT name profile, cnt, decode(total, 0, 0, round(cnt*100/total,4)) percentage 2 FROM (SELECT name, value cnt, (sum(value) over ()) total FROM V$SYSSTAT WHERE name like 'workarea exec%'); PROFILE CNT PERCENTAGE ---------------------------------------- ---------- ---------- workarea executions - optimal 1113054 99.999 workarea executions - onepass 11 .001 workarea executions - multipass 0 0 -->下面查看内存排序占总排序的比率,此值越高越好.如此值较小,应结合v$pga_target_advice考虑调整pga SQL> SELECT round(m.value / (m.value + d.value), 4) * 100 || '%' memory_disk_sort_ratio 2 FROM (SELECT value FROM v$sysstat WHERE NAME = 'sorts (memory)') m, 3 (SELECT value FROM v$sysstat WHERE NAME = 'sorts (disk)') d; MEMORY_DISK_SORT_RATIO ----------------------------------------- 100%

五、PGA的调整命令
系统级更改:

  ALTER SYSTEM SET WORKAREA_SIZE_POLICY = {AUTO | MANAUL};

  ALTER SYSTEM SET PGA_AGGREGATE_TARGET=239075328;

  ALTER SYSTEM SET SORT_AREA_SIZE = 65536 SCOPE = SPFILE;-->使用AUTO方式时该参数不起作用

  ALTER SYSTEM SET HASH_AREA_SIZE = 65536 SCOPE = SPFILE;-->使用AUTO方式时该参数不起作用

  会话级更改

  ALTER SESSION SET WORKAREA_SIZE_POLICY = {AUTO | MANAUL};

  ALTER SESSION SET SORT_AREA_SIZE = 65536;-->使用AUTO方式时该参数不起作用

  ALTER SESSION SET HASH_AREA_SIZE = 65536;-->使用AUTO方式时该参数不起作用

六、更多参考

Oracle 硬解析与软解析

共享池的调整与优化(Shared pool Tuning)

Buffer cache 的调整与优化(一)

Buffer cache 的调整与优化(二)

Oracle 表缓存(caching table)的使用


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值