Oracle的内存结构包括SGA系统全局区,PGA程序全局区和软件代码区
1.SGA
所有的用户进程,服务器进程都可以共同使用SGA区,这是不同用户进程与服务器进程进行通信的中心。
SGA分为如下几个部分:
1)数据高速缓存
A)用于保存的是最近从数据文件中读取的数据块,或存储最近经常使用的数据,其中的数据可以被所有用户共享。
B)该部分的大小由初始化参数DB_CACHE_SIZE指定,一般是数据库大小的1%
C)该部分又由3个较小的缓存池组成,每一个缓存池用来存储不同访问特性的数据,以便提高效率。用户还可以
为特定的对象(如创建,更改表或索引时)使用storage子句中指定BUFFER_POOL参数来设置该对象使用
缓存池。
a)keep 保持缓存池:其中的数据(即缓存块)将长期保存,直到数据库关闭。适用于想在内存中长期保存并
频繁访问的对象,如代码表。
b)recycle回收缓存池:其中的数据一旦使用完毕就会被换出。
c)default默认缓存池:对象默认使用该缓存池。oracle使用LRU最近最少使用算法来换出。
注意:keep,和recycle的大小由初始化参数BUFFER_POOL_KEEP和BUFFER_POOL_RECYCLE来指定
参数DB_CACHE_SIZE减去这两个参数的值后余下的就是default的大小
D)数据高速缓存由许多大小相等的缓存块组成。大小与OS块相同。可分为3类
a)dirty buffers脏缓存块:当一个SQL语句对某个缓存块中的数据进行修改后,这个缓存块就被标记为脏缓存块,
该块的数据将来会被持久化到数据文件。
b)free buffers空闲缓存块:这些块中没有数据,它们在等待被写入数据。
c)pinned buffers命中缓存块:保存的是最近正在被访问的数据。这些数据将始终被保存在内存中。
E)Oracle通过如下2个列表管理上诉缓存块:
a)dirty列表:保存已经被修改但还没有被写入数据文件的脏缓存块
b)LRU列表:保存命中,空闲以及还没被移入dirty列表中的脏缓存块。LRU列表可以被看成为一个队列。
被经常访问的在队头,放在队尾的将最先被移除。
2.重做日志高速缓存
用于记录insert,update,delete语句及create,alter,drop等语句的重做记录。由参数log_buffer制定。
3.共享池
保存了最近执行的SQL语句,PL/SQL过程与包,数据字典信息,锁,以及其他控制结构信息。它是对SQL,
PL/SQL进行语法解析,编译,执行的内存区,主要由数据字典缓存区和库缓存区组成。由shared_pool_size指定。
1)数据字典缓存(dictionary cache)
A)用于存储最近经常使用的数据字典信息,如表定义,列定义,用户名,口令,权限,数据库的结构等信息。
B)Oracle运行时需访问数据字典来解析SQL,确定对象是否存在,验证权限。如果数据在缓存中不存在,
则取读取数据字典的数据文件。
C)数据字典缓存中存储的是一条一条的记录,而其他缓存区保存的是数据块
2)库缓存
用于保存最近解析过的SQL语句PL/SQL
Oralce将每条SQL分解为可共享和不可共享的部分,分别存储在共享SQL区和私有SQL区
A)共享SQL区:存储的是最近执行的SQL语句,解析后的语法树和优化后的执行计划
B)私有SQL区:存储与会话和用户相关的私有信息,如:绑定变量,环境,和会话参数。
C)PL/SQL过程和包区:存储PL/SQL解析的执行代码。PL/SQL中的SQL还是存储在共享SQL区中
D)锁与其他控制结构区:存储Oracle实例内部操作所需要的信息,如各种锁,闩,寄存器值等。后台进程需要
访问他们。
4.大池(可选)
大池用于为需要大内存的操作提供相对独立的内存空间,以便提高这些操作的性能。通过large_pool_size确定大小
需要大量内存的操作包括:
1)数据库备份和恢复,如使用RMAN在磁带设备上执行备份,转储,恢复等操作。
2)具有大量排序操作的SQL语句。
3)并行化的数据库操作。
注意:如果没有在SGA区中创建大池,上诉操作所需的内存空间将占据共享池的内存
5.Java池(可选)
在Oracle 8i之后,Oracle增加了对Java语言的支持,提供了Java池,用于存放Java代码,Java语句的语法分析表
Java语句的执行方案和进行Java程序开发。使用java_pool_size确定大小