例子。Run-time 区跟踪当full table scan时,到当前为止总过取回了多少行。
Oracle数据库在执行语句时,第一步就会创建run-time area。对于DML语句,run-time area当SQL语句关闭时被释放。
·persistent area(持续区)
这个区包含绑定变量的值,当一个语句执行后,SQL语句运行时提供给SQL语句的值。只有当cursor关闭时,persistent区才会关闭。
Client 进程负责管理私有SQL区。私有SQL区的分配和回收很大程度依赖应用,然而一个client进程可以分配的private SQL areas是有限的,根据初始化参数OPEN_CURSORS限制。
虽然大多数用于依赖于数据库的自动cursor处理机制,但是Oracle数据库依然提供程序接口供开发人员对cursors更多的控制。基本来说,应用程序应该在不会再次使用这个cursor后,将其关闭,用来释放持续区,将应用用户的内存需要最小化。
SQL Work Areas(SQL工作区)
工作区是PGA中分配的私有内存,服务于内存密集型操作。举个例子,排序(sort)操作会使用 sort area 用来排序一个集合的行。同样的,hash join 操作使用 hash area 会对left input的数据集创建 hash table,而bitmap merge 使用 bitmap merge area来将多个bitmap indexes中扫描的数据进行 merge。
下例显示一个employees表和departments表的join,以及它的查询计划(用来查询的执行计划)
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 |
----------------------------------------------------------------------------------
在这个例子中run-time area跟踪full table scan 扫描的进展。会话执行了一个hash join 到hash area去匹配两个表中的行。ORDER BY 排序发生在sort area。
如果被操作处理的数据总量没法全部放在work area,那么Oracle数据库会把输入的数据拆分成更小的数据片。在这种情况下,数据库会在内存中处理一部分数据片,而将剩余的写入到临时表空间用来之后处理。
当数据库使用自动PGA内存管理时,数据库会自动调整工作区的大小。你同样可以手工控制和调整work area的大小。
通常,增大工作区可以显著提高一个操作的性能,不过这样会导致更高的内存消耗。最理想的情况,work area的大小足以满足一个SQL中输入的数据以及相关的辅助内存结构。如果不能,响应时间将增加因为一部分输入的数据必须先写到磁盘。在极端情况下,如果work area对比输入的数据来说太小了,那么数据库必须对数据片段执行多次passes over,将极大的影响相应时间。
PGA Usage in Dedicated andShared Server Modes(在专用模式以及共享模式中 PGA的使用)
PGA的内存分配 依赖于数据库是使用独占还是共享连接模式,下标显示了区别
| Memory Area |
Dedicated Server |
Shared Server |
| 会话内存的性质 |
Private |
Shared |
| 持续区的位置 |
PGA |
SGA |
| Run-time区的位置 |
PGA |
PGA |
Overview of the System Global Area(SGA的概述)
SGA是一个可读写的内存区域,和Oracle后台进程一起,组成数据库实例。所有代表用户的服务进程可以从SGA中读取信息。一些进程在操作时可以对SGA进行写。
注意:服务和后台进程不能驻留在SGA中,而是存在于分别的内存空间中
每个数据库实例都有自己的SGA。Oracle数据库在实例启动时自动分配内存,是实例关闭时自动回收内存。当你通过sqlplus或Oracle Enterprise Manager启动一个实例时,SGA的大小将如下面例子这样显示出来:
SQL> STARTUP
ORACLE instance started.
Total System Global Area 368283648bytes
Fixed Size 1300440bytes
Variable Size 343935016bytes
Database Buffers 16777216bytes
Redo Buffers 6270976bytes
Database mounted.
Database opened.
如下图所示,SG包括几个内存组件,内存组件是一些为了满足不同内存分配需求的内存池
除了redo log buffer以外的其他SGA组件分配和释放都是通过一种称之为granules的单位进行的(这个单位包含一部分连续的内存)。Granule大小是根据系统平台以及总的SGA大小来决定。
你可以通过查询V$SGASTAT视图来获取SGA组件的相关信息。
你可以通过查询V$SGASTAT视图来获取SGA组件的相关信息。
最重要的SGA组件如下:
·Database Buffer Cache
·Redo Log Buffer
·Shared Pool
·Large Pool
·Java Pool
·Streams Pool
Database Buffer Cache
database buffer cache同样被称为buffercache,这块内存用来存储从数据文件中读取的数据块的拷贝。buffer是buffer管理器临时缓存当前或者最近使用的数据块的主要内存地址。所有用户并发连接到数据库instance,共享的方式访问buffer cache。
Oracle数据库使用buffer cache完成以下目标:
·优化物理I/O
数据库更新在cache中的数据块然后存储 修改动作的元数据到redolog buffer。在commit以后,数据库将redo buffer