PGA的设置与调整

news/2024/6/19 6:22:08 标签: 服务器, integer, oracle, allocation, sql, session
 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的调整建议

sql">
[sql] view plain copy print ?
    sql">
  1. <p> 对于PGA的监控与调整,可以通过下列视图作为参考  
  2.   v$pgastat  
  3.   v$pga_target_advice  
  4.   v$pga_target_advice_histogram  
  5.    
  6.  1、查看v$pgastat视图获得PGA的相关信息  
  7.   SQL> select * from v$pgastat;  
  8.     
  9.   NAME                                          VALUE UNIT  
  10.   -------------------------------------- ------------ ------------  
  11.   aggregate PGA target parameter            199229440 bytes   --当前PGA_AGGREGATE_TARGET设定的值                                      
  12.   aggregate PGA auto target                 127153152 bytes   --剩余的能被工作区(workarea)使用的内存(AUTO模式)           
  13.   global memory bound                        39845888 bytes   --单条SQL串行操作的最高PGA内存使用量(AUTO模式)        
  14.   total PGA inuse                            62769152 bytes   --正被耗用的pga(包括workarea pl/sql等所有占用的pga)  
  15.   total PGA allocated                       132114432 bytes   --当前实例已分配的PGA内存总量             
  16.   maximum PGA allocated                     299982848 bytes   --PGA曾经扩张到的最大值  
  17.   total freeable PGA memory                  10223616 bytes   --PGA的可释放的大小       
  18.   process count                                    19         --当前process  
  19.   max processes count                              42         --最大时候的process                                
  20.   PGA memory freed back to OS             46708359168 bytes   --PGA返回给操作系统的累计值                                   
  21.   total PGA used for auto workareas           4829184 bytes   --PGA分配给auto workareas的总大小                
  22.   maximum PGA used for auto workareas        39851008 bytes   --PGA分配给auto workareas峰值  
  23.   total PGA used for manual workareas               0 bytes                                                             
  24.   maximum PGA used for manual workareas        531456 bytes  
  25.   over allocation count                             1         --使用量超过pga大小的次数  
  26.   bytes processed                         96178293760 bytes   --pga使用的字节  
  27.   extra bytes read/written                 1855111168 bytes   --向临时段写的字节  
  28.   cache hit percentage                             98 percent --命中率   
  29.   recompute count (total)                     1473108  
  30.   -->从上面的统计信息可以看出maximum PGA allocated的值远大于aggregate PGA target parameter的值,且over allocation count,  
  31.   -->此时应考虑增加PGA target的值</p><p> 2、v$pga_target_advice_histogram视图  
  32.    该视图可以显示各种不同排序工作区的使用情况,  
  33.    OPTIMAL_EXECUTIONS是不需要通过临时表空间交换的操作的次数。  
  34.    ONEPASS_EXECUTIONS是需要进行一次临时表空间交换的操作次数。  
  35.    MULTIPASSES_EXECUTIONS是需要多次临时表空间交换的操作次数。  
  36.    原则上,如果100%的操作都是内存操作,是最佳的选择。如果内存不足,某些大型操作是ONEPASS的,也是可以接受的。  
  37.    出现MULTIPASSES的操作会引起性能的急剧下降,此时应考虑调整PGA target  
  38.    /**************************************************/  
  39.    /* Author: Robinson Cheng                         */  
  40.    /* Blog:   http://blog.csdn.net/robinson_0612     */  
  41.    /* MSN:    robinson_0612@hotmail.com              */  
  42.    /* QQ:     645746311                              */  
  43.    /**************************************************/  
  44.  SQL> SELECT LOW_OPTIMAL_SIZE/1024 low_kb,(HIGH_OPTIMAL_SIZE+1)/1024 high_kb,                                     
  45.    2         optimal_executions opt_exec, onepass_executions onepass_exec, multipasses_executions multipass_exec  
  46.    3  FROM   v$sql_workarea_histogram                                                                             
  47.    4  WHERE  total_executions != 0;                                                                               
  48.    
  49.      LOW_KB    HIGH_KB   OPT_EXEC ONEPASS_EXEC MULTIPASS_EXEC  
  50.  ---------- ---------- ---------- ------------ --------------  
  51.           2          4    1013515            0              0  
  52.          64        128       7041            0              0  
  53.         128        256       1499            0              0  
  54.         256        512       1222            0              0  
  55.         512       1024      67917            0              0  
  56.        1024       2048      19057            0              0  
  57.        2048       4096       3450            0              0  
  58.        4096       8192        770            4              0  
  59.        8192      16384         37            0              0  
  60.       32768      65536          2            7              0  
  61.      131072     262144          0           24              0  
  62.    
  63.      LOW_KB    HIGH_KB   OPT_EXEC ONEPASS_EXEC MULTIPASS_EXEC  
  64.  ---------- ---------- ---------- ------------ --------------  
  65.      262144     524288          0            4              0  
  66.       
  67.  3、从v$pga_target_advice获取pga设置的建议值  
  68.   SQL> select pga_target_for_estimate / 1024 / 1024 pgamb,  
  69.     2        pga_target_factor p_tr_fct,  
  70.     3        estd_pga_cache_hit_percentage e_p_c_hit_prct,  
  71.     4        estd_overalloc_count e_or_cnt  
  72.     5  from   v$pga_target_advice;  
  73.     
  74.        PGAMB   P_TR_FCT E_P_C_HIT_PRCT   E_OR_CNT  
  75.   ---------- ---------- -------------- ----------  
  76.        23.75       .125             82       1179  
  77.         47.5        .25             82       1179  
  78.           95         .5             95        233  
  79.        142.5        .75             99          6  
  80.          190          1             99          1  
  81.          228        1.2             99          0  
  82.          266        1.4             99          0  
  83.          304        1.6             99          0  
  84.          342        1.8             99          0  
  85.          380          2             99          0  
  86.          570          3             99          0  
  87.          760          4             99          0  
  88.         1140          6             99          0  
  89.         1520          8             99          0  
  90.   --从上面的查询中可以看出当设置PGA的大小为228MB时,可以消除PGA过载的情形。</p>  
  91. <span style="font-family:SimSun;">4、通过V$SYSSTAT查看排序区的情况  
  92.   -->下面查看当前系统中optimal,onepass,multipass几种不同排序下所占的比率  
  93.   -->关于排序应当尽可能的为optimal,避免过多的multipass  
  94.   SQL> col profile format a40  
  95.   SQL> SELECT name profile, cnt, decode(total, 0, 0, round(cnt*100/total,4)) percentage  
  96.     2  FROM (SELECT name, value cnt, (sum(value) over ()) total FROM V$SYSSTAT WHERE name like 'workarea exec%');  
  97.     
  98.   PROFILE                                         CNT PERCENTAGE  
  99.   ---------------------------------------- ---------- ----------  
  100.   workarea executions - optimal               1113054     99.999  
  101.   workarea executions - onepass                    11       .001  
  102.   workarea executions - multipass                   0          0    
  103.     
  104.   -->下面查看内存排序占总排序的比率,此值越高越好.如此值较小,应结合v$pga_target_advice考虑调整pga  
  105.   SQL> SELECT round(m.value / (m.value + d.value), 4) * 100 || '%' memory_disk_sort_ratio  
  106.     2  FROM   (SELECT value FROM v$sysstat WHERE NAME = 'sorts (memory)') m,  
  107.     3        (SELECT value FROM v$sysstat WHERE NAME = 'sorts (disk)') d;  
  108.     
  109.   MEMORY_DISK_SORT_RATIO  
  110.   -----------------------------------------  
  111.   100%</span>  

五、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方式时该参数不起作用 


http://www.niftyadmin.cn/n/1024916.html

相关文章

心态不好,你将永远是个弱者!

生活中&#xff0c;一个好的心态&#xff0c;可以使你乐观豁达&#xff1b;一个好的心态&#xff0c;可以使你战胜面临的苦难&#xff1b;一个好的心态&#xff0c;可以使你淡泊名利&#xff0c;过上真正快乐的生活。人类几千年的文明史告诉我们&#xff0c;积极的心态能帮助我…

oracle数据库修改命失败,oracle nid 修改数据库名失败,数据库无法启动异常处理...

概述oracle nid工具可用于修改数据库名&#xff0c;在修改过程中失败&#xff0c;将导致部分文件修改成功&#xff0c;部分文件修改失败&#xff0c;数据库无法启动&#xff0c;这里记录对该问题的修复。nidDBNEWID: Release 11.2.0.4.0 - Production on Mon Nov 9 11:00:23 20…

启用 Oracle 10046 调试事件

Oracle 10046是一个Oracle内部事件。最常用的是在Session级别设置sql_trace(alter session set sql_tracetrue)即是开启了级别为1的10046调试事件。当设置了10046事件之后&#xff0c;Oracle 将产生一个dump文件。通过得到的dump文件进行进一步分析&#xff0c;可以得到Oracle …

oracle 存储过程 ora-01403: 未找到任何数据,ORA-01403: 未找到数据问题+存储过程循环跳转...

执行一个&#xff30;&#xff2c;&#xff0f;&#xff33;&#xff31;&#xff2c; 块&#xff0c;总是报这个错&#xff1a;ORA-01403: 未找到数据问题&#xff0c;在网上搜索了半天&#xff0c;找到一个解决办法。比较彻底的办法就是添加一个异常处理~另外&#xff0c;在其…

js从60秒减到0停止_求大神用c语言写个数码管显示数字60,当键按下后,系统从60...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器typedef unsigned int u16; //对数据类型进行声明定义typedef unsigned char u8;sbit LSAP2^2;sbit LSBP2^3;sbit LSCP2^4;#define GPIO P0u8 code smgdu…

iOS - 正则表达式判断邮箱、手机号码验证、车牌号验证、车型、用户名、密码、昵称、身份证号...

//邮箱 (BOOL) validateEmail:(NSString *)email{NSString *emailRegex "[A-Z0-9a-z._%-][A-Za-z0-9.-]\\.[A-Za-z]{2,4}";NSPredicate *emailTest [NSPredicate predicateWithFormat:"SELF MATCHES %", emailRegex];return [emailTest evaluateWithObj…

oracle用户能访问的表,oracle – 列出可以访问某些表的用户

列出已分配特定角色的所有用户-- Change DBA to the required roleselect * from dba_role_privs where granted_role DBA列出给予用户的所有角色-- Change PHIL to the required userselect * from dba_role_privs where grantee PHIL;列出给予用户的所有权限selectlpad( , …

consistent gets减少,cost增加?

在一条SQL语句中&#xff0c;当使用索引时&#xff0c;cosistent gets 减少&#xff0c;而cost增加。理论上在稳定后的执行计划中&#xff0c;physical reads为零值的前提下&#xff0c;cost应当相应减少。下面来看看其原由。 1、原始的SQL语句 [sql] view plaincopyprint?…