天天看点

Oracle内存结构Oracle内存结构1.概述 2.Oracle内存

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