在Oraclei之前PGA的计算和控制都是比较复杂的事情从Oraclei开始Oracle提供了一种SQL内存管理的新方法自动化SQL执行内存管理(Automated SQL Execution Memory Management)使用这个新特性Oracle可以自动调整S Q L内存区而不用关闭数据库这一改进大大简化了DBA的工作同时也提高了Oracle数据库的性能
为实现自动的PGA管理Oracle引入了几个新的初始化参数
PGA_AGGREGATE_TARGET此参数用来指定所有session总计可以使用最大PGA内存这个参数可以被动态的更改取值范围从M —— (G )bytes WORKAREA_SIZE_POLICY此参数用于开关PGA内存自动管理功能该参数有两个选项AUTO 和 MANUAL当设置为AUTO时数据库使用Oraclei提供的自动PGA管理功能当设置为MANUAL时则仍然使用Oraclei前手工管理的方式
缺省的Oraclei中WORKAREA_SIZE_POLICY被设置为AUTO
需要注意的是在Oraclei中PGA_AGGREGATE_TARGET参数仅对专用服务器模式下(Dedicated Server)的专属连接有效但是对共享服务器(Shared Server)连接无效从Oracleg开始PGA_AGGREGATE_TARGET对专用服务器连接和共享服务器连接同时生效
PGA_AGGREGATE_TARGET 参数同时限制全局PGA分配和私有工作区内存分配
对于串行操作单个SQL操作能够使用的PGA内存按照以下原则分配MIN(% PGA_AGGREGATE_TARGETMB)
对于并行操作% PGA_AGGREGATE_TARGET /DOP (DOP=Degree Of Parallelism 并行度)
要理解PGA的自动调整还需要区分可调整内存(TUNABLE MEMORY SIZE)与不可调整内存(UNTUNABLE MEMORY SIZE)可调整内存是由SQL工作区使用的其余部分是不可调整内存
启用了自动PGA调整之后 Oracle仍然需要遵循以下原则
UNTUNABLE MEMORY SIZE + TUNABLE MEMORY SIZE <= PGA_AGGREGATE_TARGET
数据库系统只能控制可调整部分的内存分配如果可调整的部分过小则Oracle永远也不会强制启用这个等式
另外PGA_AGGREGATE_TARGET参数在CBO优化器模式下对于SQL的执行计划会产生影响Oracle在评估执行计划时会根据PGA_AGGREGATE_TARGET参数评估在SortHASHJOIN或Bitmap操作时能够使用的最大或最小内存从而选择最优的执行计划
对于PGA_AGGREGATE_TARGET参数的设置Oracle提供这样一个建议方案对于OLTP系统PGA_AGGREGATE_TARGET = (<Total Physical Memory > * %) * % 对于DSS系统PGA_AGGREGATE_TARGET = (<Total Physical Memory > * %) * %
也就是说对于一个单纯的数据库服务器通常我们需要保留%的物理内存给操作系统使用剩余%可以分配给Oracle使用Oracle使用的内存分为两部分SGA和PGA那么PGA可以占用Oracle消耗总内存的%(OLTP系统)至%(DSS系统)
这只是一个建议设置更进一步的我们应该根据数据库的具体性能指标来调整和优化PGA的使用