program global area

PGA是包含某服务器进程的数据集控制信息的内存区。这是Oracle 服务器

在服务器进程启动时创建的非共享内存,只有该服务器进程才能访问。由关联到某个Oracle 实例的所有服务器进程分配的PGA 总内存,也称为该实例分配的聚集PGA 内存。使用共享服务器时,部分PGA 可位于SGA 中。PGA通常包含以下部分:

PrivateSQL Area

专用SQL 区包含绑定信息和运行时内存结构等数据。这些信息是每个会话的SQL 语句调用所特有的;在其它方面,绑定变量有不同的值,游标的状态也不同。发出SQL 语句的每个会话都有一个专用SQL 区。提交同一SQL 语句的每个用户也都有其自己的专用SQL区,该专用SQL 区使用一个共享SQL 区。这样,许多专用SQL 区可与同一个共享SQL区关联。专用SQL 区的位置取决于为会话建立的连接类型。如果会话是通过专用服务器连接的,则专用SQL 区位于该服务器进程的PGA 中。不过,如果会话是通过共享服务器连接的,则部分专用SQL 区将保留在SGA 中。

Cursorsand SQL Areas

Oracle 预编译器程序或OCI 程序的应用程序开发人员可以显式打开特定专用SQL 区的游标或句柄,并在该程序的整个执行过程中将它们用作命名资源。数据库为某些SQL 语句

隐式发出的递归游标也使用共享SQL 区。

SQL Work Areas

对于复杂查询(例如,决策支持查询),会将大部分PGA 供内存密集型运算符分配的

工作区专用,例如:

Sort-based operators (order by,group-by, rollup, window function)

Hash-join

Bitmap merge

Bitmap create

排序运算符使用工作区(排序区),对一组行执行内存中排序。与此类似,散列联接运算符使用工作区(散列区),根据其左侧输入内容生成散列表。

工作区的大小是可以控制和优化的。通常,较大的工作区可以显著改进特定运算符的性能,

不过代价是消耗较多的内存。

Session Memory

会话内存是用于存放会话的变量(登录信息)以及与会话相关的其它信息的内存。对于共享服务器,会话内存是共享的,而不是专用的。

自动PGA管理

       理想情况下,工作区的大小只要能容纳其相关SQL 运算符分配的输入数据和辅助内存结构就已足够。这一大小称为工作区的最佳大小。工作区大小小于最佳大小时,响应时间就会增加,因为要对部分输入数据执行额外的传输操作。

自动PGA 内存管理功能简化并改进了PGA 内存的分配方式。默认情况下,PGA 内存管理功能是启用的。在此模式下,Oracle 数据库以SGA 内存大小的20% 为基准,动态调整专用于工作区的那部分PGA 内存的大小。最小值为10 MB

在自动PGA 内存管理模式下运行时,所有会话的工作区大小的调整都是自动的,在该模式下运行的所有会话都会忽略*_AREA_SIZE 参数(SORT_AREA_SIZE)。在任何给定时间,可用于实例中各活动工作区的PGA 内存总量自动从PGA_AGGREGATE_TARGET 初始化参数派生。此内存量设置为

PGA_AGGREGATE_TARGET 值减去系统其它组件分配的PGA 内存量(例如,会话分配的PGA 内存)。由此得到的PGA 内存随后按照各活动工作区的特定内存需求分配给相应的工作区。

      用于监视PGA 工作区的视图包括:

v$sql_workarea_histogram

v$pgastat

v$sql_workarea_active

v$sql_workarea

v$tempseg_usage

 用于调整PGA 工作区大小的视图有:

v$pga_target_advice

v$pga_target_advice_histogram