第二. Oracle DB 内存结构
一个实例有两个关联的基本内存结构:
系统全局区(SGA): 称为SGA组件的共享内存结构组,这些组件包含一个Oracle DB实例的数据和控制信息。SGA由所有服务器和后台进程共享。SGA中存储的数据示例包括高速缓存的数据块和共享SQL区域。
程序全局区(PGA):包含某个服务器进程或后台进程的数据及控制信息的内存区域。PGA 是Oracle DB 在服务器进程或后台进程启动时创建的非共享内存。服务器进程对
PGA 的访问是互斥的。每个服务器进程和后台进程都具有自己的PGA。
|
|
SGA包含的数据结构:
- 数据库缓冲区高速缓存:用于缓存从数据库中检索到的数据块
- 重做日志缓冲区:用来缓存用于实例恢复的重做信息,直到可以将其写入磁盘中存储的物理重做日志文件
- 共享池:用于缓存可在用户间共享的各种结构
- 大型池:为某些大型进程(例如Oracle 备份和恢复操作)和I/O 服务器进程提供大型内存分配的可选区域。
- Java 池:用于Java 虚拟机(JVM) 中特定于会话的所有Java 代码和数据
- 流池: Oracle Streams 使用它来存储捕获和应用操作所需的信息
程序全局区(PGA)是一个内存区,其中包含每个服务器进程的数据及控制信息。Oracle 服务器进程为客户机请求提供服务。每个服务器进程都有自己专用的PGA,其PGA 在服务器进程启动时创建,对PGA的访问权限仅限于该服务器进程,并且只能由代表该服务器进程的Oracle 代码对PGA 进行读写。
Oracle DB 使用初始化参数来创建和管理内存结构。管理内存的最简单的方法是允许数据库自动管理和优化内存。要做到这一点(以下操作适用于大多数平台),您只需设置目标内存大小初始化参数(MEMORY_TARGET)和最大内存大小初始化参数 (MEMORY_MAX_TARGET)。
1. 数据库缓冲区高速缓存
- 属于SGA
- 存放从数据文件读取的数据块的副本
- 由所有并行用户共享
Oracle DB 用户进程第一次需要特定数据片段时,将在数据库缓冲区高速缓存中搜索数据。如果该进程在高速缓存中找到数据(称为高速缓存命中),则直接从内存中读取数据。如果进程在高速缓存中找不到数据(称为高速缓存未命中),则在访问数据之前,必须将磁盘上的数据文件中的数据块复制到高速缓存中的缓冲区中。高速缓存命中时访问数据要比高速缓存未命中时访问数据快。
高速缓存中的缓冲区由一个复杂算法管理,该算法组合使用最近最少使用(LRU) 列表和停靠计数机制。
|
|
2. 重做日志缓冲区
- 它是SGA中的循环缓冲区
- 存放有关对数据库所做更改的信息
- 包含重做条目,这些条目包含有DML和DDL等操作进行的重做更改的相关信息
重做日志缓冲区是SGA 中的循环缓冲区,用于存放有关对数据库所做更改的信息。此信
息存储在重做条目中。重做条目包含重建(或重做)由DML、DDL 或内部操作对数据库
进行的更改所需的信息。如果需要,将使用重做条目进行数据库恢复。
|
|
3. 共享池
- 属于SGA
- 包含:
–库高速缓存
—-共享SQL 区域
–数据字典高速缓存
–控制结构
SGA 的共享池部分包含库高速缓存、数据字典高速缓存、SQL查询结果高速缓存、PL/SQL 函数结果高速缓存、并行执行消息的缓冲区以及控制结构。
“数据字典”是数据库表和视图(它们包含有关数据库、数据库结构及其用户的参考信息)的集合。在SQL 语句语法分析期间,Oracle DB会频繁访问数据字典。该访问操作对于Oracle DB 的持续操作来说至关重要。
分配和重用共享池中的内存
- 服务器进程检查共享池以查看相同语句是否已存在共享SQL 区域。
- 服务器进程分配一个代表会话的专用SQL 区域。
将SQL 语句提交到Oracle DB以便执行时,将自动执行下列内存分配步骤:
Oracle DB 检查共享池以查看相同语句是否已存在共享SQL 区域。如果存在,则在执行该语句的后续新实例时使用此共享SQL 区域。如果某条语句没有共享SQL 区域,则Oracle DB 会在共享池中分配一个新的共享SQL 区域。在以上任一情况下,用户的专用SQL 区域都与包含该语句的共享SQL 区域关联。
Oracle DB 分配一个代表会话的专用SQL 区域。该专用SQL 区域的位置取决于为会话建立的连接的类型。
在以下情况下,Oracle DB 也会从共享池中刷新共享SQL 区域:
V\$SQL、V\$SQLTEXT、V\$SQLAREA与V\$SQL_PLAN
- V$SQL是共享池中已经分析过的SQL,其中列出了所有SQL的相关信息,但不包含GROUP BY语句,每一个SQL语句都是一笔数据,但此记录只保留SQL语句的前1000个字符。
V\$SQLAREA 中记录了在共享池中分析过的每个SQL语句和准备运行的SQL语句的统计数据,和V$SQL一样只保留SQL的前1000个字符。
V\$SQLTEXT 视图会记录完整的SQL,但会将SQL分成不同笔的数据来存储。
V\$SQL_PLAN视图包含了库缓存中所有游标所产生的执行计划,可结合V$SQLAREA获得库缓存中所有语句的查询计划。
4. 大型池
- 共享服务器的会话内存和Oracle XA接口
- I/O服务器进程
- Oracle DB 备份和还原操作
5. Java池和流池
- 存储JVM 中所有特定于会话的Java 代码和数据的服务
器内存使用Java 池内存。- Oracle Streams 以独占方式使用流池内存来执行以下
操作:
存储缓冲的队列消息
为Oracle Streams 进程提供内存Java