目录
PGA非共享的内存空间,当服务进程或者后台进程建立时,将自动分配进程的专属PGA;当进程终止时,PGA将自动释放.
instance PGA的示例图:

PGA示例图

private SQL Area
私有sql区(private sql area)保存SQL语句的解析信息与其他一些特定的信息
当服务器进程执行SQL代码时,该进程使用私有SQL区域来存储绑定变量值,查询执行状态信息和查询执行工作区.
私有sql区域共享sql区不一样,后者在SGA中存储执行计划,相同或不同会话中的多个私有SQL区域可以指向SGA中的单个执行计划. 例如,在一个会话中执行SELECT *的20次,在另一个会话中执行相同查询的10次,可以共享相同的计划. 每次执行的私有SQL区域不共享,可能包含不同的值和数据.
游标是一个存储select结果集的内存区域,可以将游标视为客户端上的指针和服务器端的状态. 由于游标与私有SQL区域密切相关,因此这些术语有时可互换使用.

private有以下区域:
Runtime Area
该区域包含查询执行状态信息. 例如,运行时区域跟踪到目前为止在全表扫描中检索到的行数.
Oracle数据库创建运行时区域作为执行请求的第一步. 对于DML语句,SQL语句关闭时将释放运行时区域.
Persistent Area
该区域包含绑定变量值. 在执行语句时,绑定变量值在运行时提供给SQL语句. 仅在光标关闭时才释放持久区域.
客户端进程负责管理私有SQL区域. 私有SQL区域的分配和释放在很大程度上取决于应用程序,尽管客户端进程可以分配的私有SQL区域的数量受初始化参数的限制OPEN_CURSORS.
虽然大多数用户依赖于数据库实用程序的自动游标处理,但Oracle数据库编程接口为开发人员提供了对游标的更多控制. 通常,应用程序应该关闭所有不会再次使用的打开游标来释放持久区域并最小化应用程序用户所需的内存.
SQL Work Areas
SQL Work Areas是PGA中分配的,用于一些基于内存的操作.
在上面图二中,可以看出SQL Work Areas分为Sort Areas,Hash Areas,BitMap Merge Areas三个区域,分别对应排序,哈希,位图合并操作.
下边的例子是对employees表的查询以及执行计划
SQL> SELECT *
2 FROM employees e JOIN departments d
3 ON e.department_id=d.department_id
4 ORDER BY last_name;
.
.
.
--------------------------------------------------------------------------------
| Id| Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 106 | 9328 | 7 (29)| 00:00:01 |
| 1 | SORT ORDER BY | | 106 | 9328 | 7 (29)| 00:00:01 |
|*2 | HASH JOIN | | 106 | 9328 | 6 (17)| 00:00:01 |
| 3 | TABLE ACCESS FULL| DEPARTMENTS | 27 | 540 | 2 (0)| 00:00:01 |
| 4 | TABLE ACCESS FULL| EMPLOYEES | 107 | 7276 | 3 (0)| 00:00:01 |
--------------------------------------------------------------------------------
在前面的例子中,Runtime Area跟踪全表扫描进度,两张表在hash Area中进行hash连接,orader by操作发生在Sort Area.
当驱动表数据太大超过PGA容量时,数据库会将数据分割,然后将其中一部分读入PGA,其余数据暂时存入磁盘.
一般而言,work area越大,可以通过增大内存消耗显著提升性能,如果使用了PGA的自动管理,则oracle会根据要处理的数据量来动态的调整work area的大小,来尽量满足数据所需的内存,尽可能地保证所有的操作在内存中完成. 相反如果没有使用PGA自动管理,work area的相关参数的大小相对于输入的数据来说比较小的话,oracle不得不把一些数据缓存在磁盘上,这可能极大地增大了响应时间.
专属服务器与共享服务器内存对比
Memory Area | Dedicated Server | Shared Server |
---|---|---|
Nature of session memory | Private | Shared |
Location of the persistent area | PGA | SGA |
Location of the run-time area for DML and DDL statements | PGA | PGA |
Session Memory
会话区保存用户访问服务器进程的会话信息和与会话有关的信息. 在专有服务器模式下,会话区在PGA中,在共享服务器模式下,会话区放在SGA内,在Large Pool内分配一个UGA.共享服务器有很多使用限制,比如批量插入、重建表和索引等都无法执行.
虽然绝大部分情况下,管理员不要维护这个会话区,可以让数据库系统进行维护,但是还是需要了解一下这个会话区的作用. 数据库系统不仅是存放数据的一个很好的载体,而且在还提供了一个统一管理数据的平台,可以根据实际需要,为不同的用户设置不同的访问权限. 简单的说,在数据库中可以控制用户可以访问哪些数据. 从而提高数据的安全性.
当用户进程与数据库建立会话时,系统会将这个用户的相关权限查询出来,然后保存在这个会话区内. 如此的话,用户进程在访问数据时,系统就会核对会话区内的用户权限信息,看看其是否具有相关的访问权限. 由于系统将这个用户的权限信息存放在内存上,所以其核对用户权限的速度非常的快. 因为系统不用再去硬盘中读取数据,直接从内存中读取. 而从内存读取数据的效率要比硬盘上快几千倍.
通常情况下,这个会话区内保存了会话所具有的权限、角色、性能统计等信息. 这个会话区一般都是由数据库进行自我维护的,系统管理员不用干预.
(Session memory is the memory allocated to hold a session's variables (logon information) and other information related to the session. For a shared server, the session memory is shared and not private.)