oracle内存结构
启动实例时,Oracle 数据库会分配一个内存区域并启动后台进程。
系统全局区域 (SGA)
SGA 是一组共享内存结构(称为 SGA 组件),其中包含一个 Oracle 数据库实例的数据和控制信息。所有服务器和后台进程共享 SGA。存储在 SGA 中的数据示例包括缓存的数据块和共享的 SQL 区域。类似于jvm的堆
程序全局区 (PGA)
PGA 是一个非共享内存区域,其中包含专门供 Oracle 进程使用的数据和控制信息。Oracle 数据库在 Oracle 进程启动时创建 PGA。
每个服务器进程和后台进程都有一个 PGA(每个客户端连进来都会有一个PGA吗?)。单个 PGA 的集合是总实例 PGA 或实例 PGA。数据库初始化参数设置实例 PGA 的大小,而不是单个 PGA 的大小。类似于jvm的栈
用户全局区 (UGA)
UGA 是与用户会话关联的内存。
软件代码区域
软件代码区是内存的一部分,用于存储正在运行或可以运行的代码。Oracle 数据库代码存储在一个软件区域中,该软件区域通常位于与用户程序不同的位置,即一个更具独占性或受保护性的位置
一.用户全局区
UGA 是会话内存,它是为会话变量(如登录信息)和数据库会话所需的其他信息分配的内存。实质上,UGA 存储会话状态(如plsql客户端连接服务器的会话)。
UGA 必须在数据库会话的生存期内对数据库会话可用。因此,
使用共享服务器连接时,UGA 不能存储在 PGA 中,因为 PGA 特定于单个进程。因此,当使用共享服务器连接时,UGA 存储在 SGA 中,从而允许任何共享服务器进程访问它。
使用专用服务器连接时,UGA 存储在 PGA 中
二.程序全局区
1.私有 SQL 区域(private sql area)
保存有关已分析的 SQL 语句的信息以及其他特定于会话的信息以进行处理,
他与SGA中的共享sql区的区别:这个是私有的,但是它可以指向共享sql区的单个执行计划,例如,A会话执行了20次C查询,B会话执行了10次C查询,他们都指向共享sql区的同一执行计划
包含运行时区域和持久性区域,运行时区域跟踪到目前为止在完整表扫描中检索到的行数,客户端请求来时,会先创建运行时区域,对于 DML 语句,当 SQL 语句关闭时,将释放运行时区域。
2.sql工作区(sql work area)
三.系统全局区
SGA 是一个读/写内存区域,它与 Oracle 后台进程一起形成一个数据库实例。服务器和后台进程不驻留在 SGA 中,而是存在于单独的内存空间中
每个数据库实例都有自己的 SGA,实例启动时自动为 SGA 分配内存,所以在startup后界面会显示一排的大小参数
1.数据库缓冲区缓存(Database Buffer Cache)
存储从数据文件读取的数据块副本的内存区域。临时缓存当前或最近使用的、经常访问的数据块。并发连接到数据库实例的所有用户共享对缓冲区缓存的访问权限
之前说的脏数据,就是在这里,至已提交更改,但未写入数据文件的数据,数据库写入器 (DBW) 进程定期将脏缓冲区写入磁盘。
2.重做日志缓冲区(rodo log buffer)
重做日志缓冲区是 SGA 中的一个循环缓冲区,用于存储描述对数据库所做的更改(DML 或 DDL操作)的重做条目。
日志编写器进程 (LGWR) 将重做日志缓冲区写入磁盘上的活动联机重做日志组
3.共享池
共享池存储解析的 SQL、PL/SQL 代码、系统参数和数据字典信息
1>共享SQL区域(库缓存下)
储存sql语句解析树和执行计划,如果sql一样的话(缓存中key时sql语句的ascill码,所以select变成SELECT也是要重新编译的),单独 PGA 中的许多私有 SQL 区域可以与同一共享 SQL 区域相关联。方便重用,提高性能
2>数据字典缓存
储存数据库表和视图的集合,其中包含有关数据库、其结构及其用户的引用信息。eg:如果sql想要查的表不存在,可以直接在数据字典缓存中发现
3>SQL 查询结果缓存
存储查询结果和查询片段结果的服务器结果缓存的子集,一样的sql会把上条sql的结果直接返回,当执行了修改结果对象的语句时,会自动时结果缓存失效。其实就和redis差不多
4>PL/SQL 函数结果缓存
存储函数结果集的服务器结果缓存的子集。
5>预留池
大池(Large Pool)
大池不是一个必选项,他的主要作用是分担一些Share Pool的压力。有些I/O进程也会使用到大池,比如RMAN在备份到磁带时和使用并行查询时
//查看large pool大小
show parameter large_;
select name,bytes/1024/1024 as mb,RESIZEABLE as mb from v$sgainfo;
//修改,不要轻易修改
alter sysetm set large_pool_size=
Java池(Java Pool)
当数据库中存在执行Java存储过程时使用,一般Java池用作实例化Java对象所需要的空间。这么理解,类似于为了处理SQL和PL/SQL命令而提供共享池
//查看已使用和未使用的JAVA池
select * from v$sgastat where pool = 'java pool';
流池(Streams Pool)
流池有两个主要作用,一是存储缓冲队列信息,二是为Oracle Streams捕获进程和应用进程提供内存
固定SGA区域(Fixed SGA)
固定系统全局区,意思就是不论如何都会有的一个内存区域。有关后台进程需要访问的数据库和实例状态的一般信息以及进程之间传递的信息,例如有关锁的信息