oracle的内存分为两个部分。一个是SGA(system global area),一个是PGA(program global area)。所谓的内存管理,就是对这两部分区域进行管理。oracle的内存管理经理了如下发展:

oracle 9i   PGA自动管理,SGA手动管理

oracle10g PGA自动管理,SGA自动管理

oracle11g PGA,SGA统一自动管理


先看9i时期的PGA自动管理,SGA手动管理

这时期PGA管理有两个选择,手动和自动。

手动时,设置WORKAREA_SIZE_POLICY为MANUAL, 设置各种*_AREA_SIZE的值比如SORT_AREA_SIZE_HASH_AREA_SIZE就可以实现手动PGA管理。

自动时,设置WORKAREA_SIZE_POLICY为AUTO,设置PGA_AGGREAGATE_TARGET的值,则为自动PGA管理。


这时期SGA的管理只可以手动管理,但是相比之前有了进步,可以动态的管理。


再看10g时期的PGA自动管理,SGA自动管理

这时期PGA和9i一样,都可以手动和自动。

这时期的SGA则有了进步,可以手动管理,也增加了自动管理的选择。

设置SGA_TARGET,就可以实现自动SGA管理。


现在看11g时期的PGA,SGA统一自动管理

这时期的内存管理向前兼容。

PGA可以手动,自动管理

SGAK也可以手动,自动管理

但是有了一个更方便的特性,就是把PGA,SGA的自动整合到一起,通过MEMORY_TARGET来管理。这时有了两个参数MEMORY_TARGET,MEMORY_MAX_TARGET.有了这两个参数,就可以把PGA,SGA作为一个整体管理。




有一些要注意的地方是

1.如果设置了MEMORY_TARGET的同时还设置了SGA_TARGET,PGA_TARGET 怎么办呢?这时候,SGA_TARGET和PGA_TARGET的值如果小于MEMORY_TARGET,那么oracle就会把他们作为SGA,和PGA的最小值,如果他们比MEMORY_TARGET还大,那么oracle就会报错。

2.PGA是跟每一个oracle server 进程相关的,所以WORKAREA_SIZE_POLICY应该是可以设置在session级别,也可以设置在system级别。

3. 几个视图比较有用,V$MEMORY_DYNAMIC_COMPONENTS会展示动态调整的内存组件大小。 V$MEMORY_RESIZE_OPS展示了最近的800条SGA调整记录。