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调整记录。