Oracle PGA 总结

Oracle 内存结构

 

 

PGA(Program Global Area):进程全局区

是包含一个服务器进程的数据和控制信息的私有的内存区域。

 

UGA(User Global Area):

用户全局区,就是你的会话信息。

采用专用服务器模式时,UGA会在PGA中分配。若采用共享服务器连接时,UGA会在SGA中分配。

 

手动分配PGA内存管理:

 

 

PGA受数据库初始化参数WORKAREA_SIZE_POLICY的影响,而且可以在会话级别修改。AUTO表示自动内存管理,Manual表示手动管理。

 

PGA中除了会话中PL/SQL表和其他变量分配的内存外,有些参数对PGA大小影响最大:

SORT_AREA_SIZE:用于对信息排序的RAM总量,若分配的大小不足以在内存中排序,则会用到临时表空间进行排序。

SORT_AREA_RETAINED_SIZE:排序完成后用于保存已排序的内存总量。比如SORT_AREA_SIZE512KSORT_AREA_RETAINED_SIZE256K,那么服务器进程最初查询数据会用512K的内存区排序数据,但排序完成后,排序去会收缩为256K,剩下的数据会被写到临时表空间中。

HASH_AREA_SIZE:服务器进程在内存中存储散列表所用的内存量。

 

SORT_AREA_SIZE- SORT_AREA_RETAINED_SIZE这部分内存一般从PGA中分配。

SORT_AREA_RETAINED_SIZE会在UGA中分配。

在使用 *_area_size 参数时,需要记住以下重要的几点:

1.这些参数控制着SORTHASHBITMAP MERGE操作所用的最大内存量。

2.这些设置并非对会话的限制,它们只是对一个操作的限制,一个查询中可以有多个排序操作。

3.这些内存区都是根据需要来分配的,比如把排序区设置为1GB,并不是你要分配1GBRAM,而是说Oracle进程为一个排序/散列操作最多分配1GB的内存。

 

自动PGA内存管理

 

 

9i开始,又引进了一种新的方法来管理PGA内存,即自动PGA内存管理。

当自动PGA内存管理时,PGA_AGGREGATE_TARGET会控制实例为完成数据排序和散列的所有工作区共分配多少内存。

警告:

9i版本中,若使用共享服务器模式,则无法使用自动PGA内存管理,而是使用SORT_AREA_SIZEHASH_AREA_SIZE参数来确定为各个操作分配多少RAM

 

1.PGA是一个上限目标,而不是启动数据库时预分配的内存大小。

2.串行会话会使用PAG_AGGREGATE_TARGET的很少一部分,一个排序/散列操作只会用到%5左右,但经过实际测试,Oracle为了防止磁盘的排序,排序/散列操作往往会超出%5的比例,而操作完成后,分配给当前的进程PGA内存会下降到%5

3.随着服务器上负载量的增加,分配给各个工作区的PGA内存量会减少。

4.一个并行查询最多可以使用PAG_AGGREGATE_TARGET%30,也就是说每个平行进程能使用的内存量是0.3*PGA_AGGREGATE_TARGET的量。

 

手动和自动内存管理的选择

 

默认情况下,我倾向于自动PGA内存管理。

这样,Oracle会自动根据工作负载来调整每个会话的PGA大小,用户越多,每个用户使用的RAM就越少,用户越少,每个用户能使用的RAM就越多。这就像有一位DBA整天坐在控制台前,不断根据数据库中的完成工作量来设置SORT_AREA_SZIE,HASH_AREA_SIZE参数。

 

手动内存管理适用于大型批处理作业,它们在特殊的时刻运行,例如凌晨2点要做一个大型的批处理,要完成大型的散列连接,建立索引等工作,对于这样一个作业,它应该使用机器上所有的资源,尚若如此,就应该使用alter session在你的会话中禁用自动内存管理(而不影响其他会话),并根据需要设置SORT_AREA_SZIE,HASH_AREA_SIZE参数。 

猜你喜欢

转载自yangeoo.iteye.com/blog/1826877