SGA(System Global Area),即系统全局区,管理数据库buffer cache,java,stream的内存区

PGA (Process Global Area),即程序全局区,主要用于管理进程的内存区

UGA(User Global Area),即用户全局区,处理用户会话相关信息的内存区

CGA(Call Global Area),即调用全局区,处理如排序、HASH JOIN、位图合并等工作的内存区

 

如果采用专用服务模式(Dedicated Server Connection)那么UGA在PGA中分配,如果采用共享服务模式(Shared Server Connection),那么UGA在SGA区的Large pool中分配。

 

UGA组成:

UGA=User Session+Cursor state+Sort Area Retained

 

User Session:用户会话,存放用户权限、角色、性能统计等信息。

Cursor state(私有SQL区):即一个句柄,或称为指针、引用指向Sql私有区。然后私有Sql区又指向共享Sql区。私有Sql区分两个部分:

固定部分:绑定信息,数据结构信息,指针。随session的创建而创建,结束而释放。

动态部分:执行sql的中间结果集,如多表关联、排序。随sql创建而创建,结束而释放。

 

专用模式下的PGA组成:

PGA=UGA+CGA

 

PGA的管理模式:

  • 手动管理模式,用户指定排序区和散列区所使用的内存,每个连接使用相同的内存。

  • 自动管理模式,设定PGA的总量,由Oracle根据系统负载自行决定分配。

 

PGA内存管理模式由WORKAREA_SIZE_POLICY控制

设为MANUAL,启动手动内存管理。

设为AUTO,并且PGA_AGGREGATE_TARGET不为0时,启动自动内存管理。

 

手动PGA内存管理受三个参数的影响最大

SORT_AREA_SIZE 排序区,用于排序时存放排序数据的内存区,属于PGA

SORT_AREA_RETAINTED_SIZE 排序完成后用于保存排序数据的内存,属于UGA

HASH_AREA_SIZE 储存散列表的内存

 

这三个参数设置的情况如下:

SORT_AREA_SIZE=SORT_AREA_RETAINTED_SIZE

则排序在内存中进行,且排序结果均保存在内存中。

SORT_AREA_SIZE>SORT_AREA_RETAINTED_SIZE

则在SORT_AREA_SIZE规定的大小中排序,并保留SORT_AREA_RETAINTED_SIZE规定大小的排序数据,超出部分排序数据写到临时表中,排序完成后,把排序数据存放在SORT_AREA_RETAINTED_SIZE,最终反馈给终端。如果SORT_AREA_RETAINTED_SIZE设置为0,则与第一种情况相同。

 

当一个多个结果集关联时,会用到HASH_AREA_SIZE,两个集合中较小的一个会散列到内存中作为驱动表,散列区放不下的部分都会通过联结键存储在临时表空间中。HASH_AREA_SIZE过小会影响集合关联时的性能。

 

备注:

       1)如需要排序的数据量大于SORT_AREA_SIZE,Oracle进行分批排序,将排序的结果存到临时表空间中,然后对剩余部分进行排序。最后还需要对保存在临时表中的已排序数据进行再排序,因为每次保存到临时表空间中的已排序数据只是部分数据的排序,对于整体来说只是局部排序。

        2)参数的限制仅是对某个操作的限制,一个查询可以有多个操作,例如一个查询有10个排序,如果SORT_AREA_SIZE限制为5M,则10个排序占用50M排序内存。

 

设置PGA自动管理

SQL> alter system set WORKAREA_SIZE_POLICY=auto;
SQL> alter system set PGA_AGGREGATE_TARGET=<size>;

 

查看PGA建议视图

SELECT trunc(pga_target_for_estimate / 1024 / 1024) pga_target_for_estimate,
       to_char(pga_target_factor * 100, '999.9') || '%' pga_target_factor,
       trunc(bytes_processed / 1024 / 1024) bytes_processed,
       trunc(estd_extra_bytes_rw / 1024 / 1024) estd_extra_bytes_rw,
       to_char(estd_pga_cache_hit_percentage, '999') || '%' estd_pga_cache_hit_percentage,
       estd_overalloc_count
  FROM v$pga_target_advice;

 

 

参考 http://www.2cto.com/database/201309/242229.html