<span class=“js_title_inner“>35 张图带你了解 Oracle AI Database 26ai 技术架构(上)</span>

作者 | JiekeXu 来源 |公众号 JiekeXu DBA之路
如需转载请联系授权 | (个人微信 ID:JiekeXu_DBA)
作者:JiekeXu,江湖人称“强哥”,青学会MOP技术社区主席,荣获Oracle ACE,OpenTenBase ACE,金仓最具价值倡导者KVA,崖山最具价值专家YVP,IvorySQL开源社区专家顾问委员会成员,KWDB社区MVP,墨天轮MVP,墨天轮年度“墨力之星”,拥有 OCP/OCM 认证,MySQL 5.7/8.0 OCP 认证以及金仓KCM、KCSM证书,TiDB PCTA/PCTP 等其他国产数据库认证证书,欢迎关注我的微信公众号“JiekeXu DBA之路”,然后点击右上方三个点“设为星标”置顶,更多干货文章才能第一时间推送,谢谢!后台回复【加群】添加我微信一起交流学习。

前 言
了解 Oracle 体系架构是学习 Oracle 数据库的基础,很多面试官也会问关于体系结构的相关知识点,下面是 Oracle 非常经典的架构图,十年前我开始学的时候就是下面这张图,概括了数据库的全貌,学会搞懂他也算是入门了,今天我们来看看预计下周二左右要发布的 Oracle AI Database 26ai 本地部署版本体系结构长啥样。

下面是官方网站 Oracle AI Database 26ai 最新的体系结构图,和之前看到的版本最大的不一样,就是多了【Vector pool】向量池,这是值得多研究研究的,其他的部分和之前看到的基本一样。
下面则是按照官方文档上的架构图进行介绍和翻译和,略有微小出入,翻译不当的地方,还望多多包涵,另外由于文字过多,这里打算分为上、中、下三篇介绍,另一篇进程介绍详见明天发文。
Database Server 数据库服务
Oracle AI 数据库至少包含一个数据库实例和一个数据库。数据库实例由内存和进程组成,用于管理多租户容器数据库(CDB)。CDB 由物理存储结构(数据文件)和逻辑数据结构(模式和模式对象)组成。
此图展示了单实例数据库架构,其中数据库与数据库实例之间是一对一的关系。同一台服务器机器上可以存在多个单实例数据库。这种配置适用于在同一台机器上运行不同版本的 Oracle AI 数据库。
Oracle Real Application Clusters(Oracle RAC)数据库架构由运行在不同服务器机器上的多个实例和一个共享数据库组成。有关 Oracle RAC 架构的更多信息,请参阅《Oracle Real Application Clusters 19c 技术架构》[1]。

Oracle Net 监听器是数据库服务器进程,它接收来自客户端进程的传入连接,建立与数据库实例的连接,然后将客户端连接移交以直接与服务器进程通信,从而满足客户端请求。单实例数据库的监听器可以在数据库服务器本地运行,也可以在远程运行。
您可以使用多种工具来管理数据库,包括以下工具:
-
• Oracle Data Pump
-
• Oracle Enterprise Manager
-
• Oracle AI Database AutoUpgrade
-
• Database Configuration Assistant (DBCA)
-
• Oracle Recovery Manager (RMAN)
-
• Oracle Server Control Utility (SRVCTL)
-
• SQL Developer
-
• SQL*Loader
-
• SQL*Plus
Database Instance 数据库实例
在 Oracle AI 数据库中,数据库实例是一组进程和内存结构的集合,用于管理数据库文件。主要的内存结构包括系统全局区(SGA)和程序全局区(PGAs)。managed global area 托管全局区(MGA)是一个内存框架,能够在一组受信任的Oracle进程中共享和协调内存。background processes 后台进程对数据库文件进行操作,并使用内存结构来完成其工作。数据库实例仅存在于内存中。
数据库实例还具有服务器进程,用于代表客户端程序处理与数据库的连接,并为客户程序执行工作。例如,这些服务器进程解析并运行SQL语句,检索结果并返回给客户端进程。这类服务器进程也称为前台进程。
借助多租户架构,一个数据库实例与一个单一的多租户容器数据库(CDB)相关联。所有插入到CDB中的可插拔数据库(PDBs)(无论是直接插入还是通过应用程序容器插入)共享一组后台进程和 SGA。
SGA 系统全局区
系统全局区 (SGA)是包含单个 Oracle AI 数据库实例的数据和控制信息的内存区域。所有服务器进程和后台进程共享 SGA。启动数据库实例时,会显示分配给 SGA 的内存量。SGA 包含以下数据结构:
-
• 共享池缓存各种可供多个用户共享的结构;例如,共享池存储已解析的 SQL、PL/SQL 代码、系统参数和数据字典信息。数据库中发生的几乎所有操作都与共享池有关。例如,如果用户运行 SQL 语句,则 Oracle AI 数据库会访问共享池。
-
• (可选)要允许创建和维护向量索引,您必须启用存储在 SGA 中的名为“向量池”的内存区域。向量池是 SGA 中分配的内存,用于存储分层可导航小世界 (HNSW) 向量索引及其所有关联的元数据。它还用于加速倒排文件平面 (IVF) 索引的创建,以及对具有 IVF 索引的基表执行数据操作语言 (DML) 操作。
-
• (可选)闪回缓冲区与闪回数据库配合使用,以便您可以将数据回溯到过去某个时间点来纠正任何问题。启用闪回数据库后,恢复写入器进程 (RVWR) 将启动。RVWR 会定期将修改过的数据块从缓冲区缓存复制到闪回缓冲区,并将闪回数据库数据从闪回缓冲区按顺序写入闪回数据库日志,这些日志会循环重用。 数据库缓冲区缓存是存储从数据文件中读取的数据块副本的内存区域。缓冲区是主内存中的一个地址,缓冲区管理器会将当前或最近使用的数据块临时缓存到该地址中。所有同时连接到数据库实例的用户共享对缓冲区缓存的访问权限。
-
• (可选)True Cache 是 Oracle AI 数据库的内存缓存,它具有一致性和自动管理功能,支持 SQL 和键值(对象或 JSON)缓存。 您可以将常用表持久化到 True Cache 的数据库缓冲区缓存或主数据库(或两者都保留)。
-
• (可选)数据库智能闪存缓存 是运行在 Solaris 或 Oracle Linux 上的数据库的数据库缓冲区缓存的内存扩展。它为数据库块提供二级缓存。对于读取密集型在线事务处理 (OLTP) 工作负载以及数据仓库 (DW) 环境中的即席查询和批量数据修改,它都能提高响应时间和整体吞吐量。数据库智能闪存缓存位于一个或多个闪存盘设备上,这些设备是使用闪存的固态存储设备。数据库智能闪存缓存通常比额外的内存更经济,并且比磁盘驱动器快一个数量级。 重做日志缓冲区是 SGA 中的一个循环缓冲区,用于保存数据库更改信息。这些信息存储在重做条目中。重做条目包含通过 DML、数据定义语言 (DDL) 或内部操作重建(或重做)数据库更改所需的信息。必要时,重做条目可用于数据库恢复。
-
• (可选)大型池用于分配比共享内存池更大的内存。大型内存池可以为共享服务器的用户全局区 (UGA) 和 Oracle XA 接口(用于事务与多个数据库交互的情况)、用于并行处理语句的消息缓冲区、用于恢复管理器 (RMAN) I/O 工作进程的缓冲区以及延迟插入提供大容量内存。
-
• (可选)In-Memory Area 内存区域允许将对象(表、分区和其他类型)以列式格式存储在内存中。这种格式使得扫描、连接和聚合操作的执行速度远超传统的磁盘格式,从而为联机事务处理 (OLTP) 和数据仓库 (DW) 环境提供快速的报表和数据操作语言 (DML) 性能。此功能对于处理少量列但返回大量行的分析应用程序尤为有用,而对于处理少量行但返回多列的 OLTP 则不然。
-
• (可选)memoptimize 内存优化池为基于键的查询提供高性能和可扩展性。memoptimize 内存优化池包含两部分:memoptimize 缓冲区和哈希索引。快速查找利用 memoptimize 池中的哈希索引结构,快速访问给定表(已启用MEMOPTIMIZE FOR READ)中永久固定在缓冲区缓存中的数据块,从而避免磁盘 I/O。memoptimize 内存优化池中的缓冲区与数据库缓冲区缓存完全分离。哈希索引在配置 Memoptimized Rowstore 时创建,Oracle AI 数据库会自动维护它。
-
• (可选)共享 I/O 池 (SecureFiles)用于对 SecureFile 大型对象 (LOB) 执行大型 I/O 操作。LOB 是一组用于存储大量数据的数据类型。SecureFile LOB 是一种 存储参数,支持数据去重、加密和压缩。
-
• (可选)流池与Oracle Data Pump 和 Oracle GoldenGate 进程配合使用。流池存储缓冲队列消息。除非您进行专门配置,否则流池的大小初始值为零。
-
• (可选)Java 池用于存储 Java 虚拟机 (JVM) 中所有会话特定的 Java 代码和数据。Java 池内存的使用方式取决于 Oracle AI 数据库的运行模式。
-
• fixed SGA是一个内部管理区域,其中包含有关数据库和数据库实例状态的一般信息以及进程之间通信的信息。
PGA 程序全局区
程序全局区 (PGA)是数据库实例内的一个非共享内存区域,其中包含仅供服务器或后台进程使用的数据和控制信息。Oracle AI 数据库会创建服务器进程,代表客户端程序处理与数据库的连接。
在专用服务器环境中,Oracle AI 数据库会为每个启动的服务器和后台进程创建一个 PGA。当关联的服务器或后台进程终止时,Oracle AI 数据库会释放该 PGA。在专用服务器会话中,PGA 由以下组件构成:
SQL 工作区 包括用于对数据进行排序的函数(如 ORDER BY 和 GROUP BY)的排序区、用于执行表哈希连接的哈希区,以及用于合并从多个位图索引扫描中检索到的数据的位图合并区。
用户全局区 (UGA)是用户会话数据存储区,用于存储会话变量,例如登录信息和数据库会话所需的其他信息,以及管理 OLAP 数据页(相当于数据块)的 OLAP 池。
私有 SQL 区域保存已解析 SQL 语句的信息以及其他会话特定的处理信息。当服务器进程运行 SQL 或 PL/SQL 代码时,该进程使用私有 SQL 区域来存储绑定变量值、查询执行状态信息和查询执行工作区。同一会话或不同会话中的多个私有 SQL 区域可以指向 SGA 中的同一个执行计划。持久化区域包含绑定变量值。运行时区域包含查询执行状态信息。游标是指向私有 SQL 区域中特定区域的名称或句柄。您可以将游标视为客户端的指针和服务器端的状态。由于游标与私有 SQL 区域密切相关,因此这两个术语有时可以互换使用。
在共享服务器环境中,多个客户端用户共享服务器进程。用户全局区 (UGA) 会移至大池,而程序全局区 (PGA) 则仅保留 SQL 工作区和私有 SQL 区域。
Background porceesses 后台进程
后台进程是数据库实例的一部分,负责执行维护任务,以确保数据库正常运行并最大限度地提高多用户性能。每个后台进程执行的任务各不相同,但彼此协同工作。Oracle AI 数据库会在您启动数据库实例时自动创建后台进程。具体存在的后台进程取决于您正在使用的数据库功能。启动数据库实例时,必需的后台进程会自动启动。您可以根据需要稍后启动可选的后台进程。
所有典型的数据库配置中都存在必需的后台进程。这些进程默认在以最小配置初始化参数文件启动的读写数据库实例中运行。只读数据库实例会禁用其中一些进程。必需的后台进程包括进程监视器 (PMON)、进程管理器 (PMAN)、监听器注册 (LREG)、系统监视器 (SMON)、数据库写入器 (DBWn)、检查点 (CKPT)、可管理性监视器 (MMON)、精简版可管理性监视器 (MMNL)、恢复器 (RECO) 和日志写入进程 (LGWR)。
大多数可选后台进程都与特定任务或功能相关。一些常见的可选进程包括归档程序 (ARCn)、作业队列协调程序 (CJQ0)、恢复写入程序 (RVWR)、闪回数据归档程序 (FBDA) 和空间管理协调程序 (SMCO),这些进程后面部分会单独讲解。
工作进程是后台进程,它们代表其他进程执行工作。其中包括调度程序(Dnnn)和共享服务器(Snnn)进程。
Shared Pool 共享池
共享池是数据库实例中系统全局区 (SGA) 的一个组成部分。它负责缓存各种类型的程序数据。例如,共享池存储已解析的 SQL、PL/SQL 代码、系统参数和数据字典信息。数据库中发生的几乎所有操作都与共享池有关。例如,如果用户运行 SQL 语句,则 Oracle AI 数据库会访问共享池。
共享池由以下子组件构成:
-
Library Cache 库缓存是一个共享的内存池结构,用于存储可执行的 SQL 和 PL/SQL 代码。该缓存包含共享的 SQL 和 PL/SQL 区域以及控制结构,例如锁和库缓存句柄。当执行 SQL 语句时,数据库会尝试重用之前执行过的代码。如果库缓存中存在 SQL 语句的已解析表示形式且可以共享,则数据库会重用该代码。此操作称为软解析或库缓存命中。否则,数据库必须构建应用程序代码的新可执行版本,这称为硬解析或库缓存未命中。
-
reserved pool 预留池是共享池中的一个内存区域,Oracle AI 数据库可以使用该区域分配大块连续内存。数据库以块的形式从共享池中分配内存。分块分配允许将大对象(超过 5 KB)加载到缓存中,而无需使用单个连续区域。这样,数据库就降低了因内存碎片而导致连续内存耗尽的可能性。
-
data dictionary cache 数据字典缓存存储数据库对象的信息(即字典数据)。该缓存也称为行缓存,因为它以行而不是缓冲区的形式存储数据。
-
server result cache 服务器结果缓存是共享内存池中的一个内存池,其中包含 SQL 查询结果缓存和 PL/SQL 函数结果缓存,它们共享同一基础架构。SQL 查询结果缓存存储查询结果和查询片段。大多数应用程序都能从这种性能提升中受益。PL/SQL 函数结果缓存存储函数结果集。频繁调用且依赖于相对静态数据的函数非常适合进行结果缓存。
-
其他组件包括入队 、锁存器 、信息生命周期管理 (ILM) 位图表 、活动会话历史 (ASH) 缓冲区 和其他一些次要内存结构。入队是共享内存结构(锁),用于串行化对数据库资源的访问。它们可以与进程或会话关联。例如,控制文件事务、实例恢复、介质恢复、作业队列和行缓存。锁存器用作底层串行化控制机制,以保护 SGA 中的共享数据结构免受并发访问。例如,缓存缓冲区链和重做日志分配。
Large Pool 大池
大内存池是数据库实例和系统全局区 (SGA) 中的一个可选内存区域。您可以配置大池,为以下区域提供大容量内存分配:
-
• 共享服务器环境和 Oracle XA 接口(用于事务与多个数据库交互)使用用户全局区 (UGA)(会话内存)。在专用服务器环境中,UGA 存储在程序全局区 (PGA)中。
-
• I/O 缓冲区区域包括I/O 服务器进程、并行查询操作的消息缓冲区、恢复管理器 (RMAN) I/O 工作进程的缓冲区以及高级队列内存表存储。
-
• 快速摄取功能使用延迟插入池,该功能允许对定义为
memoptimized的表进行高频单行数据插入MEMOPTIMIZE FOR WRITE。快速摄取插入的数据也称为延迟插入。这些数据最初会缓冲在大池中,然后在每个会话每个对象写入 1MB 后(或 60 秒后),由空间管理协调器进程 (SMCO) 和 Wxxx 工作后台进程异步写入磁盘。即使会话已提交,在 SMCO 后台进程清除缓存之前,会话也无法读取此池中缓冲的任何数据。该池在内存优化表插入第一行数据时初始化于大池中。当大池空间充足时,会分配 2GB 内存。如果大池空间不足,系统ORA-4031内部会发现并自动清除内存池。然后,系统会尝试使用请求大小的一半重新分配内存。如果大池空间仍然不足,系统会尝试使用 512M 和 256M 的内存重新分配,之后该功能将被禁用,直到实例重启。池初始化后,其大小将保持不变,无法增加或减少。 -
• 并行执行消息池(px msg pool)由并行查询执行进程用于相互发送消息。
-
• 可用内存
大内存池与共享内存池中的预留空间不同,后者与其他从共享内存池分配的内存一样,使用相同的最近最少使用 (LRU) 列表。大内存池没有 LRU 列表。内存一旦分配,只有在使用完毕后才能释放。
用户请求是指用户 SQL 语句中的一次 API 调用。
在专用服务器环境中,一个专用服务器进程处理来自单个客户端进程的请求。每个服务器进程都会占用系统资源,包括 CPU 周期和内存。
在共享服务器环境中,会发生以下操作:
-
1. 客户端进程向数据库实例发送请求,调度程序进程(Dnnn)接收该请求。
-
2. 调度程序将请求放入 Large Pool 大池的请求队列中。
-
3. 下一个可用的共享服务器进程(Snnn)会处理该请求。共享服务器进程会检查公共请求队列中的新请求,并按照先进先出的原则处理新请求。一个共享服务器进程只能处理队列中的一个请求。
-
4. 共享服务器进程会向数据库发出所有必要的调用以完成请求。首先,共享服务器进程访问共享池中的库缓存来验证请求的数据项。例如,它会检查表是否存在、用户是否拥有正确的权限等等。接下来,共享服务器进程访问缓冲区缓存来检索数据。如果数据不存在,则共享服务器进程会访问磁盘。每个数据库调用都可以由不同的共享服务器进程处理。因此,解析查询、获取第一行、获取下一行以及关闭结果集的请求可能分别由不同的共享服务器进程处理。由于每个数据库调用都可能由不同的共享服务器进程处理,因此用户全局区 ( UGA)必须是共享内存区域,因为 UGA 包含有关每个客户端会话的信息。反过来说,UGA 包含有关每个客户端会话的信息,并且必须对所有共享服务器进程可用,因为任何共享服务器进程都可能处理任何会话的数据库调用。
-
5. 请求完成后,共享服务器进程会将响应放入调用调度程序的响应队列(位于大队列中)。每个调度程序都有自己的响应队列。
-
6. 响应队列将响应发送给调度器。
-
7. 调度程序将完成的请求返回给相应的客户端进程。
Vector Pool 向量池
为了允许创建向量索引,您必须启用存储在SGA中的新内存区域——向量池。向量池是SGA中分配的内存,用于存储分层可导航小世界(HNSW)向量索引及其所有相关元数据。它还用于加快反向文件平面(IVF)索引的创建,以及对带有 IVF 索引的基本表执行 DML 操作。IVF 向量存储在向量池中,以提高 IVF 索引的创建和维护性能。如果向量池空间不足,质心向量将被缓存到大池中。如果大池空间也不足,则质心向量不会被缓存到内存中。此规则适用于未分区和已分区的本地及全局IVF索引。
要在本地环境中调整 Vector Pool 的大小,请使用以下方法:VECTOR_MEMORY_SIZE 初始化参数。您可以在以下几个层级动态修改此参数:
-
• 在 CDB 层面VECTOR_MEMORY_SIZE指定向量池的当前大小。如果当前已有向量在使用,则减小参数值将失败。
-
• 在PDB层面VECTOR_MEMORY_SIZE 指定 PDB 允许的最大向量池使用量。即使当前向量使用量超过新的配额,也允许降低此参数值。
您可以通过以下方式更改参数文件中参数的值:
-
• 通过编辑初始化参数文件。在大多数情况下,新值会在下次启动数据库实例时生效。
-
• 通过发布ALTER SYSTEM SET ... SCOPE=SPFILE声明来更新服务器参数文件。
-
• 通过发出一条ALTER SYSTEM RESET语句来清除初始化参数值并将其设置回默认值。
SQL> show con_name
CON_NAME
------------------------------
JIEKEXUPDB1
SQL> show user
USER is "SYS"
SQL> show parameter vector_memory_size
NAME TYPE VALUE
------------------ ----------- -----
vector_memory_size big integer 500M
SQL> SELECT ISPDB_MODIFIABLE
2 FROM V$SYSTEM_PARAMETER
3* WHERE NAME='vector_memory_size';
ISPDB_MODIFIABLE
___________________
TRUE
SQL> ALTER SYSTEM SET vector_memory_size=1G SCOPE=BOTH;
System altered.
SQL> show parameter vector_memory_size
NAME TYPE VALUE
------------------- ----------- -------
vector_memory_size big integer 1G
SQL>
如果VECTOR_MEMORY_SIZE设置为1,且在CDB初始化时 sga_target 大于0,则HNSW索引创建会自动增大向量内存池以满足新索引的需求。PDB的VECTOR_MEMORY_SIZE 最大值限制为 PDB sga_target 的70%。删除 HNSW 索引时,向量内存池会相应缩小。
在此配置下,向量内存池自动增长的情况下,PDB 的 VECTOR_MEMORY_SIZE 值将默认为0,并且不能使用ALTER SYSTEM命令进行修改。由于自动增长导致的向量池大小变化不会保存到spfile中,因此当数据库重启时,向量池大小会被重置。
您可以查询V$VECTOR_MEMORY_POOL视图来监控向量池。
buffer canche 缓冲区缓存
数据库缓冲区缓存(也称为缓冲区缓存)是数据库实例系统全局区 (SGA) 中的一个内存区域。它存储从数据文件中读取的数据块的副本。缓冲区是主内存中的一个地址,缓冲区管理器会将当前或最近使用的数据块临时缓存到该地址中。所有并发连接到数据库实例的用户共享对缓冲区缓存的访问权限。缓冲区缓存的目标是优化物理 I/O 并将频繁访问的数据块保留在缓冲区缓存中。
当 Oracle AI 数据库客户端进程首次需要特定数据时,它会在数据库缓冲区缓存中查找该数据。如果进程在缓存中找到该数据(缓存命中),则可以直接从内存中读取数据。如果进程在缓存中找不到该数据(缓存未命中),则会先将磁盘上数据文件中的数据块复制到缓存缓冲区中,然后再访问该数据。通过缓存命中访问数据比通过缓存未命中访问数据更快。
缓存中的缓冲区由一个复杂的算法管理,该算法结合了最近最少使用 (LRU) 列表和访问计数。LRU 有助于确保最近使用的数据块倾向于保留在内存中,从而最大限度地减少磁盘访问。
数据库缓冲区缓存由以下区域组成:
-
• 默认池是数据块通常缓存的位置。默认块大小为 8 KB。除非您手动配置其他池,否则默认池是唯一的缓冲池。其他池的可选配置不会影响默认池。
-
• (可选)保留池 用于存放预计会被频繁访问且因空间不足而从默认池中移除的数据块。保留池的目的是将指定的对象保留在内存中,以避免 I/O 操作。表会被分配到保留池中,它们不会自动从默认池移动到保留池。
-
• (可选)回收池用于存放不常用的数据块。回收池可以防止对象占用缓存中不必要的空间。
-
• (可选)非默认缓冲池适用于使用 2 KB、4 KB、16 KB 和 32 KB 非标准块大小的表空间。每种非默认块大小都有其自己的缓冲池。Oracle AI 数据库管理这些缓冲池中的块的方式与管理默认缓冲池中的块的方式相同。
-
• (可选)数据库智能闪存缓存(闪存缓存)允许您使用闪存设备来增加缓冲区缓存的有效容量,而无需增加主内存。闪存缓存通过将数据库缓存中频繁访问的数据存储在闪存中,而不是从磁盘读取数据,从而提高数据库性能。当数据库请求数据时,系统首先在数据库缓冲区缓存中查找数据。如果找不到数据,系统则在数据库智能闪存缓存缓冲区中查找。如果仍然找不到数据,系统才会查找磁盘存储。在 Oracle 实时应用集群 (RAC) 环境中,您必须在所有实例上配置闪存缓存,或者不配置任何实例。
-
• 最近最少使用 (LRU) 列表包含指向脏缓冲区和非脏缓冲区的指针。LRU 列表分为热端和冷端。冷缓冲区是指最近未使用的缓冲区。热缓冲区是指最近被频繁访问且已被使用的缓冲区。从概念上讲,LRU 列表只有一个,但为了保证数据并发性,数据库实际上会使用多个 LRU 列表。
-
• 检查点 队列是脏缓冲区的列表,按照重做块地址 (RBA) 顺序进行更改。
-
• (可选)如果启用数据库智能闪存缓存,闪存缓冲区将包含一个默认闪存 LRU 链和一个保留闪存 LRU 链。如果没有数据库智能闪存缓存,当进程尝试访问一个数据块且该数据块不存在于缓存中时,系统会首先从磁盘读取该数据块到内存(物理读取)。当内存缓存已满时,系统会根据 LRU 机制将缓冲区从内存中驱逐出去。启用数据库智能闪存缓存后,当一个干净的内存缓冲区老化时,数据库写入进程 (DBWn) 会在后台将内容写入闪存缓存,并且缓冲区头会作为元数据保留在内存中,具体位置取决于对象FLASH_CACHE属性的值,取决于默认闪存 LRU 列表或保留闪存 LRU 列表。保留闪存 LRU 列表会将缓冲区头维护在一个单独的列表中,以防止常规缓冲区头替换它们。这意味着,被指定为保留闪存 LRU 列表的对象,其闪存缓冲区头KEEP往往会在闪存缓存中保留更长时间。如果FLASH_CACHE对象属性设置为 true NONE,系统不会在闪存缓存或内存中保留相应的缓冲区。当再次访问已从内存中过期的缓冲区时,系统会检查闪存缓存。如果找到该缓冲区,系统会将其从闪存缓存中读出,这仅需从磁盘读取所需时间的一小部分。RAC 中闪存缓存缓冲区的一致性维护方式与 Oracle RAC 缓存融合相同。由于闪存缓存是扩展缓存,并且直接路径 I/O 完全绕过了缓冲区缓存,因此此功能不支持直接路径 I/O。请注意,系统不会将脏缓冲区放入闪存缓存,因为系统可能需要将缓冲区读入内存才能进行检查点操作,而写入闪存缓存的操作不计入检查点。
IM 内存区域
内存区域 (In-Memory Area)是数据库实例中的一个可选系统全局区 (SGA) 组件。它包含内存列式存储 (IM 列式存储),该存储使用针对快速扫描优化的列式格式将表和分区存储在内存中。IM 列式存储允许以传统的行格式(在缓冲区缓存中)和列式格式同时填充 SGA 中的数据。数据库会将联机事务处理 (OLTP) 查询(例如主键查找)透明地发送到缓冲区缓存,并将分析和报表查询发送到 IM 列式存储。在获取数据时,Oracle AI 数据库还可以在同一查询中从两个内存区域读取数据。这种双格式架构不会使内存需求翻倍。缓冲区缓存经过优化,其运行大小远小于数据库的大小。
您应该只在 IM 列存储中填充对性能影响最大的数据。要将对象添加到 IM 列存储,请在创建或修改对象时启用该对象的 INMEMORY 属性。您可以为表空间(适用于表空间中的所有新表和视图)、表、分区、子分区、物化视图或对象中的列子集指定此属性。
IM 列式存储使用优化的存储单元(而非传统的 Oracle 数据块)来管理数据和元数据。内存压缩单元 (IMCU)是一种压缩的只读存储单元,其中包含一个或多个列的数据。快照元数据单元 (SMU)包含与 IMCU 关联的元数据和事务信息。每个 IMCU 都映射到一个单独的 SMU。
表达式统计信息存储库 (ESS)是一个用于存储表达式求值统计信息的存储库。ESS 驻留在存储全局区 (SGA) 中,同时也持久化到磁盘上。启用内存表达式列存储后,数据库会利用 ESS 来实现其内存表达式 (IM expressions) 功能。内存表达式单元 (IMEU)是一个用于存储物化 IM 表达式和用户定义虚拟列的存储容器。请注意,ESS 与 IM 列存储相互独立。ESS 是数据库的永久组件,无法禁用。
从概念上讲,IMEU 是其父 IMCU 的逻辑扩展。正如 IMCU 可以包含多个列一样,IMEU 也可以包含多个虚拟列。每个 IMEU 都映射到唯一一个 IMCU,并且映射到同一组行。IMEU 包含与其关联的 IMCU 中所含数据的表达式结果。当 IMCU 被填充时,关联的 IMEU 也会被填充。
典型的IM表达式包含一个或多个列,可能还包含常量,并且与表中的行存在一一映射关系。例如,对于EMPLOYEES表的IMCU,可能包含每周工资(weekly_salary)列的第1至1000行。对于存储在该IMCU中的这些行,IMEU 会计算自动检测到的IM表达式“weekly_salary*52”,以及用户定义的虚拟列“quarterly_salary”(定义为“weekly_salary*12”)。IMCU中的第三行将映射到IMEU中的第三行。
内存区域分为两个池:
-
• 一个 1MB 的列式数据池,用于存储实际填充到内存(IMCU 和 IMEU)中的列格式数据。
-
• 一个 64K 的元数据池,用于存储有关填充到 IM 列存储(SMU)中的对象的元数据。
两个内存池的相对大小由内部启发式算法决定。In-Memory 区域的大部分内存分配给1MB内存池。In-Memory区域的大小由初始化参数 INMEMORY_SIZE(默认值为0)控制,且最小大小必须为100MB。从Oracle Database 12.2开始,可以通过 ALTER SYSTEM 命令将 INMEMORY_SIZE 参数至少增加 128MB,从而动态增加 In-Memory 区域的大小。请注意,无法动态减小 In-Memory 区域的大小。
Oracle AI 数据库内存版具有基本级别功能,允许您使用高达 16GB 的列式存储,而不会触发任何许可证跟踪。
首次访问内存表数据或数据库启动时,会在内存列存储中为内存表分配 IMCU。通过将磁盘格式转换为新的内存列存储格式,即可创建表的内存副本。每次实例重启时都会执行此转换,因为内存列存储副本仅驻留在内存中。转换完成后,表的内存版本会逐渐可用于查询。如果表已部分转换,查询可以使用部分内存版本,其余部分则从磁盘读取,而无需等待整个表转换完成。
当表中并非所有列都已填充到内存列存储中时,内存混合扫描可以同时访问内存列存储中的部分数据和行存储中的部分数据。与纯行存储查询相比,这可以将性能提升几个数量级。
自动内存功能无需用户干预即可启用、填充、逐出和重新压缩段。当 INMEMORY_AUTOMATIC_LEVEL 设置为 HIGH 时,数据库会根据段的使用模式自动启用并填充段。这种自动化有助于最大化一次可填充到IM列存储中的对象数量。
服务器进程响应查询和数据操作语言 (DML) 指令,扫描列式数据并更新空间管理单元 (SMU) 元数据。后台进程将磁盘上的行数据填充到内存 (IM) 列式存储中。内存协调器进程 (IMCO)启动列式数据的后台填充和重新填充。空间管理协调器进程 (SMCO)和空间管理工作进程 (Wnnn)代表 IMCO 执行实际的数据填充和重新填充操作。DML 块更改先写入缓冲区缓存,然后再写入磁盘。后台进程随后根据元数据失效和查询请求,将磁盘上的行数据重新填充到 IM 列式存储中。
您可以启用内存快速启动功能,将内存列存储中的列式数据以压缩列格式写回数据库的表空间。此功能可加快数据库启动速度。请注意,此功能不适用于内存执行单元 (IMEU)。IMEU 始终由内存管理单元 (IMCU) 动态填充。
内存深度向量化可以通过对每个 SQL 运算符内部的物理运算符进行流水线化,并使用单指令多数据流 ( SIMD)技术对其进行向量化,从而优化复杂的 SQL 运算符。此功能默认启用,但您可以通过将INMEMORY_DEEP_VECTORIZATION初始化参数设置为 false 来禁用它。
引用链接
[1] 《Oracle Real Application Clusters 19c 技术架构》: https://docs.oracle.com/en/database/oracle/oracle-database/26/adrac/rac_db_config.html[2] 《关于在CDB中使用可管理性功能》: https://docs.oracle.com/en/database/oracle/oracle-database/26/multi/administering-a-cdb-with-sql-plus.html#GUID-DF42C0D3-8968-4810-9327-9D176337D356
参考链接
https://docs.oracle.com/en/database/oracle/oracle-database/26/cncpt/introduction-to-oracle-database.html#GUID-8F2EEEC8-0372-4419-88FF-7D77A9C0FCAD
https://docs.oracle.com/en/database/oracle/oracle-database/26/dbiad/db_dbserver.html
https://docs.oracle.com/en/database/oracle/oracle-database/26/adrac/rac_db_config.html
全文完,希望可以帮到正在阅读的你,如果觉得有帮助,可以分享给你身边的朋友,同事,你关心谁就分享给谁,一起学习共同进步~~~
欢迎关注我的公众号【JiekeXu DBA之路】,一起学习新知识!
——————————————————————————
公众号:JiekeXu DBA之路
墨天轮:https://www.modb.pro/u/4347
CSDN :https://blog.csdn.net/JiekeXu
ITPUB:https://blog.itpub.net/69968215
IFCLUB:https://ifclub.com.cn/user?type=1
腾讯云:https://cloud.tencent.com/developer/user/5645107 ——————————————————————————

第三批国测公布:国产数据库新势力的破局与价值
2024 年公众号 JiekeXu DBA之路历史文章合集
2023 年公众号 JiekeXu DBA之路历史文章合集
2022 年公众号 JiekeXu DBA之路历史文章合集
2021 年公众号历史文章合集
更多推荐

所有评论(0)