Oracle 10g数据库中需要设置workarea_size_policy为AUTO,并设置pga_aggregate_target参数来实现PGA的内存管理。接下来我们就来介绍这一设置过程的实现。首先看看如下代码:
SQL>showparameterpga NAMETYPEVALUE ----------------------------------------------------------------------------- pga_aggregate_targetbiginteger169M SQL>showparameterworkarea NAMETYPEVALUE ----------------------------------------------------------------------------- workarea_size_policystringAUTO SQL>showparameterpga NAMETYPEVALUE ----------------------------------------------------------------------------- pga_aggregate_targetbiginteger169M SQL>showparameterworkarea NAMETYPEVALUE ----------------------------------------------------------------------------- workarea_size_policystringAUTO
pga_aggregate_target参数可以根据经验值进行设置,评估PGA的简单方法可以查看AWR报告中的PGA命中率(PGA Cache Hit%),以及分析direct path read temp和direct path write temp等待事件是否比较高,这些等待表示PGA设置参数有限而导致大量临时表空间操作出现的等待事件。当然还有复杂的评估PGA的方法,以后再看吧。
注意,9I的shared server连接需要明确设置SORT_AREA_SIZE 和 HASH_AREA_SIZE,也就是说不能用自动管理模式。10G则无此限制。
PGA_AGGREGATE_TARGET是一个上限(理论上的***值,PL/SQL就很容易超过),ORACLE启动时并不分配那么多,你甚至可以设置大于物理MEM的大小(生产库不要这么做呀,要设置pga_aggregate_target+sga<MEM ,别挑战ORACLE的极限)。一个SESSION可能有多个sort,hash的workarea,每一个workarea最多会用到5%或100M(由两个隐藏参数控制),因此如果预计每个sort,hash的workarea是5M,应该设置PGA_AGGREGATE_TARGET成100M。但是,随着用户的增加或工作量的增大,给每个workarea的容量可能会减少,因为有总量PGA_AGGREGATE_TARGET的限制,比如需要100个workarea,那么每个只能分配到1M。
parallel query会用到最多30%(由隐藏参数控制)的PGA_AGGREGATE_TARGET,每一个parallel query的PIECE会分配相应的30%,也就是parallel query可能会用到30M,10个PARALLEL,那么每个用3M。这也就是建议用auto管理的原因,一个系统通常workload,session是随时间变化的,早上可能3个用户,中午可能300个用户,所以用固定sort,hash的参数是不合时宜的.自动管理才可以实现在用户并发少的时候分配更多的内存,在并发多的时候照顾大众,分配少的内存。ORACLE 9.2以后有了PGA advisory。这一段中所说的5%,30%不知是否正确,没有时间看oracle文档,在此提醒一下自己。
v$pgastat:
SQL>setpagesize200 SQL>selectname||''||to_char(decode(unit, 'bytes',value/1024/1024, value),'999,999,999.9')||''|| decode(unit,'bytes','mbytes',unit fromv$pgastat; NAME||''||TO_CHAR(DECODE(UNIT,'BYTES',VALUE/1024/1024,VALUE),'999,999,999.9')||''||DECODE(UN -------------------------------------------------------------------------------------------- aggregatePGAtargetparameter169.0mbytes aggregatePGAautotarget124.3mbytes globalmemorybound33.8mbytes totalPGAinuse30.9mbytes totalPGAallocated65.4mbytes maximumPGAallocated82.2mbytes totalfreeablePGAmemory.0mbytes processcount24.0 maxprocessescount33.0 PGAmemoryfreedbacktoOS.0mbytes totalPGAusedforautoworkareas.0mbytes maximumPGAusedforautoworkareas.6mbytes totalPGAusedformanualworkareas.0mbytes maximumPGAusedformanualworkareas.0mbytes overallocationcount.0 bytesprocessed23.5mbytes extrabytesread/written.0mbytes cachehitpercentage100.0percent recomputecount(total)817.0
几个重要参数的说明:
aggregate PGA target parameter 设置的pga的目标参数值。
aggregate PGA auto target 在自动管理模式下,oracle工作区可使用的pga。
total PGA inuse 当前实例使用的pga。
total PGA allocated 当前实例实际分配的pga。
maximum PGA allocated 可分配的***pga。
over allocation count ORACLE分配的PGA超过pga_aggregate_target的次数.这个参数可以判断pga_aggregate_target是否设置的太小。
cache hit percentage 自从instance启动后的PGA命中率,如果所有的操作都在MEM中进行没有在TEMP里运行的话应该是100%。
【编辑推荐】
- SQL Server 2005数据库用户权限管理的设置浅析SQL Server数据库专用管理员连接DAC的使用在SQL SERVER 2005执行存储过程的权限分配问题忘记sa密码,又删除了administrators帐号的解决方法T-SQL行列相互转换命令:PIVOT和UNPIVOT使用详解