- Java Pool
Java pool用于所有指定会话的JVM中的代码和数据。根据Oracle服务器的运行模式,Java pool使用的方式不同。
Java Pool Advisor中的数据提供了用于Java的library内存,他还预测了怎样修改Java pool的大小会影响语法分析的速率。只要statistic_level设置为TYPICAL,Java PoolAdvisor默认被打开。这些数据在Advisor关闭时被重置。
- Streams Pool
在一个单实例数据库中,你可以指定从SGA中分配Strems pool的内存。可以通过STREAMS_POOL_SIZE(单位为bytes)指定streams pool的大小。如果Streams pool没有定义,定Streams第一次被使用时会自动创建一个streams pool。
如果设置了SGA_TARGET参数,Streams pool的内存从SGA的全局pool分配;如果没有设置SGA_TARGET,Streams pool的内存从buffer cache转换而来。这种转换发生在第一次使用streams。转换的数量是shared pool大小的10%。
- Other SGA Initialization Parameters
你可以用几个参数来控制SGA如何使用内存。
- Physical Memory
LOCK_SGA参数将SGA锁定到物理内存中。
- SGA Starting Address
SHARED_MEMORY_ADDRESS和HI_SHARED_MEMORY_ADDRESS参数指定数据库运行时SGA的开始地址。这两个参数很少使用。在64位的系统中,HI_SHARED_MEMORY_ADDRESS被设置为64位地址的高32位。
- Extended Buffer Cache Mechanism
在32位的平台中,USE_INDIRECT_DATA_BUFFERS参数允许使用扩展buffer cache的机制,支持的最大物理内存为4GB。在不支持这么大的内存的平台中,这个参数被忽略。
- Overview of the Programe Global Areas
Program Global Area是用来存放服务器进程的数据和控制信息的内存区域。当服务器进程启动时Oracle为它创建一个非共享的内存。这个内存被独占的访问并被代表它的Oracle代码读和写。整个PGA内存是被oracle实例中的服务器进程分配的,PGA也被实例分配。
- content of the PGA
PGA内存中的内容是不断变化的,取决于实例是否运行在共享服务器选项。但是一般来讲,PGA分为以下几类。
- Private SQL Area
私有的SQL区域包含诸如绑定信息和运行时内存结构等数据信息。每个发布SQL语句的会话都有一个SQL区。发布相同SQL语句的每个用户都有自己的是有SQL区和一个共同的共享SQL区。因此,许多个私有SQL区可以与一个相同的共享SQL区对应。
一个游标的私有SQL区被它自己分成两个区域,这两个区域的生命周期是不同的:
1.Persisten area,这个区域包含像绑定信息等内容。当游标关闭时它为空。
2.run-time area,当运行结束时它为空。
Oracle在运行请求的第一步创建runtime area。对Insert,Update,Delete语句来说,Oracle在三个语句运行后就释放runtime area。对查询来说,oracle在查询返回数据或查询删除后释放runtime区。
私有SQL area的位置取决于session连接的类型。如果session通过专有模式连接,私有PGA area就在服务器进程的PGA中。如果session以共享模式连接,那么将有部分PGA area在SGA中。
游标和SQL Areas Oracle预编译程序或者OCI程序开发者可以显示的打开游标,或者处理特定的私有SQL区,然后在运行程序的过程中把SQL区作为命名的资源使用。Oracle为一些SQL语句使用的隐式游标也使用到了shared SQL areas。
用户进程负责私有SQL区域的管理。私有SQL区域的分配和回收很大程度上取决于你使用时应用工具,尽管用户进程能够分配的私有SQL区域的个数通常被初始化参数OPEN_CURSORS所限制。这个参数的默认值是50.
私有SQL区域一直存在直到与之对应的游标关闭或者语句被释放。尽管在语句结束后释放runtime区域,但是persistent区仍然等待。所以应用开发者应该尽量关闭没有使用的游标来释放persistent区域从而减少内存使用量来供需要使用内存的应用使用。
- Session Memory
Session Memory用来存放会话的变量(登录信息)和与会话有关的其他信息的内存区域。对共享的服务来说,session memory是共享而不是私有的。
- SQL WORK Areas
对复杂的查询来说(例如,决策支持的查询),很大一部分的由密集内存分配的runtime area被用于work area来做下列事情:
1.排序操作(order by,group-by,rollup,windows function)
2.hash-jion
3.Bitmap merge
4.Bitmap create
例如,一个排序操作使用work area(有时候叫sort area)执行数据行在内存内的排序。同样的,进行hash-jion的操作者可以使用work area(也叫hash area)从它的左边的输入构建一个hash表。如果这两种操作产生的数据量比work area大,那么输入的数据会被分成很多小块。这样一些数据块被处理时余下的数据库块被放入临时的磁盘空间里稍后再做处理。尽管bitmap操作在work area很小时不会放到磁盘里,但是他们的复杂程度与他们work area的大小成反比。
Work Area的大小是可以调整的。通常来讲,越大的数据库区域会显著的提高一些大量消耗内存的操作的执行速度。从优化的角度来讲,应该有足够大的work area来容纳输入的数据和附加的内存结构分配给与它相关的SQL操作。如果没有达到要求,响应时间会增加,因为部分输入的数据会溢出到临时磁盘存储里去。在极端的情况下,如果work area的大小远小于输入数据大小,就会有很多的数据库需要放到磁盘存储。这样就会极大的增加操作的响应时间。
- PGA Memory Management for Dedicated Mode
你可以自动和全局的管理SQL work area。只需要设置参数PGA_AGGERGATE_TARGET就能设置oracle数据库整个PGA的大小。这个指定的值是Oracle实例的全局值,Oracle保证服务器进程使用PGA时不会超过这个值。
设置PGA_AGGERGATE_TARGET后,所有专有会话work area的大小是自动的,这些会话的*_AREA_SIZE参数将会被忽略。在任何时间,实例中可用于work area的PGA都自动来自于参数PGA_AGGREGATE_TARGET。这个数量需要用PGA_AGGERGATE_TARGET减去系统PGA分配给其它系统组件的的内存。PGA内存然后根据特别的内存需求将内存指定给活动的work areas。
存在一些固定的视图和列来显示PGA的数据信息。当PGA_AGGREGATE_TARGET设置了值是这些视图都可用。
- 可以通过以下视图查看work area的使用和分配信息:
V$SYSSTAT
V$SESSSTAT
V$SQL_WORKAREA
V$SQL_WORK_ACTIVE
- 通过V$PROCESS视图中的三列可以查看被oracle进程使用的PGA内存的分配和使用情况:
PGA_USED_MEM
PGA_ALLOCATION_MEM
PGA_MAX_MEM
- Dedicate and Shared Servers
内存的分配取决于系统使用的是专有模式或共享目录。下图显示了二者的区别:
Memory Area | Dedicated Server | Shared server |
Nature of session memory | Private | Shared |
Location of the persistent area | PGA | SGA |
Location of part of the runtime area for SELECT statments | PGA | PGA |
Location of the run time area for DML/DDL statments | PGA | PGA |
- SoftWare Code Areas
Software code areas 是内存中用来存放正在被执行或能被执行的区域。Oracle代码在software中的位置一般会根据用户程序的不同而不同—通常是互斥的或受保护的区域。
Software区域的大小通常是静态的,只有在软件更新或重新安装时它的大小会跟着改变。这个区域的需要的大小通常随操作系统的改变而改变。
Software area是只读的,能够以共享和非共享模式安装。当可能时,Oracle代码是共享的一些所有的Oracle用户在不进行更多内存拷贝的情况都可以访问它。这种做法会节省主内存,提高整个系统的性能。
用户程序可以共享和非共享。一些oracle工具(如Oracle Forms和SQL*PLUS)可以安装成共享,一些不可以。