Oracle-DB-内存结构

第二. Oracle DB 内存结构

此处输入图片的描述

一个实例有两个关联的基本内存结构:

  • 系统全局区(SGA): 称为SGA组件的共享内存结构组,这些组件包含一个Oracle DB实例的数据和控制信息。SGA由所有服务器和后台进程共享。SGA中存储的数据示例包括高速缓存的数据块和共享SQL区域。

  • 程序全局区(PGA):包含某个服务器进程或后台进程的数据及控制信息的内存区域。PGA 是Oracle DB 在服务器进程或后台进程启动时创建的非共享内存。服务器进程对
    PGA 的访问是互斥的。每个服务器进程和后台进程都具有自己的PGA。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SQL> show parameter sga;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
lock_sga boolean FALSE
pre_page_sga boolean FALSE
sga_max_size big integer 6432M
sga_target big integer 0
SQL> show parameter pga;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_target big integer 0

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) 列表和停靠计数机制。

1
2
3
4
5
6
7
8
SELECT 1 - (phy.VALUE / (cur.VALUE + con.VALUE)) "CACHE HIT RATIO"
from v$sysstat cur, v$sysstat con, v$sysstat phy
where cur.name = 'db block gets'
AND con.name = 'consistent gets'
AND phy.name = 'physical reads';
-- 运行结果
-- 0.993163842486823

2. 重做日志缓冲区

  • 它是SGA中的循环缓冲区
  • 存放有关对数据库所做更改的信息
  • 包含重做条目,这些条目包含有DML和DDL等操作进行的重做更改的相关信息

重做日志缓冲区是SGA 中的循环缓冲区,用于存放有关对数据库所做更改的信息。此信
息存储在重做条目中。重做条目包含重建(或重做)由DML、DDL 或内部操作对数据库
进行的更改所需的信息。如果需要,将使用重做条目进行数据库恢复。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#利用下列sql语句在sql语句执行前后取差值即为此session产生的redo
select name, value
from v$mystat a, v$statname b
where a.statistic# = b.statistic#
and b.name = 'redo size';
NAME VALUE
-------------------- ----------
redo size 764
SQL> insert into emp3 values(5,'n5', 55);
1 row created.
select name, value
from v$mystat a, v$statname b
where a.statistic# = b.statistic#
and b.name = 'redo size';
NAME VALUE
-------------------- ----------
redo size 764
SQL> commit;
Commit complete.
select name, value
from v$mystat a, v$statname b
where a.statistic# = b.statistic#
and b.name = 'redo size';
NAME VALUE
-------------------- ----------
redo size 1764
SQL> delete from emp3 where emp3_id = 5;
1 row deleted.
select name, value
from v$mystat a, v$statname b
where a.statistic# = b.statistic#
and b.name = 'redo size';
NAME VALUE
-------------------- ----------
redo size 1952
SQL> commit;
Commit complete.
select name, value
from v$mystat a, v$statname b
where a.statistic# = b.statistic#
and b.name = 'redo size';
NAME VALUE
-------------------- ----------
redo size 2928

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