Oracle 内存结构图

Oracle 内存结构图

System Global Aera (SGA)

SGA

V$SGASTAT 视图提供有关 SGA 更详细的内存分配信息。

V$SGA 视图给出了系统全局区(System Global Area,SGA)内存结构的摘要信息。

数据库缓存区(Database Buffer Cache)

  用于缓存当前或最近使用的从磁盘读取的数据块的拷贝,来优化数据库的 I/O 减少物理读/写。Oralce 依据 LRU 算法对该内存区域进行 block-level 的更新。数据高速缓存块又由以下几个缓存块组成:

  • 脏缓存块(Dirty buffers)
    保存被修改过并且 commit 但未写入磁盘数据的缓存块,脏缓存块最终被 DBWn 进程写入到硬盘的数据文件中永久保存。
  • 命中缓存块(Pinned buffers)
    保存最近正在被访问的缓存块,始终被保留在数据高速缓存中,不会被写入数据文件。
  • 空闲缓存块(Free buffers)
    该缓存块中没有数据,等待被写入数据。oracle 从数据文件中读取数据后,寻找空闲缓存块,以便写入其中。

日志缓冲区(Redo Log Buffer)

  日志缓冲区是一块比较小的内存区域,它是用来短期存储将写入到磁盘中的重做日志信息。日志缓冲区也是为了减少磁盘 IO,减少用户的等待时间。

共享池(Shared Pool)

  • 数据字典缓存区(Data Dictionary Cache)
    用于存放 SQL 语句相关的数据文件、表、索引、列、用户、其他的数据对象的定义和权限信息等。

  • 库缓存区(Librabry Cache)
    共享 SQL 和 PL/SQL 代码。服务器进程在执行语句时,首先会匹配库缓存,如果存在相同语句则无需编译直接使用已编译的执行计划。
    绑定变量不是在编译阶段赋值的,而是在运行阶段赋值的,因此含有绑定变量的 SQL 语句可以不用重新编译。

  • SQL 和 PL/SQL 结果缓存(Server Result Cache)
    用于存储 SQL 查询或 PL/SQL 函数的结果,以加快其将来的执行速度。

大池(Large Pool)

  大池是个可选的内存区域,可提供一个大的缓冲区供数据库的备份与恢复操作过程使用。数据库的备份恢复、执行具有大量排序操作的 SQL 语句、并行化的数据库操作时可能需要用到大池。

Java 池(Java Pool)

  JAVA 池在数据库中支持 JAVA 的运行,存放 JAVA 代码和 JAVA 语句的语法分析表。

流池(Stream Pool)

  用于缓存流进程在数据库间移动/复制数据时使用的队列消息。一般从重做日志中提取变更记录的进程和应用变更记录的进程会用到流池。

Program Global Aera (PGA)

  PGA 是指单个服务器进程或者单个后台进程所需的数据和控制信息。PGA 是在用户进程连接到数据库并创建一个会话时自动分配。该区域内保留每个与 oracle 数据库连接的用户进程所需的内存,当一个用户会话结束,PAG 就会释放。

  1. Private SQL area:包含绑定信息、运行时的内存结构。每个发出 sql 语句的会话,都有一个 private SQL area(私有 SQL 区)
    专有服务器连接私有 SQL 区在 PGA 中,共享服务器连接私有 SQL 区在 SGA 中。
  2. Session memory:为保存会话中的变量以及其他与会话相关的信息,而分配的内存区。
  • 排序区
    当用户需要对数据进行排序时,系统会将需要排序的数据保存到 PGA 中的排序区内,然后在这个排序区内对这些数据进行排序。如果发现用户的很多操作都需要用到排序,那么为用户设置比较大的排序区,可以提高用户访问数据的效率。
  • 会话区
    会话区保存了会话所具有的权限、角色、性能统计等信息,通常都是由数据库系统自我维护。
  • 堆栈区
    保存着绑定变量、会话变量、SQL 语句运行时的内存结构等重要的信息,通常都是由数据库系统自我维护
  • 游标区
    游标区是一个动态的区域,当用户执行游标语句打开游标时,系统会在 PGA 中创建游标区,当关闭游标时,这个区域就会被释放。创建与释放需要占用一定的系统资源,花费一定的时间,如果频繁的打开和关闭游标,就会降低语句的执行性能。

User Global Aera (UGA)

  为用户进程存储会话状态。UGA 可以作为 SGA 或者 PGA 的一部分,如果通过一个共享服务器连接,UGA 包含在 SAG 中;如果通过一个专有服务器连接,UGA 就包含在专有服务器的 PGA 中。

Software code areas

  Oracle 存放自身软件代码的一部分内存区,不允许其他会话访问。