Oracle内存全面分析之PGA(二)

2014-11-24 18:10:36 · 作者: · 浏览: 5
控制了所有进程PGA内存的总的大小。


在专有服务模式下,推荐使用PGA_AGGREGATE_TARGET


PGA_AGGREGATE_TARGET的取值范围是10M~(4096G - 1 bytes


对于PGA_AGGREGATE_TARGET大小的设置,Oracle提供了一个以下建议方案(参见Metalink Note: 223730.1):


o 对于OLTP系统,PGA_AGGREGATE_TARGET = (物理内存大小 * 80%) * 20%


o 对于DSS系统,PGA_AGGREGATE_TARGET = (物理内存大小 * 80%) * 50%


例如,你的系统是一个OLTP系统,物理内存为8G,那么推荐PGA_AGGREGATE_TARGET设置为 (8 * 80%) * 20% = 1.28G


参数WORKAREA_SIZE_POLICY决定是否使用PGA_AGGREGATE_TARGET来管理PGA内存。它有两个值:AUTOMANUAL。默认是AUTO,即使用PGA_AGGREGATE_TARGET来管理PGA内存。


Oracle在做排序操作(ORDER BYGROUP BYROLLUP、窗口函数)时,需要从工作区中分配一定内存区域对数据记录做内存排序。在排序完成后,数据返回之前,Oracle会释放这部分内存,。SORT_AREA_SIZE指定了这部分内存的大小。设置了PGA_AGGREGATE_TARGET后,该参数无效。


除非在共享服务模式下,一般不推荐设置这个参数,而推荐使用PGA_AGGREGATE_TARGET进行PGA内存自动管理。如果需要设置此参数,可以考虑设置在1M3M


Oracle也许会为一个查询分配多个排序区。通常情况下,一条语句只有12个排序操作,但是对于复杂语句,可能存在多个排序操作,每个排序操作都有自己的排序区。因此,语句的复杂性也影响到每个进程PGA内存的大小。


这个参数与SORT_AREA_SIZE配合使用。它指定了在排序操作完成后,继续保留用户全局区(User Global Area UGA,关于UGAPGASGA关系在UGA部分介绍)内存的最大大小,以维护内存中的排序,直到所有数据行被返回后才释放(上面提到,SORT_AREA_SIZE的内存在排序完成、数据行返回之前被释放)回UGA(注意:是释放回UGA,而不会被操作系统回收)。


SORT_AREA_RETAINED_SIZE在共享服务中是从SGA中分配的(因为此时UGASGA中分配),在专有服务模式中是从PGA中分配的。而SORT_AREA_SIZE无论在那种模式下都从PGA中分配。


同样,设置了PGA_AGGREGATE_TARGET后,该参数无效。


HASH_AREA_SIZE设置了在做Hash Join时,hash内存表可占用的内存空间。同样,设置了PGA_AGGREGATE_TARGET后,该参数无效。它的默认值大小是sort_area_size1.5倍。


此外,由于Hash Join只有在优化器为CBOCost-Base Optimizer)模式下才有效,因此这个参数也只有CBO模式下才有意义。


这个参数决定是否启用Hash Join。默认为TRUE


由于Hash Join只有在优化器为CBOCost-Base Optimizer)模式下才有效,因此这个参数也只有CBO模式下才有意义。


10g中,这个参数是隐含参数。


在使用位图索引(Bitmap Index)时,oracle为索引位图段建立一张位图。在进行位图索引扫描时,需要将扫描到的位图索引排序后与位图合并(Merge),Oracle会在PGA中开辟一片区域用于排序和合并。参数BITMAP_MERGE_AREA_SIZE指定了这篇区域的大小。默认值是1M


同样,设置了PGA_AGGREGATE_TARGET后,该参数无效。


在字段的集的势(Cardinality 参照记录行数,字段的不同值的一个因子。记录数越多,不同值越少,则集的势越小)很小,并且表的数据变化不大时,可以考虑为字段建立位图索引以提高对该字段的检索效率。这个参数指定可在创建位图索引时的内存空间占用大小。它的默认大小是8M


同样,设置了PGA_AGGREGATE_TARGET后,该参数无效。


这个参数设置一个会话可以同时打开的游标数。由于每打开一个游标,都需要一部分PGA内存分配出来作为私有SQL区。因此这个参数也影响了每个进程的PGA内存的占用大小。


这是一个隐含参数。它规定了一个PGA的最大大小。可参见1.2.2


V$PGASTAT提供了PGA内存使用情况的统计信息和当自动PGA内存管理启动时的统计信息。视图里面的累加数据是自从实例启动后开始累加的。



这个视图是可以显示PGA优化建议器的估算预测结果,它显示了在各种PGA_AGGREGATE_TARGET值时,V$PGASTAT可能会显示的PGA性能统计数据。选取所用来预测的PGA_AGGREGATE_TARGET值是当前PGA_AGGREGATE_TARGET左右的的值。而估算出的统计值是根据实例启动后的负载模拟出来的。


只有当建议器打开(隐含参数_smm_advice_enabledTRUE),并且参数STATISTICS_LEVEL值不是BASIC时,视图中才会有内容。实例重启后,所有预测数据都会被重写。



这两个视图显示了系统(会话)的统计数据。他们的统计项目基本相同,但不同之处在于一个是系统级的、一个是会话级的。


通过这两个视图我们可以查出像sort这样操作对工作区的使用情况:



这个视图显示了被SQL游标使用的工作区的信息。存储在Shared Pool中的每条SQL语句都有一个或多个子游标,它们能被V$SQL显示。而V$SQL_WORKAREA显示需要被这些游标所使用的工作区信息。可以将它与V$SQL进行join查询。


通过这个视图可以解决以下一些问题:


1、 请求最多的工作区;


2、 在自动模式下,占用内存最多的工作区。


这个视图包含了系统当前分配的工作区的瞬间信息。可以通过字段WORKAREA_ADDRESS join V$SQL_WORKAREA来查询工作区信息。如果工作区溢出到磁盘,则这个视图就包含了这个工作区所溢出的临时段的信息。通过与视图V$TEMPSEG_USAGE join,可以得到更多的临时段信息。


这个视图可以解决以下问题:


1、 当前系统分配最大的工作区;


2、 超额分配内存的百分比(EXPECTED_SIZE < ACTUAL_MEM_USED),和未超额分配内存的百分比(EXPECTED_SIZE > ACTUAL_MEM_USED);


3、 哪个活动的工作区使用了超出内存管理预期的内存大小;


4、 那个活动的工作区溢出到磁盘了。


这个视图显示了所有Oracle进程的信息。其中以下几个字段则说明了进程PGA内存的使用情况。


PGA_USED_MEM:进程使用的PGA内存


PGA_ALLOCATED_MEM:分配给进程的PGA内存


PGA_MAX_MEM:进程使用的最大的PGA内存。