ORACLE的内存结构

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)

固定系统全局区,意思就是不论如何都会有的一个内存区域。有关后台进程需要访问的数据库和实例状态的一般信息以及进程之间传递的信息,例如有关锁的信息

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Oracle数据库内存结构包括以下几个主要组件: 1. System Global Area (SGA):SGA是Oracle数据库实例的关键部分,它存储了在数据库实例运行期间需要共享的数据和控制结构。SGA包括以下主要组件: - 数据库缓冲区(Database Buffer Cache):用于存储从磁盘读取的数据块以及经常访问的数据块。 - 共享池(Shared Pool):存储共享SQL和PL/SQL代码的内存区域,包括共享SQL区和共享游标区。 - 重做日志缓冲区(Redo Log Buffer):用于存储已提交的事务的重做日志记录,以支持数据库恢复和故障恢复。 - 大池(Large Pool):用于存储大型内存分配,例如排序操作和并行查询的I/O缓冲区。 - Java池(Java Pool):用于存储Java虚拟机所需的内存。 2. Program Global Area (PGA):PGA是每个后台进程或服务器进程的私有内存区域。每个会话都有自己的PGA,用于存储会话特定的数据和控制结构,例如排序和连接操作的临时数据。 3. Large Pool:大池是一块SGA内存区域,用于处理额外的大内存分配需求,例如备份和恢复操作,以及并行查询的I/O缓冲区。 此外,Oracle数据库还有其他一些内存结构,如Java池(用于存储Java虚拟机所需的内存)、Streams池(用于支持数据流复制)、共享服务器连接池(用于管理共享服务器进程的内存)等。这些内存结构共同协作,支持数据库实例的正常运行和性能优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值