内存是Oracle数据库信息缓存和共享区域
存储执行的程序代码、连接会话信息以及程序执行期间所需要的数据和共享信息
Oracle内存分两部分:
| SGA(系统全局区) | 实例内存结构的基本组件 |
| PGA(程序全局区) | 服务器启动分配 |
一、系统全局区(SGA)
- 生命周期:
- 分配一个SGA:启动Oracle实例
- 释放SGA占用的内存:终止Oracle实例
- 共享SGA:多个用户连接到一个同实例
- 内存结构:数据高速缓冲区、共享池、重做日志缓冲区、大型池、Java池、流池、其他结构
- 查看:show sga、select * from v$sga;
1. 数据高速缓冲区
- 存储最近从数据库中读取出来的数据块
查询时,Oracle 会先把从磁盘读取的数据放入内存供所有用户共享,以后再查询相关数据时不用再次读取磁盘。
插入和更新时,Oracle会先在该区中缓存数据,之后批量写到硬盘中。
- 组成:脏缓存块、空闲缓存块、命中缓存块
- 遵循LRU(最近最少使用):最近被访问的移到列表头部,这样最近最少被访问的最先移出列表
- 大小参数:DB_CACHE_SIZE
2. 重做日志缓冲区
生成重做记录:执行INSERT、UPDATE 、DELETE 等。于回滚事务。
重做记录:首先存入SGA的重做日志缓冲区内,当重做日志缓冲区中的重做记录达到一定数量或到达某个时间点时,再分批写入重做日志文件
重做日志缓冲区是一个循环缓冲区,在使用时从顶端向底端写入数据,然后返回到缓冲区的起始点循环写入
大小参数:LOG_BUFFER
3. 共享池
- 存放SQL语句PL/SQL代码、数据字典、资源锁和其他控制信息
- 大小参数:SHARED_ POOL_ SIZE
(1) 数据字典缓存
存储经常使用的数据字典信息,比如表的定义、用户名、口令、权限、数据库的结构等
- 保存的是一条一条的记录,其他缓存保存的是数据块信息
- 该缓存用以解释sql语句
(2) 库缓冲区
保存最近解析过的SQL语句、PL/SQL过程和包
执行一条SQL语句、一段PL/SQL过程和包之前,首先在“库缓存”中搜索,如果查到它们已经解析过了,就利用“库缓存”中解析结果和执行计划来执行
| 共享SQL区 | 私用SQL区 | |
|---|---|---|
| 存储 | 执行的SQL语句、解析后的语法树和优化后的执行计划 | 执行SQL语句时与每个会话或用户相关的私有信息,比如绑定变量、环境和会话参数 |
| 空间分配 | 执行新的SQL语句时,会为它在共享SQL区中分配空间 | |
| 遵循 | LRU算法 | 其他会话即使执行相同的SQL语句也不会使用这些信息 |
(3) 结果高速缓存
包含SQL查询结果高速缓存和PL/SQL函数结果高速缓存。
(4) 锁与其他控制结构
存储ORACLE例程内部操作所需的信息,比如各种锁
4. 大型池
可选的内存配置项
-
为Oracle多线程服务器、服务器I/O进程、数据库备份与恢复操作、执行具有大量排序操作的SQL语句、执行并行化的数据库操作等需要大量缓存的操作提供内存空间
- 没有在SGA区中创建大型池,上述操作所需要的缓存空间将在共享池或PGA中分配
大小参数:LARGE_ POOL_ SIZE
5. Java池
用于支持在数据库中运行java代码
大小参数:java_ pool size
6. 流池
可选的内存配置项
用于缓存流进程在数据库间 移动 / 复制 数据时使用的队列消息
如果没有配置流池,则是共享池中至多10%的空间
大小参数:STREAMS_ POOL_ SIZE
二、进程全局区(PGA)
- 用户进程连接数据库、创建一个会话时,由Oracle为用户分配的内存区域
- 保存当前用户私有的数据和控制信息
- 每个服务器进程只能访问自己的PGA
- 服务器进程的PGA总和即为实例的PGA的大小
| 程序全局区 |
|---|
| 排序区 |
| 会话区 |
| 堆栈区 |
| 游标区 |
三、用户全局区(UGA)
专用服务器模式下,进程和会话是一对一的关系,UGA 被包含在PGA中。
在联机服务器模式下,进程和会话是一对多的关系,所以UGA就不再属于PGA了,而在大型池( Large Pool )中分配。但如果大型池中分配失败(如大型池太小,或是根本没有设置大型池),则从共享池( Shared Pool)中分配