oracle的内存架构学习

甲骨文数据库内存结构简介

当实例启动时,甲骨文数据库会分配一个内存区域并启动后台进程。

内存区域存储信息,例如:

程序代码

有关每个连接会话的信息,即使它当前不活跃

程序执行过程中所需的信息,例如,正在获取行的查询的当前状态

进程之间共享和通信的锁数据等信息

缓存数据,如数据块和重做记录,也存在于磁盘上

基本记忆结构

甲骨文数据库包含几个内存区域,每个内存区域都包含多个子组件。

甲骨文数据库内存管理

内存管理涉及根据数据库变化的需求,保持甲骨文实例内存结构的最佳大小。甲骨文数据库根据内存相关初始化参数的设置来管理内存。

基本记忆结构

包括系统全球区域(SGA),计划全球区域(PGA),用户全球区域(UGA),软件代码区域

内存图:

用户全球区域概述

UGA是会话内存,是分配给会话变量的内存,如登录信息和数据库会话所需的其他信息。从本质上讲,UGA存储会话状态。

下图描绘了UGA。

UGA 的存储位置
  • 共享服务器模式(MTS):UGA 存储在 SGA 的共享服务器池中;
  • 专用服务器模式(Dedicated Server):UGA 存储在对应服务器进程的 PGA 中。

全球项目区域(PGA)概述

PGA是特定于操作系统进程或线程的内存,系统上的其他进程或线程不共享。由于PGA是特定于过程的,它从未在SGA中分配过。

PGA 的核心子组件
  • 排序区(Sort Area) :存储排序操作的中间结果,如ORDER BYGROUP BY
  • 哈希区(Hash Area):存储哈希连接(Hash Join)的中间数据;
  • 位图合并区(Bitmap Merge Area):处理位图索引合并操作;
  • 绑定变量区(Bind Area):存储 SQL 语句中的绑定变量值;
  • 会话游标状态(Session Cursor State):记录游标执行状态和结果集。

系统全球区域(SGA)概述

SGA是一个读/写内存区域,与甲骨文后台进程一起形成一个数据库实例。

下下面是其组件组成:

数据库缓冲缓存,也称为缓冲缓存,是存储从数据文件中读取的数据块副本的内存区域。

重做日志缓冲区是SGA中的一个循环缓冲区,用于存储描述对数据库所做的更改的重做条目

共享池缓存各种类型的程序数据。

大型池是一个可选的内存区域,用于分配大于适合共享池的内存。

Java池是一个内存区域,在Java虚拟机(JVM)中存储所有特定于会话的Java代码和数据。此内存包括在调用结束时迁移到Java会话空间的Java对象。

固定SGA是一个内部家政服务区。

某些SGA子区域仅为特定性能功能启用。

数据库缓冲缓存

数据库缓冲缓存,也称为缓冲缓存,是存储从数据文件中读取的数据块副本的内存区域。

模式不同如下:

当前模式

当前模式获取,也称为db块获取,是当前出现在缓冲缓存中的块的检索。例如,如果未提交的事务更新了一个块中的两行,那么当前模式get会检索包含这些未提交的行的块。数据库在修改语句期间最频繁地使用db块,只能更新当前版本的块。

一致模式

一致读取获取是检索块的读取一致版本。此检索可能会使用撤销数据。例如,如果未提交事务更新了块中的两行,并且如果单独会话中的查询请求该块,那么数据库将使用撤销数据创建该块的读取一致版本(称为一致读取克隆),该版本不包括未提交的更新。通常,查询以一致模式检索块。

重做日志缓冲区

重做日志缓冲区是SGA中的一个循环缓冲区,用于存储描述对数据库所做的更改的重做条目。

数据库进程将重做条目从用户内存空间复制到SGA中的重做日志缓冲区。重做条目占用缓冲区中的连续、顺序的空间。后台进程日志写入器进程(LGWR)将重做日志缓冲区写入磁盘上的活动在线重做日志组。

LGWR按顺序重写到磁盘,而DBW则对数据块进行分散写入磁盘。分散写入往往比顺序写入慢得多。

共享池

共享池缓存各种类型的程序数据。

例如,共享池存储解析的SQL、PL/SQL代码、系统参数数据字典信息。共享池几乎参与数据库中发生的每个操作。例如,如果用户执行SQL语句,那么Oracle数据库将访问共享池。

保留池

保留池是共享池中的内存区域,甲骨文数据库可用于分配大量连续的内存块。

数据库从共享池中分块分配内存。Chunking允许将大型对象(超过5 KB)加载到缓存中,而无需单个连续区域。通过这种方式,数据库减少了因碎片化而连续内存耗尽的可能性。

大游泳池(用于推迟插入的大型池式緩衝器)

大型池是一个可选的内存区域,用于分配大于适合共享池的内存。

大型池可以为以下内容提供大量内存分配:

  • 用于共享服务器和ORACLE ------XA接口的UGA(用于交易与多个数据库交互)

  • 并行执行中使用的消息缓冲区

  • 恢复管理器(RMAN)I/O从属的緩衝

  • 推迟插入的緩衝區(带有MEMOPTIMIZE_WRITE提示的插入)

对于一种被称为递延插入的特殊类型的插入,数据库从大池中分配缓冲区。

Java池是一个内存区域,在Java虚拟机(JVM)中存储所有特定于会话的Java代码和数据。此内存包括在调用结束时迁移到Java会话空间的Java对象。

Java池顾问统计数据提供了有关Java使用的库缓存内存的信息,并预测Java池大小的变化如何影响解析率。当statistics_level设置为TYPICAL或更高时,Java池顾问在内部打开。当 Advisor(技术顾问)关机时,这些统计数据会重置。

固定的SGA

固定SGA是一个内部家政服务区。

例如,固定的SGA包含:

  • 后台进程需要访问的有关数据库和实例状态的一般信息

  • 流程之间通信的信息,例如有关锁的信息。

内存区

内存区域是一个可选的SGA组件,其中包含内存列存储(IM列存储)。

IM列存储包含表、分区和实体化视图的副本,其格式为快速扫描进行了优化。IM列存储补充数据库缓冲缓存,该缓存以传统行格式存储数据。

软件代码区域概述

软件代码区域是存储正在运行或可以运行的代码的内存的一部分。甲骨文数据库代码存储在软件区域中,该区域通常比用户程序的位置更专有和受保护。

软件区域通常大小是静态的,只有在更新或重新安装软件时才会更改。这些区域所需的大小因操作系统而异。

相关推荐
power 雀儿3 分钟前
集群聊天服务器---MySQL数据库的建立
服务器·数据库·mysql
zhuyasen1 小时前
定义即代码!这个框架解决了90%的Go开发者还在低效开发项目的问题
架构·go·gin
LCG元1 小时前
云原生微服务间的异步消息通信:最终一致性与系统容错的架构实战
微服务·云原生·架构
骑着王八撵玉兔2 小时前
【性能优化与架构调优(二)】高性能数据库设计与优化
数据库·性能优化·架构
碎叶城李白2 小时前
若依学习笔记1-validated
java·笔记·学习·validated
im_AMBER2 小时前
学习日志05 python
python·学习
想要入门的程序猿3 小时前
Qt写入excel
数据库·qt·excel
Jiude3 小时前
MinIO 社区版被故意阉割,Web管理功能全面移除。我来试试国产RustFS
后端·docker·架构
Q_970956393 小时前
java+vue+SpringBoo校园失物招领网站(程序+数据库+报告+部署教程+答辩指导)
java·数据库·vue.js
Wyc724093 小时前
Maven
java·数据库·maven