1.概念简介
1)PGA: 程序全局区(Program Global Area),服务器进程的私有内存区域,涉及服务器进程相关私有内存的所有区域和信息。
2)UGA: 用户全局区(User Global Area),会话相关的内存区域。shared server模式中,UGA从SGA的large pool(如果设置)或者shared pool(没有设置large pool)中分配;dedicated server模式中,UGA从PGA中分配。
3)CGA: 调用全局区(Call Global Area),存放调用过程中的数据。调用过程中的数据,象:SQL Area、Sort Area等位于UGA中;CGA存放的只是调用过程中的临时数据。CGA存在于PGA中,调用开始时创建,调用执行中分配,调用结束后释放。
2.参数及设置详述
1)workarea_size_policy
--语法:
{alter system|session} set workarea_size_policy={auto|manual};
--说明:
该参数设为AUTO时,使用内存较多的SQL操作,例如sort, group by, hash join, bitmap merge和bitmap create等,由Oracle自动分配内存;设为MANUAL时,前述操作将使用相应*_AREA_SIZE参数设置的内存值。
*_AREA_SIZE针对所有Session,设置过小,有些Session可能得不到足够的内存,设置过大,有些Session可能会浪费内存空间。9i开始,PGA自动管理使得该现象得以改善。使用PGA_AGGREGATE_TARGET设置整个PGA大小,Oracle为每个Session按需分配PGA,且尽量使PGA总量低于PGA_AGGREGATE_TARGET值。
2)pga_aggregate_target
--语法:
alter system set pga_aggregate_target=integer[k|m|g];
--说明:
设置PGA总内存大小。Oracle将尽力使PGA总内存不超过该值,但这不是硬限制,指示一个目标值,既有时可能会超过这个值。
将该参数设置为大于0,Oracle将自动设置WORKAREA_SIZE_POLICY为AUTO;将该参数设置为0,Oracle将自动设置WORKAREA_SIZE_POLICY为MANUAL。设置PGA_AGGREGATE_TARGET后,Oracle将忽略所有*_AREA_SIZE参数设置。
3)hash_area_size
{alter system|session} set hash_area_size=integer [deferred];
--说明:
该参数单位为字节。
4)sort_area_size
--语法:
{alter system|session} set sort_area_size=integer [deferred];
--说明:
该参数单位为字节。如果没有设置sort_area_retained_size,为排序操作分配的内存,排序结束且返回记录前释放,如果设置了前述参数,为排序操作分配的内存在所有结果返回后释放。此外,对位图索引的插入、更新操作也会用到SORT_AREA_SIZE。
5)sort_area_retained_size
--语法:
{alter system|session} set sort_area_retained_size=integer [deferred];
--说明:
该参数单位为字节。该参数表示UGA中为排序操作保留的内存大小,排序操作结束,返回结果后将内存释放给UGA,而非操作系统。
6)_pga_max_size
--语法:
{alter system|session} set pga_max_size=integer[k|m|g];
--说明:
该参数为系统隐含参数,用于设置每个进程的最大PGA内存大小,其默认值为200M。该参数值可以通过如下SQL查看:
select ksppinm "Name", ksppstvl/1024/1024 ||'M' "Value", ksppdesc "Desc"
from x$ksppi x, x$ksppcv y
where x.indx = y.indx and ksppinm ='_pga_max_size';
7)_smm_max_size
--语法:
{alter system|session} set pga_max_size=integer;
--说明:
该参数为隐含参数,用于设置每个进程自动模式下最大工作区大小(串行)。如果没有手动设置修改过_smm_max_size默认值,但设置了_pga_max_size或pga_aggregate_target,那么,Oracle会自动计算出_smm_max_size值。如果手动设置了_smm_max_size,则该参数值就是设置的数值,单位为kb。查看该参数值的具体SQL如下:
select ksppinm "Name", ksppstvl/1024 ||'M' "Value", ksppdesc "Desc"
from x$ksppi x, x$ksppcv y
where x.indx = y.indx and ksppinm ='_smm_max_size';
使用pga_aggregate_target实现自动分配pga时,这两个参数控制了单个进程的最大内存使用量,这两个参数为隐含参数。非并行查询时,单个会话的工作区最大内存使用量为min( 5%*PGA_AGGREGATE_TARGET , 50%*_pga_max_size , _smm_max_size)。
设置两个参数的命令举例如下:
alter system set "_pga_max_size"=1024M|1G;
alter system set "_smm_max_size"=307200,单位只能是k,数字值后不能用K、M、G等单位。