Oracle内存结构
1.概述
Oracle数据库:每个Oracle都由一个数据库实例和一系列物理文件组成。
即,Oracle数据库由一系列后台进程、内存及文件组成。
当启动一个数据库时,Oracle会分配一个被称为系统全局区SGA的共享内存区,同时会启动多个后台进程,他们共同构成了一个Oracle实例。
2.Oracle内存
2.1 Oracle内存作用
当用户请求数据库中的数据时,Oracle实例会先检测内存中是否存在相应的数据块(因为从内存中获取数据往往比磁盘快得多),当内存中无法找到相应数据时,才会去磁盘提取数据。Oracle内存具有以下作用:
- 缓存数据:用户请求数据库数据,首先检测内存中是否由数据,因为内存比磁盘速度快。
- 缓存共享的SQL火PL/SQL块。
- 管理重做日志。
可以看出,Oracle数据库需要大量内存来管理数据库,内存越大,则访问速度越快。
2.2 Oracle内存结构
Oracle会在内存中存储如下信息:
- 已经执行过的PL/SQL或SQL代码;
- 已经连接的会话信息,包括当前活动的及非活动的回话;
- 程序执行过程中所需要的信息,比如某个查询状态;
- 需要在Oracle进程间共享并进行通信的信息。
- 数据文件内数据的缓存,例如数据块及重做日志项。
Oracle内存部分分为两种结构:
- 系统全局区(System Global Area):这个区域的数据会被所有的服务器进程和后台进程所共享。
- 程序全局区(Program Global Area):每个服务进程和后台进程私有的内存区域,即每个进程都具有自己的PGA。
如下图:
注:依赖于服务器的连接方式不同,Oracle中用户全局区UGA,用于存储会话状态的内存。如果通过专用服务器连接到Oracle,UGA内存在PGA内存中分配;如果是共享服务器连接,UGA在SGA中进行内存分配。数据库创建时,默认使用专用服务器连接。
下面介绍系统全局区和程序全局区。
2.2.1 系统全局区
系统全局区是共享内存机构,用于提供查询性能,允许大量并发的数据库活动。当Oracle启动时,会分配制定的SGA,SGA由一组不同结构的内存组件组成,是可读写的。包含的内存数据接口如下:
- 数据库缓冲区高速缓存(保护从数据库文件中读取的数据块的副本)。
- 共享池:包含库高速缓存,存储已经执行过的SQL或PL/SQL,数据字典高速缓存。
- 重做日志缓冲区:缓存重做日志项,指定条件满足时将缓冲区的数据写入到磁盘中。
- Java池:给出实例化Java对象的对空间。
- 大池:存储大内存的配置,比如RMAN备份缓冲区。
- 流池:支持Oracle流功能。
2.2.1.1 数据库缓冲区高速缓存
数据库缓冲区高速缓存(简称库高速缓存):保存从物理数据文件中读出的数据库的副本。所有实例的用户共享该数据缓存区。其目的如下:
- 优化物理IO;
- 将频繁访问的块保持在高速缓存中。
高速缓冲区处理数据块的写入与读入,Oracle使用高效的LRU算法(最近最少使用)来管理高速缓存中的缓冲区。缓冲区一般具有以下几个独立的状态:
- 未使用的缓冲区:不包含任何有用数据的缓冲区,数据库可以使用他们保存从磁盘读出的数据。
- 脏缓冲区:包含从磁盘读取并经过修改的、但是还未写入到磁盘数据文件中的数据。
- 干净缓冲区:此缓冲区之前被使用过,现在包含某个数据块在某个时间点的读一致性版本,块包含干净的数据,不需要执行检查点操作。
2.2.1.2 共享池
共享池,包括库缓存、数据字典缓存、并行执行消息缓存区,用于系统控制的各种内存结构。
2.2.3 程序全局区PGA
程序全局区PGA:每个服务器进程独占,一般用于服务器连接配置,不能为多个进程共享
PGA内存划分:
- 私有SQL区域:用于保存SQL的绑定变量信息及运行时的内存结构,如SQL的执行工作区及客户端的游标数据。
- 运行时区域:在会话发布select、insert、delete语句时创建,执行结束后,Oracle自动释放运行时区域。
原文地址 https://blog.csdn.net/qq_36743482/article/details/81222801