4.2.5 PGA

PGA(进程全局区,Program Global Area)是内存中一段特殊的区域,它包含了服务器进程的数据和控制信息,它是一段非共享的内存区域。当服务器进程启动时,数据库服务器为它分配一段PGA,这个PGA只能由当前服务器进程访问。实际上,PGA并不属于实例,而是属于服务器进程私有的。

PGA包括两个部分:私有SQL区和会话内存区。

在私有SQL区中保存了SQL语句的绑定信息和运行时内存结构。当用户执行一条SQL语句时,服务器进程即为这条语句分配一段私有SQL区。如果两个用户执行了相同的SQL语句,那么这两段私有SQL区就被映射为一个共享的SQL区。

当用户执行SQL语句时,将显式或隐式地使用游标,每个游标都有一段私有SQL区。私有SQL区由持久区和运行时区组成,其中持久区保存SQL语句的绑定信息,仅当游标关闭时它才被释放。运行时区是在服务器进程接收到SQL语句的执行请求时才产生的,在语句执行结束时被释放。

私有SQL区的位置与会话的连接方式有关。如果会话是以专用方式与数据库服务器连接的,那么它位于服务器进程的PGA中。如果会话以共享方式连接数据库服务器,那么它将位于SGA中。

会话内存区保存会话变量和其他会话信息。对于共享服务器,这部分内存区是共享的,而不是私有的,这些信息被所有的共享服务器进程所共享。

对于复杂的查询操作,私有SQL区中的运行时区大部分被用作排序、位图的创建、位图的合并等特殊操作,这部分特殊区域叫做“SQL工作区”。例如,用户执行排序操作时,要用到排序区,排序区就位于SQL工作区中。

SQL工作区的大小是可以控制的。这部分内存区域越大,数据库的性能就越高。如果这部分内存区域的大小不足以执行排序等操作,那么将使用临时表空间中的临时段。

在以前Oracle版本中,用于排序、位图索引的创建等操作的内存区域分别由初始化参数SORT_AREA_SIZE、CREATE_BITMAP_AREA_SIZE、BITMAP_MERGE_AREA_SIZE等指定。在Oracle 11g中,可以对这部分内存区域进行自动管理。首先通过设置初始化参数WORKAREA_SIZE_POLICY,将SQL工作区的管理方式设置为自动方式,然后设置初始化参数PGA_AGGREGATE_TARGET,指定SQL工作区的大小。用户在进行排序等操作时,使用的内存区域的总和不能超过SQL工作区的大小,服务器进程将根据用户操作的需求,自动分配所需的内存区域。

初始化参数WORKAREA_SIZE_POLICY的值有两个:AUTO和MANUAL。如果设置为AUTO,则SQL工作区的管理是自动进行的,这时就不需要通过SORT_AREA_SIZE等初始化参数为不同的操作分别指定内存区域了,只要通过初始化参数PGA_AGGREGATE_TARGET指定PGA的大小就可以了。如果设置为MANUAL,那么需要分别为用户的各种操作指定所需内存区域的大小。