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的调整命令
  系统级更改:

   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)的使用

  

 

你可能感兴趣的:(设置)