Oracle的内存结构由两大部分组成:SGA(系统全局区) PGA(程序全局区)
简介:由于后面介绍中会有服务器进程和用户进程两个概念我们提前说明这两个概念便于理解
服务器进程:服务器进程如一个中介,完成用户的各种数据服务请求,再把数据库服务器返回的数据和结果发给用户端。在专有链接中,一个服务器进程对应一个用户进程,二者是一一对应的关系。当用户连接中断时,服务器程序退出、在共享连接中,一个服务器进程对应几个用户进程,此时服务器进程通过OPI(Oracle Program Interface)与数据库服务器通信
用户进程: 当用户使用数据库工具,如SQL*PLUS,与数据库服务器建立连接是,就启动了一个用户进程,即SQL*PLUS软件进程。
一、SGA包含几个重要的内存区: 数据库高速缓存 (Database buffer cache)
重做日志缓存 (Redo log buffer cache)
共享池 (Shared pool)
大池 (Large pool)
Java池 (Java pool)
内存区 | 目的 | 构成 | 构成的作用 | 区别 |
共享池 | 是共享SQL 或 PL/SQL代码 ,即把解析得到的SQL代码的结果在这里缓存,其中PL/SQL代码不仅缓存,同时共享。 | 库高速缓存 | 减少解析语句的时间 | 解析sql |
数据字典高速缓存 | 存储数据文件、表、索引、列、用户、权限信息和其他的一些数据库对象的定义 | 数据对象信息 | ||
数据库高速缓冲区 | 存储最近从数据文件读入的数据块信息或用户更改后需要回写数据库的数据信息:(注:没有提交给数据库的更改后的数据成为脏数据) | 数据信息 | ||
重做日志高速缓冲区 | 在做DML操作的时候数据会发生变化,这些变化的数据在写入数据库高速缓冲区前会先写入重做日志缓冲区,同时变化之前的数据也会放入重做日志高速缓存 | 发生变化的前后数据信息 | ||
大池 | 在共享池中分配额外的空间用于存储用户进程和服务进程之间的会话信息,在用户进程区域UGA的大部分将在大池中分配,此外,在大规模输入、输出及备份过程中作为缓存空间 | |||
Java池 | 安装和使用Java程序时必须设置Java池 |
二、PGA(进程全局区):是服务器进程专用的一块内存,它是操作系统进程专用的内存,系统中的其他进程是无法访问这块内存的。它独立与SGA,不会在SGA中出现,它是由操作系统在本地分配的。
PGA中存储了服务器进程或单独的后台进程的数据信息和控制信息。
PGA分配是随着服务器进程的创建而被分配内存的,进程终止而释放内存。
(注:它不是一个共享区域,而是服务器进程专有区域)
PGA在专有服务器配置中有如下组件: 排序区(对某些的SQL语句执行结果进行排序)
会话信息(包含本次会话的用户权限和性能统计信息)
游标状态(标明当前会话执行的SQL语句的处理阶段)
堆栈区 (包含其他的会话变量)
(注:在共享服务器配置中,多个用户进程共享一个服务器进程,上述的一些内存区可能在SGA中分配。如果创建了大池,这些内存结构就存储在大池中,否则它们在共享池中。)
PGA内存管理: 手动PGA管理 和 自动PGA管理
PGA内存管理 | 注意事项 |
手动 | 必须告诉Oracle 一个特定的进程需要的排序区,允许使用多少内存 |
自动 | 要求高速Oracle在系统范围内可以为PGA中的特定功能,如排序区分配多少内存 |
三、UGA(用户全局区)它表示用户的会话状态,这部分内存会话总可以访问,UGA存储在每个共享服务器都可以访问SGA中,这样任何服务器都可以使用用户会话的数据和其他信息。而在专有服务器模式下,用户会话状态不需要共享,用户进程与服务器进程是一一对应的关系,所以UGA总是在SGA中分配。
四、获取内存缓冲区的信息
查看SGA中内存的分配情况(在sqlplus中执行)
SQL>show sga;
Total System Global Area 5380220536 bytes
Fixed Size 738936 bytes
Variable Size 4294967296 bytes
Database Buffers 1073741824 bytes
Redo Buffers 10772480 bytes
上述输出可以看到,SGA、Database Buffers 和 Redo Buffers的尺寸,至于Fxied Size 和 Variable Size我们也来说明下
Fixed Size 相关的内存区:在固定SGA中,存储一组指向SGA中其他组件的变量。它的大小因平台不同而有差异,用户无法控制,但通常固定SGA区很小。Oracle 使用这个内存区来寻找其他SGA区,可以理解为数据库的自举区。
Variable Size相关的内存区:该内存区包括共享池、Java池和大池,其中Variable Size的尺寸要高于三个之和,因为Total SGA中除去的db_cache_size部分也包括在Variable Size中