Oracle从9i开始增加了PGA自动管理的功能,可以说是打开了ORACLE内存自动管理的新篇章。PGA自动管理把以前的sort_area_size,hash_area_size比较难配置的问题全解决了。一般建议OLTP系统PGA的大小为系统内存的20%左右,如一个系统2G的内存,那么通常数据库的PGA设置在400M左右。
ORACLE缺省每个session可使用的内存并不是全部PGA大小,实际上比这个小得多,普通会话可使用只有PGA的5%,并且不能超过100M,也就是说如果PGA设成400M,那一个会话可使用的排序加HASH的内存最大为400*0.05=20M。
有些OLAP或者是OLTP、OLAP混合数据库这个配置不一定能满足实际需求,因为OLAP系统一般session比较少,但一个查询要求的HASH及SORT的空间非常大,如果采用标准的5%的话,那么会有许多查询SORT及HASH内存不够,导至过多的磁盘排序或多回HASH连接的问题,这将严重影响系统性能。对于这个问题可以用四种方法处理。 1、增加PGA大小
ORACLE数据库的内存可以说主要由SGA+PGA两块组成。对于OLAP系统数据块缓冲命中率一般不会大于80%,即使增加BUFFER_SIZE作用也不明显,因为物量数据量明显大于内存。OLAP系统的共享池也不需要太大,虽然OLAP的一条SQL会比较复杂,但OLAP的SQL数量一般比OLTP系统少得多,并且SQL解析的时间不是性能的主要瓶颈。综上所述可以将减小的SGA大小用于PGA中
PGA的增大在OLAP系统中性能提升会比较明显一些,特别是发现磁盘排序及HASH多次读写的情况下。 2.对特殊会话采用手动PGA管理
这个方法就是将某个会话的PGA改为手动管理,再设置会话的sort_area_size和hash_area_size,然后再执行SQL,如下所示:
alter session set workarea_size_policy=MANUAL;
--50M
alter session set sort_area_size=52428800;
--200M
alter session set hash_area_size=209715200;
--执行处理
处理完后,根据需要将会话改为自动PGA管理
alter session set workarea_size_policy=AUTO;