结构概述

Oracle 数据库实例由一系列内存结构和后台进程组成。用户操作数据库的过程实质上是与数据库实例建立连接,然后通过实例来操作数据库的过程。用户的所有操作都在内存中进行,最后由数据库后台进程将操作结果写入各种物理文件中永久性保存。

内存结构是 Oracle 数据库体系结构的重要组成部分,是 Oracle 数据库重要的信息缓存和共享区域。根据内存区域信息使用范围的不同,分为系统全局区(System Global Area,SGA)和程序全局区(Program Global Area,PGA)。

1. SGA

SGA 是由 Oracle 分配的共享内存结构,包含一个数据库实例的数据和控制信息。SGA 数据供所有的服务器进程和后台进程共享,所以 SGA 又称为共享全局区(Shared Global Area)。用户对数据库的各种操作主要在 SGA 中进行。该内存区随数据库实例的创建而分配,随实例的终止而释放。

SGA 主要由数据高速缓冲区(Database Buffer Cache)、共享池(Shared Pool)、重做日志缓冲区(Redo Log Cache)、大型池(Large Pool)、Java 池(Java Pool)、流池(Streams Pool)和其他结构(如固定 SGA、锁管理等)组成。

  1. 数据高速缓冲区

    数据高速缓冲区存储的是最近从数据文件中检索出来的数据,供所有用户共享。当用户要操作数据库中的数据时,先由服务器进程将数据从磁盘的数据文件中读取到数据高速缓冲区中,然后在缓冲区中进行处理。用户处理后的结果被存储在数据高速缓冲区中,最后由数据库写入进程 DBWR 写到硬盘的数据文件中永久保存,如图所示。

    数据高速缓冲区的工作过程

    根据数据缓冲区中存放的信息的不同,数据高速缓冲区分为下列 4 种类型。

    • 脏缓存块(Dirty Buffers):脏缓存块中保存的是已经被修改过的数据。
    • 空闲缓存块(Free Buffers):空闲缓存块中不包含任何数据,它们等待后台进程或服务器进程向其中写入数据。
    • 命中缓存块(Pinned Buffers):命中缓存块是那些正被使用的数据块,同时还有很多会话等待修改或访问的数据块。
    • 干净缓存块(Clean Buffers):干净缓存块是指那些当前没有被使用,即将被换出内存的缓存块,这些块中的数据要么没有被修改,要么在内存中有该数据块的快照。

    在 Oracle 11g 中,数据高速缓冲区由标准缓冲区和非标准缓冲区构成,两者的和决定了数据高速缓冲区大小。标准缓冲区大小由参数 DB_CACHE_SIZE 设定,非标准缓冲区由参数 DB_nK_CACHE_SIZE 设定。

  2. 重做日志缓冲区

    重做日志缓冲区用于缓存用户对数据库进行修改操作时生成的重做记录。为了提高工作效率,重做记录并不是直接写入到重做日志文件中,而是首先被服务器进程写入重做日志缓冲区中,在一定条件下,再由日志写入进程 LGWR 把重做日志缓冲区的内容写入到重做日志文件中做永久性保存。在归档模式下,当重做日志切换时,由归档进程 ARCH 将重做日志文件的内容写入到归档文件中,如图所示。

    重做日志缓冲区的工作过程

    重做日志缓存区大小由初始化参数 LOG_BUFFER 设定。

  3. 共享池

    共享池用于缓存最近执行过的 SQL 语句、PL/SQL 程序和数据字典信息,是对 SQL 语句、PL/SQL 程序进行语法分析、编译、执行的区域。

    共享池由库缓存(Library Cache)和数据字典缓存(Dictionary Cache)组成。

    • 库缓存

      Oracle 执行用户提交 SQL 语句或 PL/SQL 程序之前,先要对其进行语法分析、对象确认、权限检查、执行优化等一系列操作,并生成执行计划。这一系列操作会占用一定的系统资源,如果多次执行相同的 SQL 语句、PL/SQL 程序,都要进行如此操作的话,将浪费很多系统资源。库缓存的作用就是缓存最近被解释并执行过的 SQL 语句、PL/SQL 程序代码正文、编译后代码以及执行计划,以提高 SQL、PL/SQL 程序的执行效率。当执行 SQL 语句或 PL/SQL 程序时,Oracle 首先在共享池的库缓存中搜索,查看正文完全相同的 SQL 语句或 PL/SQL 程序是否已经被分析、解析、执行并缓存过。如果有,Oracle 将利用缓存中的分析结果和执行计划来执行该语句,而不必重新对它进行解析,从而大大提高了系统的执行速度。

    • 数据字典缓存区

      数据字典缓存区中保存最常使用的数据字典信息,如数据库对象信息、账户信息、数据库结构信息等。当用户访问数据库时,可以从数据字典缓存中获得对象是否存在、用户是否有操作权限等信息,大大提高了执行效率。

      共享池的大小由初始化参数 SHARED_POOL_SIZE 设定。

  4. 大型池

    大型池是一个可选的内存配置项,主要为 Oracle 共享服务器、服务器 I/O 进程、数据库备份与恢复操作、执行具有大量排序操作的 SQL 语句、执行并行化的数据库操作等需要大量缓存的操作提供内存空间。如果没有在 SGA 中创建大型池,上述操作所需要的缓存空间将在共享池或 PGA 中分配,因而会影响共享池或 PGA 的使用效率。

    大型池的大小由初始化参数 LARGE_POOL_SIZE 设定。

  5. Java 池

    Java 池是一个可选的内存配置项,提供对 Java 程序设计的支持,用于存储 Java 代码、Java 语句的语法分析表、Java 语句的执行方案和进行 Java 程序开发等。

    Java 池大小由初始化参数 JAVA_POOL_SIZE 设定。

  6. 流池

    流池是一个可选的内存配置项,用于对流的支持。

    流池大小由初始化参数 STREAMS_POOL_SIZE 设定。

2. PGA

Oracle 创建一个服务器进程的同时要为该服务器进程分配一个内存区,该内存区称为程序全局区(Program Global Area,PGA)。PGA 是一个私有的内存区,不能共享,每个服务器进程只能访问自己的 PGA,因此 PGA 又称为私有全局区(Private Global Area)。系统同时为每个后台进程分配私有的 PGA 区。所有服务器进程 PGA 与所有后台进程 PGA 大小的和,即为实例的 PGA 的大小。PGA 随着服务器进程与后台进程的启动而分配,随着服务器进程和后台进程终止而被释放。

PGA 由下列 4 部分组成。

  1. 排序区(SORT Area):存放排序操作所产生的临时数据。
  2. 游标信息区(Cursor Information):存放执行游标操作时所产生的数据。
  3. 会话信息区(Session Information):保存用户会话所具有的权限、角色、性能统计信息。
  4. 堆栈区(Stack Space):用于保存会话过程中的绑定变量、会话变量等信息。
© 2020 刘士. All rights reserved.

结果匹配 ""

    没有匹配的结果 ""