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=;
查看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;