Oracle内存结构图
![](https://i-blog.csdnimg.cn/blog_migrate/4eb3e3ab9c427dbdb958125c79e0f044.png)
概述
Oracle的每个实例都有各自的SGA,当实例启动时会自动为SGA分配内存,当实例关闭时回收内存. SGA为实例下所有进程共享,所有进程都能用共享SGA内的信息
如图一示:,
SGA由几个内存组件组成,这些内存组件是用于满足特定类别的内存分配请求的内存池. 除重做日志缓冲区(Redo Log Buffer)之外的所有SGA组件都以称为粒度的连续内存为单位分配和释放空间. 粒度大小是特定于平台的,由总SGA大小决定.
可以查询V$SGASTAT视图以获取有关SGA组件的信息.
SGA有以下组件:
Database Buffer Cache
In-Memory Area
Redo Log Buffer
Shared Pool
Large Pool
Java Pool
Fixed SGA
Optional Performance-Related SGA Subareas
Database Buffer Cache
小名"Buffer Cache",Oracle将数据从磁盘中的数据文件读取到这部分内存中.
当前或最近使用的数据块主要缓存在Buffer Cache中,所有当前实例下正在活动的连接都能够共享这部分内存下的数据
Buffer Cache的作用
Oracle使用Buffer Cache来实现以下几个目的:
- 优化物理I/O
数据库更新缓存中的数据,并在Redo Log Buffer(重做日志缓冲区)中存储有关更改的元数据. 提交之后,将数据写入联机重做日志,但不会立即将数据写入磁盘的数据文件. 而是,调用database writer(DBW)后台进程在后台执行延迟写入.
- 将频繁被访问的数据放到缓存中,将不经常被访问的数据存到磁盘
当数据库启用智能闪存缓存(Smart Flash Cache)时,存储在缓存的那部分数据可以存在闪存缓存中.闪存缓存是有一块或多块固态组成的闪存磁盘,数据库可以通过在缓存中读取数据而不是从磁盘中读