Oracle官方文档翻译《Database Concepts 26ai》第17章-内存架构
17 Mem)ory Architecture(17 内存架构)
本章讨论数据库实例的内存架构。
-
• Introduction to Oracle AI Database Memory Structures(Oracle AI 数据库内存结构简介)当实例启动时,Oracle AI 数据库会分配内存区域并启动后台进程。 -
• Overview of the System Global Area (SGA)(系统全局区 (SGA) 概述)SGA 是一个可读/可写的内存区域,与 Oracle 后台进程一起构成数据库实例。 -
• Overview of the Program Global Area (PGA)(程序全局区 (PGA) 概述)PGA 是特定于操作系统进程或线程的内存,不被系统上的其他进程或线程共享。由于 PGA 是特定于进程的,因此它永远不会分配在 SGA 中。 -
• Overview of the User Global Area(用户全局区概述)UGA 是会话内存,即分配给会话变量的内存,例如登录信息以及数据库会话所需的其他信息。本质上,UGA 存储会话状态。 -
• Overview of the Managed Global Area (MGA)(托管全局区 (MGA) 概述)托管全局区 (MGA) 是一个独特的内存框架,能够在一组受信任的 Oracle 进程之间共享和协调内存。 -
• Overview of Software Code Areas(软件代码区概述)软件代码区是用于存储正在运行或可以运行的代码的内存部分。Oracle AI 数据库代码存储在一个软件区域中,该区域通常比用户程序的位置更独占、更受保护。
另请参见《Oracle AI 数据库管理员指南》以获取有关配置和管理内存的说明。
Introduction to Oracle AI Database Memory Structures(Oracle AI 数据库内存结构简介)
当实例启动时,Oracle AI 数据库会分配内存区域并启动后台进程。
该内存区域存储以下信息:
-
• 程序代码 -
• 有关每个已连接会话的信息,即使该会话当前不活跃 -
• 程序执行期间所需的信息,例如,正在从中提取行的查询的当前状态 -
• 在进程间共享和通信的信息,例如锁数据 -
• 缓存数据,例如也存在于磁盘上的数据块和重做记录 -
• Basic Memory Structures(基本内存结构)Oracle AI 数据库包含多个内存区域,每个区域都包含多个子组件。 -
• Oracle AI Database Memory Management(Oracle AI 数据库内存管理)内存管理涉及根据数据库需求的变化,为 Oracle 实例内存结构维护最佳大小。Oracle AI 数据库根据与内存相关的初始化参数的设置来管理内存。
另请参见“Process Architecture”(进程架构)
Basic Memory Structures(基本内存结构)
Oracle AI 数据库包含多个内存区域,每个区域都包含多个子组件。
与 Oracle AI 数据库相关的基本内存结构包括:
-
• System global area (SGA)(系统全局区 (SGA))SGA 是一组共享内存结构,称为 SGA 组件,包含一个 Oracle AI 数据库实例的数据和控制信息。所有服务器进程和后台进程共享 SGA。存储在 SGA 中的数据的示例包括缓存数据块和共享 SQL 区。 -
• Program global area (PGA)(程序全局区 (PGA))PGA 是一个非共享内存区域,包含专供 Oracle 进程使用的数据和控制信息。Oracle AI 数据库在 Oracle 进程启动时创建 PGA。每个服务器进程和后台进程都有一个 PGA。各个 PGA 的集合是总实例 PGA,或称实例 PGA。数据库初始化参数设置实例 PGA 的大小,而不是各个 PGA 的大小。 -
• User global area (UGA)(用户全局区 (UGA))UGA 是与用户会话关联的内存。 -
• Managed Global Area (MGA)(托管全局区 (MGA))MGA 是一个由 Oracle AI 数据库实例使用的半共享内存组件。它能够在一小部分受信任的 Oracle 进程之间共享和协调内存。它能够做到可配置、弹性、模块化、按需和可重用。与 SGA 不同,Oracle AI 数据库模块可以选择哪些进程附着到此区域,并且此行为是动态的。 -
• Software code areas(软件代码区)软件代码区是用于存储正在运行或可以运行的代码的内存部分。Oracle AI 数据库代码存储在一个软件区域中,该区域通常位于与用户程序不同的位置——一个更独占或受保护的位置。
下图说明了这些内存结构之间的关系。
Figure 17-1 Oracle AI Database Memory Structures(图17-1 Oracle AI 数据库内存结构)

Oracle AI Database Memory Management(Oracle AI 数据库内存管理)
内存管理涉及根据数据库需求的变化,为 Oracle 实例内存结构维护最佳大小。Oracle AI 数据库根据与内存相关的初始化参数的设置来管理内存。
内存管理的基本选项如下:
-
• Unified memory management(统一内存管理)统一内存使用单个参数 MEMORY_SIZE 配置数据库实例内存。数据库可以根据当前工作负载,将此内存动态用于任意比例的 SGA、PGA、MGA、UGA 和其他内存段。不同内存段之间的划分基于 CDB 中当前打开的 PDB 的内存大小。如果配置了大页,它们可以同时用于 SGA 和 PGA。统一内存提供了极其灵活的内存配置。 -
• Automatic memory management(自动内存管理)您指定数据库实例内存的目标大小。实例会自动调整到目标内存大小,并根据需要在 SGA 和实例 PGA 之间重新分配内存。 -
• Automatic shared memory management(自动共享内存管理)此管理模式是部分自动化的。您为 SGA 设置目标大小,然后可以选择为 PGA 设置聚合目标大小,或者单独管理 PGA 工作区。 -
• Manual memory management(手动内存管理)您无需设置总内存大小,而是设置许多初始化参数来单独管理 SGA 和实例 PGA 的组件。
如果您使用数据库配置助手 (DBCA) 创建数据库并选择了基本安装选项,则默认启用自动内存管理。
另请参见
-
• 《Oracle AI 数据库性能调优指南》以获取面向 DBA 的内存管理选项的更多信息。 -
• 《Oracle AI 数据库管理员指南》以了解内存管理选项。 -
• 《Oracle AI 数据库参考》以了解初始化参数。
Overview of the System Global Area (SGA)(系统全局区 (SGA) 概述)
SGA 是一个可读/可写的内存区域,与 Oracle 后台进程一起构成数据库实例。
注意:服务器进程和后台进程并不驻留在 SGA 内,而是存在于单独的内存空间中。
代表用户执行的所有服务器进程都可以读取实例 SGA 中的信息。在数据库操作期间,多个进程会写入 SGA。
每个数据库实例都有自己的 SGA。Oracle AI 数据库在实例启动时自动为 SGA 分配内存,并在实例关闭时回收该内存。当您使用 SQL*Plus 或 Oracle Enterprise Manager 启动实例时,SGA 的大小将显示如下例所示:
SQL> STARTUPORACLE instance started.Total SystemGlobal Area 368283648 bytesFixed Size 1300440 bytesVariable Size 343935016 bytesDatabase Buffers 16777216 bytesRedo Buffers 6270976 bytesDatabase mounted.Database opened.
如图 17-1 所示,SGA 由多个内存组件组成,这些组件是用于满足特定类别内存分配请求的内存池。除重做日志缓冲区外,所有 SGA 组件都以称为“区组”(granule)的连续内存为单位分配和释放空间。区组大小取决于平台,并由 SGA 总大小决定。
您可以查询 V$SGASTAT 视图以获取有关 SGA 组件的信息。
最重要的 SGA 组件如下:
-
• Database Buffer Cache(数据库缓冲区高速缓存) -
• In-Memory Area(内存中区域) -
• Redo Log Buffer(重做日志缓冲区) -
• Shared Pool(共享池) -
• Large Pool(大型池) -
• Java Pool(Java 池) -
• Fixed SGA(固定 SGA) -
• Optional Performance-Related SGA Subareas(可选性能相关 SGA 子区域) -
• Database Buffer Cache(数据库缓冲区高速缓存)数据库缓冲区高速缓存,也称为缓冲区高速缓存,是存储从数据文件读取的数据块副本的内存区域。 -
• Redo Log Buffer(重做日志缓冲区)重做日志缓冲区是 SGA 中的一个循环缓冲区,用于存储描述对数据库所做更改的重做条目。 -
• Shared Pool(共享池)共享池缓存各种类型的程序数据。 -
• Large Pool(大型池)大型池是一个可选的内存区域,用于存放对于共享池来说过大的内存分配。 -
• Java Pool(Java 池)Java 池是一个内存区域,用于存储 Java 虚拟机 (JVM) 中所有特定于会话的 Java 代码和数据。此内存包括在调用结束时迁移到 Java 会话空间的 Java 对象。 -
• Fixed SGA(固定 SGA)固定 SGA 是一个内部内务管理区域。 -
• Optional Performance-Related SGA Subareas(可选性能相关 SGA 子区域)一些 SGA 子区域仅为特定的性能特性启用。
另请参见
-
• “Introduction to the Oracle AI Database Instance”(Oracle AI 数据库实例简介) -
• 《Oracle AI 数据库性能调优指南》以了解有关区组大小的更多信息
Database Buffer Cache(数据库缓冲区高速缓存)
数据库缓冲区高速缓存,也称为缓冲区高速缓存,是存储从数据文件读取的数据块副本的内存区域。
缓冲区是一个主内存地址,缓冲区管理器在其中临时缓存当前或最近使用的数据块。同时连接到数据库实例的所有用户共享对缓冲区高速缓存的访问。
-
• Purpose of the Database Buffer Cache(数据库缓冲区高速缓存的目的)Oracle AI 数据库使用缓冲区高速缓存来实现多个目标。 -
• Buffer States(缓冲区状态)数据库使用内部算法来管理高速缓存中的缓冲区。 -
• Buffer Modes(缓冲区模式)当客户端请求数据时,Oracle AI 数据库以当前模式或一致模式从数据库缓冲区高速缓存中检索缓冲区。 -
• Buffer I/O(缓冲区 I/O)逻辑 I/O,也称为缓冲区 I/O,指的是缓冲区高速缓存中缓冲区的读取和写入。 -
• Buffer Pools(缓冲池)缓冲池是缓冲区的集合。 -
• Buffers and Full Table Scans(缓冲区与全表扫描)数据库使用复杂的算法来管理表扫描。默认情况下,当必须从磁盘读取缓冲区时,数据库会将缓冲区插入到 LRU 列表的中间。通过这种方式,热块可以保留在高速缓存中,从而无需再次从磁盘读取。 -
• DRAM and PMEM Buffers(DRAM 和 PMEM 缓冲区)标准 (DRAM) 数据库缓冲区与 PMEM 缓冲区不同,但它们共享一些特性。
Purpose of the Database Buffer Cache(数据库缓冲区高速缓存的目的)
Oracle AI 数据库使用缓冲区高速缓存来实现多个目标。
目标包括:
-
• 优化物理 I/O数据库更新高速缓存中的数据块,并将有关更改的元数据存储在重做日志缓冲区中。执行 COMMIT 后,数据库将重做缓冲区写入联机重做日志,但不会立即将数据块写入数据文件。相反,数据库写入器 (DBW) 进程在后台执行“延迟写入”。 -
• 将频繁访问的块保留在缓冲区高速缓存中,并将不常访问的块写入磁盘当启用数据库智能闪存高速缓存(闪存高速缓存)时,部分缓冲区高速缓存可以驻留在闪存高速缓存中。此缓冲区高速缓存扩展存储在一个或多个闪存设备上。数据库可以通过在闪存中缓存缓冲区而不是从磁盘读取来提高性能。使用 DB_FLASH_CACHE_FILE 和 DB_FLASH_CACHE_SIZE 初始化参数来配置多个闪存设备。缓冲区高速缓存会跟踪每个设备,并将缓冲区均匀分布到这些设备上。 注意:数据库智能闪存高速缓存仅在 Solaris 和 Oracle Linux 上可用。
-
• 管理指向 Oracle 持久性内存文件存储 (PMEM Filestore) 中数据文件的缓冲区头如果启用 PMEM 文件存储,则数据库文件会被映射以实现直接只读访问。查询可以绕过传统的缓冲区高速缓存机制,避免不必要的 I/O。在这种情况下,缓冲区头必须存储与 PMEM 块对应的元数据。数据库仍然可以使用传统的 (DRAM) 缓冲区高速缓存进行修改、读一致性和对“热”数据块的更快访问。
另请参见
-
• “Oracle Persistent Memory Filestore (PMEM Filestore)”(Oracle 持久性内存文件存储 (PMEM 文件存储)) -
• “DRAM and PMEM Buffers”(DRAM 和 PMEM 缓冲区) -
• 《Oracle AI 数据库参考》以了解 DB_FLASH_CACHE_FILE 初始化参数
Buffer States(缓冲区状态)
数据库使用内部算法来管理高速缓存中的缓冲区。
缓冲区可以处于以下任一互斥状态:
-
• Unused(未使用)该缓冲区可供使用,因为它从未被使用过或当前未被使用。这种类型的缓冲区是数据库最容易使用的。 -
• Clean(干净)此缓冲区之前被使用过,现在包含截至某个时间点的块的读一致性版本。该块包含数据,但是“干净”的,因此不需要做检查点。数据库可以钉住并重用该块。 -
• Dirty(脏)该缓冲区包含尚未写入磁盘的已修改数据。数据库必须在重用该块之前对其做检查点。
每个缓冲区都有一个访问模式:钉住或空闲(非钉住)。当一个缓冲区被“钉住”在高速缓存中时,它不会在用户会话访问期间因老化而退出内存。多个会话不能同时修改一个被钉住的缓冲区。
Buffer Modes(缓冲区模式)
当客户端请求数据时,Oracle AI 数据库以当前模式或一致模式从数据库缓冲区高速缓存中检索缓冲区。
两种模式的区别如下:
-
• Current mode(当前模式)当前模式获取,也称为数据库块获取 (db block get),是按块当前在缓冲区高速缓存中显示的样子来检索它。例如,如果一个未提交的事务更新了块中的两行,那么当前模式获取会检索包含这些未提交行的块。数据库最常在修改语句期间使用数据库块获取,因为这些语句必须仅更新块的当前版本。 -
• Consistent mode(一致模式)一致读取获取是检索块的读一致性版本。此检索可能使用还原数据。例如,如果一个未提交的事务更新了块中的两行,而另一个会话中的查询请求该块,那么数据库使用还原数据来创建此块的读一致性版本(称为“一致读取克隆” (consistent read clone)),该版本不包含未提交的更新。通常,查询以一致模式检索块。
另请参见
-
• “Read Consistency and Undo Segments”(读一致性与还原段) -
• 《Oracle AI 数据库参考》以获取有关数据库统计信息的描述,例如 db block get 和 consistent read get
Buffer I/O(缓冲区 I/O)
逻辑 I/O,也称为缓冲区 I/O,指的是缓冲区高速缓存中缓冲区的读取和写入。
当在内存中找不到请求的缓冲区时,数据库会执行物理 I/O,将缓冲区从闪存高速缓存或磁盘复制到内存中。然后,数据库执行逻辑 I/O 来读取已缓存的缓冲区。
-
• Buffer Replacement Algorithms(缓冲区替换算法)为了使缓冲区访问高效,数据库必须决定哪些缓冲区应缓存在内存中,哪些应从磁盘访问。 -
• Buffer Writes(缓冲区写入)数据库写入器 (DBW) 进程定期将冷的、脏的缓冲区写入磁盘。 -
• Buffer Reads(缓冲区读取)当未使用的缓冲区数量很低时,数据库必须从缓冲区高速缓存中移除缓冲区。 -
• Buffer Touch Counts(缓冲区触碰计数)数据库使用触碰计数来衡量 LRU 列表上缓冲区的访问频率。此机制使数据库能够在缓冲区被钉住时递增一个计数器,而不是不断在 LRU 列表上移动缓冲区。
Buffer Replacement Algorithms(缓冲区替换算法)
为了使缓冲区访问高效,数据库必须决定哪些缓冲区应缓存在内存中,哪些应从磁盘访问。
数据库使用以下算法:
-
• LRU-based, block-level replacement algorithm(基于 LRU 的块级替换算法)此复杂算法是默认算法,它使用一个最近最少使用 (LRU) 列表,其中包含指向脏缓冲区和干净缓冲区的指针。LRU 列表有一个热端和一个冷端。冷缓冲区是最近未使用过的缓冲区。热缓冲区是频繁访问且最近使用过的缓冲区。从概念上讲,只有一个 LRU,但为了数据并发性,数据库实际上使用了多个 LRU。 -
• Temperature-based, object-level replacement algorithm(基于温度的对象级替换算法)从 Oracle 数据库 12c 第 1 版 (12.1.0.2) 开始,自动大表缓存特性使表扫描能够在以下场景中使用不同的算法: 当表无法放入内存时,数据库会根据访问模式决定缓存哪些缓冲区。例如,如果一个流行表只有 95% 能放入内存,那么数据库可能会选择将 5% 的块留在磁盘上,而不是循环地将块读入内存并将块写入磁盘——这种现象称为“抖动”(thrashing)。当缓存多个大对象时,数据库会认为更流行的表更热,不太流行的表更冷,这会影响哪些块被缓存。DB_BIG_TABLE_CACHE_PERCENT_TARGET 初始化参数设置使用此算法的缓冲区高速缓存的百分比。
注意:本文档解释基于 LRU 的块级替换算法。
-
• 并行查询在单实例和 Oracle 真正应用集群 (Oracle RAC) 数据库中,当 DB_BIG_TABLE_CACHE_PERCENT_TARGET 初始化参数设置为非零值,并且 PARALLEL_DEGREE_POLICY 设置为 auto 或 adaptive 时,并行查询可以使用大表缓存。 -
• 串行查询仅在单实例配置中,当 DB_BIG_TABLE_CACHE_PERCENT_TARGET 初始化参数设置为非零值时,串行查询可以使用大表缓存。
另请参见《Oracle AI 数据库 VLDB 和分区指南》以了解有关基于温度的算法的更多信息
Buffer Writes(缓冲区写入)
数据库写入器 (DBW) 进程定期将冷的、脏的缓冲区写入磁盘。
DBW 在以下情况下写入缓冲区:
-
• 服务器进程找不到干净的缓冲区来将新块读入数据库缓冲区高速缓存。随着缓冲区变脏,空闲缓冲区的数量会减少。如果数量降至内部阈值以下,并且需要干净的缓冲区,那么服务器进程会通知 DBW 进行写入。数据库使用 LRU 来确定要写入哪些脏缓冲区。当脏缓冲区到达 LRU 的冷端时,数据库会将它们从 LRU 移到写入队列。DBW 将队列中的缓冲区写入磁盘,如果可能,会使用多块写入。此机制可防止 LRU 的末端被脏缓冲区堵塞,并允许找到干净的缓冲区以供重用。 -
• 数据库必须推进检查点,即重做线程中实例恢复必须开始的位置。 -
• 表空间被更改为只读状态或脱机。
另请参见
-
• “Database Writer Process (DBW)”(数据库写入器进程 (DBW)) -
• 《Oracle AI 数据库性能调优指南》以了解如何诊断和调优缓冲区写入问题
Buffer Reads(缓冲区读取)
当未使用的缓冲区数量很低时,数据库必须从缓冲区高速缓存中移除缓冲区。
算法取决于是否启用了闪存高速缓存:
-
• Flash cache disabled(闪存高速缓存已禁用)数据库根据需要重用每个干净缓冲区并覆盖它。如果稍后需要被覆盖的缓冲区,那么数据库必须从磁盘读取它。 -
• Flash cache enabled(闪存高速缓存已启用)DBW 可以将干净缓冲区的主体写入闪存高速缓存,从而允许重用其在内存中的缓冲区。数据库将缓冲区头保留在主内存的 LRU 列表中,以跟踪缓冲区主体在闪存高速缓存中的状态和位置。如果稍后需要此缓冲区,那么数据库可以从闪存高速缓存而不是从磁盘读取它。
当客户端进程请求缓冲区时,服务器进程会在缓冲区高速缓存中搜索该缓冲区。如果数据库在内存中找到了缓冲区,则发生高速缓存命中。搜索顺序如下:
-
1. 服务器进程在缓冲区高速缓存中搜索整个缓冲区。如果进程找到了整个缓冲区,那么数据库对此缓冲区执行逻辑读取。 -
2. 服务器进程在闪存高速缓存的 LRU 列表中搜索缓冲区头。如果进程找到了缓冲区头,那么数据库执行优化的物理读取,将缓冲区主体从闪存高速缓存读入内存高速缓存。 -
3. 如果进程在内存中未找到缓冲区(高速缓存未命中),那么服务器进程执行以下步骤:a. 将块从数据文件(在磁盘上)复制到内存中(物理读取)b. 对读入内存的缓冲区执行逻辑读取
图 17-2 说明了缓冲区的搜索顺序。扩展缓冲区高速缓存包括内存中的缓冲区高速缓存(包含完整缓冲区)和闪存高速缓存(包含缓冲区主体)。在该图中,数据库在缓冲区高速缓存中搜索一个缓冲区,未找到后,将其从磁盘读入内存。
Figure 17-2 Buffer Search(图17-2 缓冲区搜索)

通常,通过高速缓存命中访问数据比通过高速缓存未命中更快。缓冲区高速缓存命中率衡量数据库在缓冲区高速缓存中找到请求的块而无需从磁盘读取的频率。
数据库可以从数据文件或临时文件执行物理读取。从数据文件读取后进行逻辑 I/O。从临时文件读取发生在内存不足迫使数据库将数据写入临时表并随后读回时。这些物理读取绕过缓冲区高速缓存,并且不会产生逻辑 I/O。
另请参见《Oracle AI 数据库性能调优指南》以了解如何计算缓冲区高速缓存命中率
Buffer Touch Counts(缓冲区触碰计数)
数据库使用触碰计数来衡量 LRU 列表上缓冲区的访问频率。此机制使数据库能够在缓冲区被钉住时递增一个计数器,而不是不断在 LRU 列表上移动缓冲区。
注意:数据库不会物理地移动内存中的块。移动是指针在列表上位置的更改。
当缓冲区被钉住时,数据库会确定其触碰计数上次递增的时间。如果计数是在三秒前递增的,则计数会递增;否则,计数保持不变。三秒规则防止对缓冲区的突发钉住计为多次触碰。例如,一个会话可能会在一个数据块中插入多行,但数据库会将这些插入视为一次触碰。
如果缓冲区位于 LRU 的冷端,但其触碰计数很高,则该缓冲区将移至热端。如果触碰计数低,则缓冲区会因老化而退出高速缓存。
Buffer Pools(缓冲池)
缓冲池是缓冲区的集合。
数据库缓冲区高速缓存被划分为一个或多个缓冲池,它们以大致相同的方式管理块。这些池在用于老化或缓存块的算法上没有根本区别。
您可以手动配置单独的缓冲池,这些缓冲池要么将数据保留在缓冲区高速缓存中,要么在使用数据块后立即使缓冲区可用于新数据。然后,您可以将特定的模式对象分配给适当的缓冲池,以控制块如何因老化退出高速缓存。例如,您可以将段隔离到热、暖和冷缓冲池中。
可能的缓冲池如下:
-
• Default pool(默认池)此池是通常缓存块的位置。除非您手动配置了单独的池,否则默认池是唯一的缓冲池。其他池的可选配置对默认池没有影响。大表缓存是默认池中的一个可选部分,它使用基于温度的对象级替换算法。在单实例和 Oracle RAC 数据库中,当 DB_BIG_TABLE_CACHE_PERCENT_TARGET 初始化参数设置为非零值,并且 PARALLEL_DEGREE_POLICY 设置为 auto 或 adaptive 时,并行查询可以使用大表缓存。仅在单实例配置中,当 DB_BIG_TABLE_CACHE_PERCENT_TARGET 设置时,串行查询可以使用大表缓存。 -
• Keep pool(保留池)此池用于那些曾被频繁访问但因空间不足而从默认池中老化退出的块。保留缓冲池的目的是将对象保留在内存中,从而避免 I/O 操作。 注意:保留池管理缓冲区的方式与其他池相同:它不使用特殊算法来钉住缓冲区。单词“keep”是一种命名约定。您可以将希望保留的表放在较大的保留池中,将不希望保留的表放在较小的回收池中。
-
• Recycle pool(回收池)此池用于不常使用的块。回收池防止对象占用高速缓存中不必要的空间。
数据库具有标准块大小。您可以创建块大小与标准大小不同的表空间。每个非默认块大小都有自己的池。Oracle AI 数据库以与默认池相同的方式管理这些池中的块。
下图显示了使用多个池时缓冲区高速缓存的结构。高速缓存包含默认池、保留池和回收池。默认块大小为 8 KB。高速缓存为使用非标准块大小(2 KB、4 KB 和 16 KB)的表空间包含单独的池。
Figure 17-3 Database Buffer Cache(图17-3 数据库缓冲区高速缓存)

另请参见
-
• “Database Block Size”(数据库块大小) -
• 《Oracle AI 数据库管理员指南》以了解有关缓冲池的更多信息 -
• 《Oracle AI 数据库性能调优指南》以了解如何使用多个缓冲池 -
• 《Oracle AI 数据库参考》以了解 DB_BIG_TABLE_CACHE_PERCENT_TARGET 初始化参数
Buffers and Full Table Scans(缓冲区与全表扫描)
数据库使用复杂的算法来管理表扫描。默认情况下,当必须从磁盘读取缓冲区时,数据库会将缓冲区插入到 LRU 列表的中间。通过这种方式,热块可以保留在高速缓存中,从而无需再次从磁盘读取。
全表扫描会带来一个问题,它会顺序读取表高水位标记 (HWM) 下的所有行。假设表段中块的总大小大于缓冲区高速缓存的大小。对此表的全扫描可能会清空缓冲区高速缓存,使数据库无法维护频繁访问块的缓存。
-
• Default Mode for Full Table Scans(全表扫描的默认模式)默认情况下,数据库对全表扫描采取保守方法,仅当表大小占缓冲区高速缓存的较小百分比时,才将小表加载到内存中。 -
• Parallel Query Execution(并行查询执行)当执行全表扫描时,数据库有时可以通过使用多个并行执行服务器来缩短响应时间。 -
• CACHE Attribute(CACHE 属性)在极少数不希望使用默认缓存行为的情况下,您可以使用 ALTER TABLE … CACHE 来更改大表的块如何读入数据库缓冲区高速缓存。 -
• KEEP Attribute(KEEP 属性)对于大表,您可以使用 ALTER TABLE … STORAGE BUFFER_POOL KEEP 来使扫描将这些表的块加载到保留池中。 -
• Force Full Database Caching Mode(强制全数据库缓存模式)为了提高某些情况下的性能,您可以显式执行 ALTER DATABASE … FORCE FULL DATABASE CACHING 语句来启用强制全数据库缓存模式。
另请参见“Segment Space and the High Water Mark”(段空间与高水位标记)
Default Mode for Full Table Scans(全表扫描的默认模式)
默认情况下,数据库对全表扫描采取保守方法,仅当表大小占缓冲区高速缓存的较小百分比时,才将小表加载到内存中。
为了确定是否应缓存中型表,数据库使用一种算法,该算法综合考虑了上次表扫描的时间间隔、缓冲区高速缓存的老化时间戳以及缓冲区高速缓存中的剩余空间。
对于非常大的表,数据库通常会使用直接路径读取,将块直接加载到 PGA 中并完全绕过 SGA,以避免填充缓冲区高速缓存。对于中型表,数据库可能会使用直接读取或缓存读取。如果决定使用缓存读取,那么数据库会将块放置在 LRU 列表的末端,以防止扫描有效地清空缓冲区高速缓存。
从 Oracle 数据库 12c 第 1 版 (12.1.0.2) 开始,数据库实例的缓冲区高速缓存会自动执行内部计算,以确定内存是否足够将数据库完全缓存在实例 SGA 中,以及在访问时缓存表是否有益于性能。如果整个数据库可以完全放入内存,并且满足各种其他内部条件,那么 Oracle AI 数据库会将数据库中的所有表视为小表,并认为它们有资格被缓存。但是,数据库不会缓存标记有 NOCACHE 属性的 LOB。
Parallel Query Execution(并行查询执行)
当执行全表扫描时,数据库有时可以通过使用多个并行执行服务器来缩短响应时间。
在某些情况下,比如当数据库有大量内存时,数据库可以将并行查询数据缓存在系统全局区 (SGA) 中,而不是使用直接路径读取进入程序全局区 (PGA)。通常,由于潜在的资源使用,并行查询发生在低并发的数据仓库中。
另请参见
-
• 《Oracle AI 数据库数据仓库指南》以获取数据仓库的介绍 -
• 《Oracle AI 数据库 VLDB 和分区指南》以了解有关并行执行的更多信息
CACHE Attribute(CACHE 属性)
在极少数不希望使用默认缓存行为的情况下,您可以使用 ALTER TABLE … CACHE 来更改大表的块如何读入数据库缓冲区高速缓存。
对于设置了 CACHE 属性的表,数据库不会强制或钉住缓冲区高速缓存中的块。相反,数据库以与任何其他表块相同的方式使块老化退出高速缓存。使用此选项时要小心,因为对大表进行全扫描可能会清除高速缓存中的大多数其他块。
注意:执行
ALTER TABLE ... CACHE并不会导致表被缓存。
KEEP Attribute(KEEP 属性)
对于大表,您可以使用 ALTER TABLE … STORAGE BUFFER_POOL KEEP 来使扫描将这些表的块加载到保留池中。
将表放入保留池会更改存储块的缓冲区高速缓存部分。数据库将块缓存在保留缓冲池中,而不是默认缓冲池中。没有单独的算法控制保留池的缓存。
另请参见
-
• 《Oracle AI 数据库 SQL 语言参考》以获取有关 CACHE 子句和 KEEP 属性的信息 -
• 《Oracle AI 数据库性能调优指南》以了解如何解释缓冲区高速缓存建议统计信息
Force Full Database Caching Mode(强制全数据库缓存模式)
为了提高某些情况下的性能,您可以显式执行 ALTER DATABASE … FORCE FULL DATABASE CACHING 语句来启用强制全数据库缓存模式。
与默认的自动模式相反,强制全数据库缓存模式将整个数据库,包括 NOCACHE LOB,都视为有资格缓存在数据库缓冲区高速缓存中。此模式从 Oracle 数据库 12c 第 1 版 (12.1.0.2) 开始可用。
注意:启用强制全数据库缓存模式并不会强制将数据库放入内存。而是使整个数据库有资格缓存在缓冲区高速缓存中。Oracle AI 数据库仅在访问表时才缓存它们。
Oracle 建议仅当每个单独实例的缓冲区高速缓存大小大于数据库大小时,才启用强制全数据库缓存模式。此准则适用于单实例和 Oracle RAC 数据库。但是,当 Oracle RAC 应用程序分区良好时,如果所有实例的组合缓冲区高速缓存大小(加上处理实例间重复缓存块的额外空间)大于数据库大小,则可以启用强制全数据库缓存模式。
另请参见
-
• 《Oracle AI 数据库管理员指南》以了解如何启用强制全数据库缓存模式 -
• 《Oracle AI 数据库 SQL 语言参考》以获取有关 ALTER DATABASE … FORCE FULL DATABASE CACHING 语句的更多信息
DRAM and PMEM Buffers(DRAM 和 PMEM 缓冲区)
标准 (DRAM) 数据库缓冲区与 PMEM 缓冲区不同,但它们共享一些特性。
当配置了 Oracle 持久性内存文件存储 (PMEM Filestore) 时,每个数据块都直接映射到 DRAM 中的缓冲区高速缓存。与 DRAM 缓冲区不同,PMEM 缓冲区不复制数据块的内容。相反,PMEM 缓冲区头指向存储在 PMEM 文件存储中的数据块。对于大多数读取,数据库仅缓存块元数据,而不是内容。PMEM 缓冲区使用一种特殊类型的区组,其结构与标准缓冲区高速缓存区组不同。
注意:初始化参数 DB_CACHE_SIZE 指定 DRAM 高速缓存的最小大小。PMEM 元数据开销不包含在此分配中。
PMEM 缓冲区可以处于以下任一状态:
-
• Current(当前)这是 PMEM 缓冲区的当前版本。可以直接从文件存储访问它。Oracle AI 数据库将 PMEM 当前版本与标准 DRAM 缓冲区当前版本分开保存。这种分离有助于降低 PMEM 块钉住、清理和迁移到 DRAM 期间的代码复杂性。 -
• Consistent(一致)这是 PMEM 缓冲区的一致读取版本。它是在数据库于 DRAM 中创建克隆后创建的。可以直接从文件存储访问 PMEM 缓冲区。 -
• Free(空闲)这是空闲的 PMEM 缓冲区。它可以被 PMEM 块重用。在实例启动后,所有 PMEM 缓冲区都处于空闲状态。
PMEM 的延迟比 DRAM 高。Oracle AI 数据库使用内部基于工作负载的算法来决定将哪些块从 PMEM 迁移到 DRAM。
另请参见
-
• “Oracle Persistent Memory Filestore (PMEM Filestore)”(Oracle 持久性内存文件存储 (PMEM 文件存储)) -
• 《Oracle AI 数据库管理员指南》以了解如何设置 PMEM 文件存储
Redo Log Buffer(重做日志缓冲区)
重做日志缓冲区是 SGA 中的一个循环缓冲区,用于存储描述对数据库所做更改的重做条目。
重做记录是一种数据结构,包含重构(或重做)DML 或 DDL 操作对数据库所做更改所需的信息。数据库恢复将重做条目应用于数据文件以重建丢失的更改。
数据库进程将重做条目从用户内存空间复制到 SGA 中的重做日志缓冲区。重做条目在缓冲区中占用连续、顺序的空间。后台进程日志写入器进程 (LGWR) 将重做日志缓冲区写入磁盘上的活动联机重做日志组。图 17-4 显示了此重做缓冲区活动。
Figure 17-4 Redo Log Buffer(图17-4 重做日志缓冲区)
LGWR 将重做顺序写入磁盘,而 DBW 执行数据块的分散写入磁盘。分散写入往往比顺序写入慢得多。因为 LGWR 使用户能够避免等待 DBW 完成其缓慢的写入,所以数据库提供了更好的性能。

LOG_BUFFER 初始化参数指定 Oracle AI 数据库在缓冲重做条目时使用的内存量。与其他 SGA 组件不同,重做日志缓冲区和固定 SGA 缓冲区不将内存划分为区组。
另请参见
-
• “Log Writer Process (LGWR)”(日志写入器进程 (LGWR))和 “Importance of Checkpoints for Instance Recovery”(检查点对实例恢复的重要性) -
• 《Oracle AI 数据库管理员指南》以获取有关联机重做日志的信息
Shared Pool(共享池)
共享池缓存各种类型的程序数据。
例如,共享池存储已解析的 SQL、PL/SQL 代码、系统参数和数据字典信息。共享池几乎参与了数据库中发生的所有操作。例如,如果用户执行一条 SQL 语句,那么 Oracle AI 数据库会访问共享池。
共享池被划分为多个子组件,其中最重要的如图 17-5 所示。
Figure 17-5 Shared Pool(图17-5 共享池)

本节包含以下主题:
-
• Library Cache(库高速缓存) -
• Data Dictionary Cache(数据字典高速缓存) -
• Server Result Cache(服务器结果高速缓存) -
• Reserved Pool(保留池) -
• Library Cache(库高速缓存)库高速缓存是一个共享池内存结构,用于存储可执行的 SQL 和 PL/SQL 代码。 -
• Data Dictionary Cache(数据字典高速缓存)数据字典是数据库表和视图的集合,包含有关数据库、其结构和用户的参考信息。 -
• Server Result Cache(服务器结果高速缓存)服务器结果高速缓存是共享池中的一个内存池。与缓冲池不同,服务器结果高速缓存保存的是结果集,而不是数据块。 -
• Reserved Pool(保留池)保留池是共享池中的一个内存区域,Oracle AI 数据库可以使用它来分配大的连续内存块。
Library Cache(库高速缓存)
库高速缓存是一个共享池内存结构,用于存储可执行的 SQL 和 PL/SQL 代码。
此高速缓存包含共享 SQL 和 PL/SQL 区以及控制结构,例如锁和库高速缓存句柄。在共享服务器架构中,库高速缓存还包含私有 SQL 区。
当执行一条 SQL 语句时,数据库会尝试重用先前执行的代码。如果库高速缓存中存在该 SQL 语句的已解析表示,并且可以共享,那么数据库会重用该代码,这称为软解析或库高速缓存命中。否则,数据库必须构建应用程序代码的新可执行版本,这称为硬解析或库高速缓存未命中。
-
• Shared SQL Areas(共享 SQL 区)数据库为其运行的每条 SQL 语句在共享 SQL 区和私有 SQL 区中进行表示。 -
• Program Units and the Library Cache(程序单元与库高速缓存)库高速缓存保存 PL/SQL 程序和 Java 类的可执行形式。这些项目统称为程序单元。 -
• Allocation and Reuse of Memory in the Shared Pool(共享池中内存的分配与重用)当解析新的 SQL 语句时,数据库会分配共享池内存,除非该语句是 DDL,DDL 不被认为是可共享的。分配的内存大小取决于语句的复杂性。
Shared SQL Areas(共享 SQL 区)
数据库为其运行的每条 SQL 语句在共享 SQL 区和私有 SQL 区中进行表示。
数据库使用共享 SQL 区来处理 SQL 语句的首次出现。此区域对所有用户可访问,并包含语句解析树和执行计划。对于一条唯一的语句,只存在一个共享 SQL 区。发出 SQL 语句的每个会话在其 PGA 中都有一个私有 SQL 区。每个提交相同语句的用户都有一个指向相同共享 SQL 区的私有 SQL 区。因此,位于单独 PGA 中的许多私有 SQL 区可以与同一个共享 SQL 区关联。
数据库会自动确定应用程序何时提交相似的 SQL 语句。数据库既考虑用户和应用程序直接发出的 SQL 语句,也考虑其他语句内部发出的递归 SQL 语句。
数据库执行以下步骤:
-
1. 检查共享池,以查看是否存在语法和语义上相同的语句的共享 SQL 区: 无论哪种情况,用户的私有 SQL 区都指向包含语句和执行计划的共享 SQL 区。
-
• 如果存在相同的语句,那么数据库将共享 SQL 区用于该语句后续新实例的执行,从而减少内存消耗。 -
• 如果不存在相同的语句,那么数据库会在共享池中分配一个新的共享 SQL 区。语法相同但语义不同的语句使用子游标。 -
2. 代表会话分配一个私有 SQL 区私有 SQL 区的位置取决于为会话建立的连接。如果会话通过共享服务器连接,则部分私有 SQL 区保留在 SGA 中。
图 17-6 显示了一个专有服务器架构,其中两个会话在其各自的 PGA 中保留了相同 SQL 语句的副本。在共享服务器中,此副本位于 UGA 中,而 UGA 位于大型池中,或者在不存在大型池时位于共享池中。
Figure 17-6 Private SQL Areas and Shared SQL Area(图17-6 私有 SQL 区与共享 SQL 区)

另请参见
-
• “Private SQL Area”(私有 SQL 区) -
• 《Oracle AI 数据库性能调优指南》以了解有关管理库高速缓存的更多信息 -
• 《Oracle AI 数据库开发指南》以获取有关共享 SQL 的更多信息
Program Units and the Library Cache(程序单元与库高速缓存)
库高速缓存保存 PL/SQL 程序和 Java 类的可执行形式。这些项目统称为程序单元。
数据库处理程序单元的方式与 SQL 语句类似。例如,数据库分配一个共享区来保存 PL/SQL 程序的已解析、已编译形式。数据库分配一个私有区来保存特定于运行该程序的会话的值,包括局部变量、全局变量、包变量以及用于执行 SQL 的缓冲区。如果多个用户运行相同的程序,那么每个用户都维护其私有 SQL 区的单独副本,该副本保存特定于会话的值,并访问单个共享 SQL 区。
数据库按照先前描述的方式处理 PL/SQL 程序单元内的各个 SQL 语句。尽管这些 SQL 语句源自 PL/SQL 程序单元,但它们使用共享区来保存其已解析的表示,并为运行该语句的每个会话使用私有区。
Allocation and Reuse of Memory in the Shared Pool(共享池中内存的分配与重用)
当解析新的 SQL 语句时,数据库会分配共享池内存,除非该语句是 DDL,DDL 不被认为是可共享的。分配的内存大小取决于语句的复杂性。
通常,共享池中的项目会一直保留,直到数据库根据最近最少使用 (LRU) 算法将其移除。数据库允许许多会话使用的共享池项目只要有用就保留在内存中,即使创建该项目的数据库进程已终止。此机制最大限度地减少了 SQL 语句的开销和处理。如果需要为新项目腾出空间,那么数据库会释放不经常使用的项目所占用的内存。
ALTER SYSTEM FLUSH SHARED_POOL 语句会移除共享池中的所有信息,更改全局数据库名称也会如此。
另请参见
-
• 《Oracle AI 数据库 SQL 调优指南》以获取共享 SQL 区生命周期的概述 -
• 《Oracle AI 数据库 SQL 语言参考》以获取有关使用 ALTER SYSTEM FLUSH SHARED_POOL 的信息 -
• 《Oracle AI 数据库参考》以获取有关 VSQLAREA 动态视图的信息
Data Dictionary Cache(数据字典高速缓存)
数据字典是数据库表和视图的集合,包含有关数据库、其结构和用户的参考信息。
Oracle AI 数据库在 SQL 语句解析期间频繁访问数据字典。Oracle AI 数据库对数据字典的访问非常频繁,以至于指定了以下特殊内存位置来保存字典数据:
-
• Data dictionary cache(数据字典高速缓存)此高速缓存保存有关数据库对象的信息。此高速缓存也称为行高速缓存,因为它以行而非缓冲区的形式存储数据。 -
• Library cache(库高速缓存)所有服务器进程共享这些高速缓存以访问数据字典信息。
另请参见
-
• “Data Dictionary and Dynamic Performance Views”(数据字典与动态性能视图) -
• 《Oracle AI 数据库性能调优指南》以了解如何为数据字典高速缓存分配额外内存
Server Result Cache(服务器结果高速缓存)
服务器结果高速缓存是共享池中的一个内存池。与缓冲池不同,服务器结果高速缓存保存的是结果集,而不是数据块。
注意:客户端结果高速缓存与服务器结果高速缓存不同。客户端高速缓存在应用程序级别配置,位于客户端内存中,而不是数据库内存中。
-
• SQL Query Result Cache(SQL 查询结果高速缓存)SQL 查询结果高速缓存是服务器结果高速缓存的一个子集,用于存储查询和查询片段的结果。您可以在数据库或语句级别启用或禁用结果缓存。 -
• PL/SQL Function Result Cache(PL/SQL 函数结果高速缓存)PL/SQL 函数结果高速缓存是服务器结果高速缓存的一个子集,用于存储函数结果集。 -
• Server Result Cache Infrastructure(服务器结果高速缓存基础设施)查询结果高速缓存和 PL/SQL 函数结果高速缓存共享相同的基础设施。 -
• Server Result Cache User Interface(服务器结果高速缓存用户界面)RESULT_CACHE_MODE 初始化参数确定 SQL 查询结果高速缓存是用于所有可能的查询,还是仅用于带提示的查询。
SQL Query Result Cache(SQL 查询结果高速缓存)
SQL 查询结果高速缓存是服务器结果高速缓存的一个子集,用于存储查询和查询片段的结果。您可以在数据库或语句级别启用或禁用结果缓存。
当执行查询时,数据库会确定结果是否存在于查询结果高速缓存中。如果结果未被缓存,并且如果为该查询启用了缓存,那么数据库会运行查询,返回结果,然后将其缓存。然而,如果结果存在,那么数据库会从高速缓存中检索结果,而不是执行查询。
每当事务修改用于构造结果的数据库对象的数据或元数据时,数据库就会自动使缓存结果失效。下一个查询无法使用缓存结果,因此数据库会自动计算新结果,然后将其缓存以供后续查询使用。高速缓存刷新过程对应用程序是透明的。
实际上,查询结果高速缓存的功能就像一个“即时”物化视图,数据库根据需要创建和维护它。该高速缓存使数据库能够避免重新读取数据块和重新计算结果这一昂贵的操作。大多数应用程序都能从这种性能改进中受益。
另请参见《Oracle AI 数据库管理员指南》以了解如何使用查询结果高速缓存优化响应时间
PL/SQL Function Result Cache(PL/SQL 函数结果高速缓存)
PL/SQL 函数结果高速缓存是服务器结果高速缓存的一个子集,用于存储函数结果集。
如果不使用高速缓存,以每次调用 1 秒的速度调用 PL/SQL 函数 1000 次,将花费 1000 秒。使用高速缓存后,具有相同输入的 1000 次函数调用总共可能只需要 1 秒。结果缓存的良好候选对象是频繁调用且依赖于相对静态数据的函数。
PL/SQL 函数代码可以包含一个请求,要求缓存其结果。调用此函数时,系统会检查高速缓存。如果高速缓存中包含先前使用相同参数值调用函数的结果,那么系统会将结果返回给调用者,而不会重新执行函数体。如果高速缓存中不包含该结果,那么系统会执行函数体,并在将控制权返回给调用者之前,将结果(针对这些参数值)添加到高速缓存中。
注意:您可以指定用于计算缓存结果的数据库对象,这样,如果其中任何一个对象被更新,缓存结果就会失效,并且必须重新计算。
一个频繁用不同参数调用的函数可能会产生很少被重用的结果,从而导致性能下降。Oracle AI 数据库会跟踪最近使用的、带有 RESULT_CACHE 提示的 PL/SQL 函数。利用此历史记录,数据库仅在最近历史记录中已出现 x 次时,才缓存某个 PL/SQL 函数和参数对,其中 x 由内部阈值设定。如果由于缓存了太多结果而需要更多内存,那么一个或多个缓存结果将因老化而退出。
RESULT_CACHE_EXECUTION_THRESHOLD 指定一个函数和一组特定参数必须被看到多少次才会被缓存。请注意,如果函数具有不同的参数,则它们被视为唯一,例如,MYFUNC(1,2) 和 MYFUNC(1,3)。您只能在系统级别设置此参数,而不能在会话级别设置。
另请参见
-
• 《Oracle AI 数据库开发指南》以了解有关 PL/SQL 函数结果高速缓存的更多信息 -
• 《Oracle AI 数据库 PL/SQL 语言参考》以了解有关 PL/SQL 函数结果高速缓存的更多信息
Server Result Cache Infrastructure(服务器结果高速缓存基础设施)
查询结果高速缓存和 PL/SQL 函数结果高速缓存共享相同的基础设施。
Object Types: Result, Dependency, and Temp(对象类型:结果、依赖和临时)
在服务器结果高速缓存中,结果对象是存储查询或 PL/SQL 函数返回的行的数据结构。依赖对象存储被引用对象(这些对象被以结果对象形式存储的查询所引用)的元数据。
典型的查询结果较小、计算成本高、经常重用,并且基于非易失性表。然而,结果有时可能很大。如果查询结果超过大小限制,那么数据库会将部分结果存储为临时对象,部分存储为标准结果对象。临时对象是结果高速缓存元数据的集合,指向保存实际查询结果的临时表空间段。
Result Subcaches(结果子高速缓存)
根据工作负载,数据库可能会创建结果子高速缓存,以在读写访问期间支持更高的并发性。Oracle AI 数据库使用内部算法来决定是否创建子高速缓存,以及如果创建,创建多少个。
Server Result Cache User Interface(服务器结果高速缓存用户界面)
RESULT_CACHE_MODE 初始化参数确定 SQL 查询结果高速缓存是用于所有可能的查询,还是仅用于带提示的查询。
RESULT_CACHE_MAX_TEMP_SIZE 初始化参数控制结果高速缓存在 PDB 中可以消耗的临时表空间内存的最大量。
RESULT_CACHE_MAX_TEMP_RESULT 控制一个缓存查询可以消耗的临时表空间内存的最大量。
要覆盖 RESULT_CACHE_MODE 参数设置,您可以使用 RESULT_CACHE 提示注解查询或查询片段。从 Oracle 数据库 21c 开始,该提示接受选项 TEMP={TRUE|FALSE},它控制结果是否可以存储在临时表空间中。
DBMS_RESULT_CACHE 包使您能够管理共享池中由 SQL 结果高速缓存和 PL/SQL 函数结果高速缓存使用的部分。您可以废弃对象、将查询和对象列入黑名单,并执行相关操作。
VRESULT_SUBCACHE_STATISTICS 和相关视图访问子高速缓存元数据。
另请参见
-
• 《Oracle AI 数据库管理员指南》以了解如何调整结果高速缓存的大小和控制其行为 -
• 《Oracle AI 数据库 PL/SQL 包和类型参考》以获取有关 DBMS_RESULT_CACHE 包的信息 -
• 《Oracle AI 数据库性能调优指南》以获取有关客户端结果高速缓存的更多信息 -
• 《Oracle AI 数据库参考》以了解有关 RESULT_CACHE_MODE 初始化参数的更多信息 -
• 《Oracle AI 数据库 SQL 语言参考》以了解 RESULT_CACHE 提示
Reserved Pool(保留池)
保留池是共享池中的一个内存区域,Oracle AI 数据库可以使用它来分配大的连续内存块。
数据库从共享池中以块(chunk)的形式分配内存。分块允许将大对象(超过 5 KB)加载到高速缓存中,而无需单个连续区域。通过这种方式,数据库减少了因碎片化而耗尽连续内存的可能性。
不常见的是,Java、PL/SQL 或 SQL 游标可能会从共享池中分配大于 5 KB 的内存。为了最有效地进行这些分配,数据库从共享池中划分出一小部分作为保留池。
另请参见《Oracle AI 数据库性能调优指南》以了解如何配置保留池
Large Pool(大型池)
大型池是一个可选的内存区域,用于存放对于共享池来说过大的内存分配。
大型池可以为以下各项提供大内存分配:
-
• 用于共享服务器和 Oracle XA 接口(用于事务与多个数据库交互的场景)的 UGA -
• 并行执行中使用的消息缓冲区 -
• 用于 Recovery Manager (RMAN) I/O 子进程的缓冲区 -
• 用于延迟插入(使用 MEMOPTIMIZE_WRITE 提示的插入)的缓冲区
下图描绘了大型池。
Figure 17-7 Large Pool(图17-7 大型池)

-
• Large Pool Memory Management(大型池内存管理)大型池管理内存的方式与共享池不同,共享池使用 LRU 列表,以便部分内存可以老化退出。 -
• Large Pool Buffers for Deferred Inserts(用于延迟插入的大型池缓冲区)对于一种称为延迟插入的特殊插入类型,数据库从大型池分配缓冲区。
另请参见
-
• “Query Coordinator”(查询协调器)以获取有关为并行执行分配内存的信息 -
• “Dispatcher Request and Response Queues”(调度器请求和响应队列)以了解如何为共享服务器分配会话内存 -
• 《Oracle AI 数据库开发指南》以了解 Oracle XA -
• 《Oracle AI 数据库性能调优指南》以获取有关大型池的更多信息
Large Pool Memory Management(大型池内存管理)
大型池管理内存的方式与共享池不同,共享池使用 LRU 列表,以便部分内存可以老化退出。
大型池没有 LRU 列表。当数据库将大型池内存分配给数据库会话时,除非该会话释放,否则此内存不符合释放条件。一旦一部分内存被释放,其他进程就可以使用它。通过从大型池分配会话内存,数据库避免了共享池中可能发生的碎片化。
Large Pool Buffers for Deferred Inserts(用于延迟插入的大型池缓冲区)
对于一种称为延迟插入的特殊插入类型,数据库从大型池分配缓冲区。
对于来自物联网 (IoT) 应用程序的快速“即发即忘”插入,数据库基础设施会产生性能开销。例如,代码路径包括缓冲区高速缓存导航、缓冲区钉住和并发保护。数组插入可以最大限度地降低这些成本,但必须在客户端构建数组,这对于物联网应用程序来说并不典型。为了解决这个问题,Oracle 应用程序可以使用提示将行插入到指定为 MEMOPTIMIZE FOR WRITE 的表中。
这些插入是延迟的,因为它们被缓冲在大型池中,然后稍后由后台进程异步写入磁盘。数据库按如下方式处理延迟插入:
-
1. 应用程序将 MEMOPTIMIZE_WRITE 插入发送到中间层,中间层可以聚合数据。虽然物联网应用程序几乎总是将插入发送到中间层,但也可以将插入直接发送到数据库。例如,使用 SQL*Plus 会将插入直接发送到数据库。 -
2. 中间层将聚合的插入写入数据库服务器。 -
3. 可选地,中间层客户端保留上一步写入数据的本地副本。 -
4. 一个服务器进程将数据写入大型池中的一个或多个缓冲区。为了避免争用,每个缓冲区都有自己的内部锁定机制。该锁定机制独立于数据库缓冲区高速缓存为其缓冲区使用的锁定机制。基本写入过程如下:a. 实例启动后,第一个 MEMOPTIMIZE_WRITE 插入从大型池分配缓冲区。b. 写入器从可用缓冲区列表中选择一个缓冲区。c. 如果所选缓冲区未被锁定,并且如果该缓冲区有可用空间,那么客户端写入该缓冲区,并用特定于会话的序列号标记每次缓冲区写入。如果不是,那么写入器返回上一步,并以这种方式继续,直到找到缓冲区或在大型池中释放了足够的空间。 -
5. 数据库根据缓冲数据创建服务器端数组。 -
6. 空间管理协调器 (SMCO) 及其辅助进程 (Wnnn) 使用标准数据块格式将数组异步写入磁盘。
与标准插入不同,延迟插入是自动提交的,不能回滚。数据库按照它们在会话中出现的顺序提交对给定对象的插入。不能保证对象间或会话间的顺序。
数据库就像常规插入一样支持约束和索引维护。但是,数据库在写入磁盘期间执行评估,而不是在写入大型池时。
注意:为了获得最佳性能,Oracle 建议禁用约束。
下图描绘了延迟插入的工作流。
Figure 17-8 Deferred Insert Mechanism(图17-8 延迟插入机制)

另请参见
-
• “Read Consistency and Deferred Inserts”(读一致性与延迟插入) -
• 《Oracle AI 数据库性能调优指南》以了解如何将表指定为 MEMOPTIMIZE FOR WRITE -
• 《Oracle AI 数据库 SQL 语言参考》以获取 INSERT 语法和语义 -
• 《Oracle AI 数据库参考》以了解有关 MEMOPTIMIZE_POOL_SIZE 的更多信息
Java Pool(Java 池)
Java 池是一个内存区域,用于存储 Java 虚拟机 (JVM) 中所有特定于会话的 Java 代码和数据。此内存包括在调用结束时迁移到 Java 会话空间的 Java 对象。
对于专有服务器连接,Java 池包括每个 Java 类的共享部分,包括方法和只读内存(如代码向量),但不包括每个会话的 Java 状态。对于共享服务器,该池包括每个类的共享部分以及一些用于每个会话状态的 UGA。每个 UGA 会根据需要增长和收缩,但 UGA 总大小必须适合 Java 池空间。
Java 池顾问统计信息提供有关用于 Java 的库高速缓存内存的信息,并预测 Java 池大小的变化如何影响解析率。当 STATISTICS_LEVEL 设置为 TYPICAL 或更高时,Java 池顾问在内部开启。当顾问关闭时,这些统计信息会重置。
另请参见
-
• 《Oracle AI 数据库 Java 开发者指南》 -
• 《Oracle AI 数据库性能调优指南》以了解包含 Java 池顾问统计信息的视图
Fixed SGA(固定 SGA)
固定 SGA 是一个内部内务管理区域。
例如,固定 SGA 包含:
-
• 关于数据库和实例状态的一般信息,后台进程需要访问这些信息 -
• 进程间通信的信息,例如关于锁的信息
固定 SGA 的大小由 Oracle AI 数据库设置,不能手动更改。固定 SGA 的大小可能会因版本而异。
另请参见“Overview of Automatic Locks”(自动锁概述)
Optional Performance-Related SGA Subareas(可选性能相关 SGA 子区域)
一些 SGA 子区域仅为特定的性能特性启用。
本节包含以下主题:
-
• In-Memory Area(内存中区域) -
• Memoptimize Pool(Memoptimize 池) -
• In-Memory Area(内存中区域)内存中区域是一个可选的 SGA 组件,包含内存中列存储(IM 列存储)。 -
• Memoptimize Pool(Memoptimize 池)Memoptimize 池为指定为 MEMOPTIMIZE FOR READ 的堆组织表存储缓冲区及相关结构。
In-Memory Area(内存中区域)
内存中区域是一个可选的 SGA 组件,包含内存中列存储(IM 列存储)。
IM 列存储包含以列格式存储的表、分区和物化视图的副本,该列格式针对快速扫描进行了优化。IM 列存储补充了数据库缓冲区高速缓存,后者以传统的行格式存储数据。
注意:要启用 IM 列存储,您必须拥有 Oracle AI 数据库内存中选项。
另请参见《Oracle AI 数据库内存中指南》以了解有关内存中区域和 IM 列存储的更多信息
Memoptimize Pool(Memoptimize 池)
Memoptimize 池为指定为 MEMOPTIMIZE FOR READ 的堆组织表存储缓冲区及相关结构。
此结构为基于键的查询(例如 SELECT * FROM cust WHERE cid = 10)提供高性能和可扩展性。为减少端到端响应时间,客户端通过网络直接从 SGA 拉取请求的缓冲区,从而避免了 CPU 和操作系统开销。应用程序无需更改代码即可受益于 Memoptimize 池。
Memoptimize 池包含两个部分:
-
• Memoptimize buffer area(Memoptimize 缓冲区区域)为了避免磁盘 I/O,数据库永久地将 MEMOPTIMIZE FOR READ 表的缓冲区锁定在 Memoptimize 池中,直到该表被标记为 NO MEMOPTIMIZE FOR READ。Memoptimize 缓冲区使用与数据库缓冲区高速缓存中的缓冲区相同的结构。但是,Memoptimize 池中的缓冲区与数据库缓冲区高速缓存完全分离,不计入其大小。Memoptimize 缓冲区区域占 Memoptimize 池的 75%。 -
• Hash index(哈希索引)哈希索引是一种非持久的段数据结构。数据库将哈希索引分配为多个非连续的内存单元。每个单元包含多个哈希桶。一个单独的映射结构将内存单元与主键相关联。哈希索引占 Memoptimize 池的 25%。
Figure 17-9 Memoptimize Pool(图17-9 Memoptimize 池)

要启用 Memoptimize 池,请将 MEMOPTIMIZE_POOL_SIZE 初始化参数设置为整数值(默认情况下该池被禁用)。该值指定要分配给该池的 SGA 量。MEMOPTIMIZE_POOL_SIZE 的值会计入 SGA_TARGET,但数据库不会自动增长和收缩 Memoptimize 池。例如,如果 SGA_TARGET 为 10 GB,且 MEMOPTIMIZE_POOL_SIZE 为 1 GB,则总共有 9 GB 可用于 Memoptimize 池之外的 SGA 内存。
要更改 Memoptimize 池的大小,您必须手动设置 MEMOPTIMIZE_POOL_SIZE 并重启数据库实例。您不能使用 ALTER SYSTEM 动态更改池大小。
DBMS_MEMOPTIMIZE 包使您能够显式地将表填充到 Memoptimize 池中。
另请参见
-
• 《Oracle AI 数据库性能调优指南》以了解如何通过启用 Memoptimize 池来提高查询性能 -
• 《Oracle AI 数据库 PL/SQL 包和类型参考》以了解有关 DBMS_MEMOPTIMIZE 包的更多信息 -
• 《Oracle AI 数据库 SQL 语言参考》以了解有关 CREATE TABLE … MEMOPTIMIZE FOR READ 的更多信息 -
• 《Oracle AI 数据库参考》以了解有关 MEMOPTIMIZE_POOL_SIZE 的更多信息
Overview of the Program Global Area (PGA)(程序全局区 (PGA) 概述)
PGA 是特定于操作系统进程或线程的内存,不被系统上的其他进程或线程共享。由于 PGA 是特定于进程的,因此它永远不会分配在 SGA 中。
PGA 是一个内存堆,包含专用或共享服务器进程所需的依赖会话的变量。服务器进程在 PGA 中分配它所需的内存结构。
可以将 PGA 类比为文件管理员使用的临时柜台工作区。在这个类比中,文件管理员是代表客户(客户端进程)工作的服务器进程。该管理员清理柜台的一部分,使用该工作区存储有关客户请求的详细信息,并整理客户请求的文件夹,然后在工作完成后腾出该空间。
下图显示了一个未配置共享服务器的实例的实例 PGA(所有 PGA 的集合)。您可以使用初始化参数设置实例 PGA 的目标最大大小。各个 PGA 可以根据需要增长,直到达到此目标大小。
Figure 17-10 Instance PGA(图17-10 实例 PGA)

注意:后台进程也会分配它们自己的 PGA。此讨论仅关注服务器进程 PGA。
-
• Contents of the PGA(PGA 的内容)PGA 被细分为不同的区域,每个区域都有不同的用途。 -
• PGA Usage in Dedicated and Shared Server Modes(专有和共享服务器模式下的 PGA 使用)PGA 内存分配取决于数据库使用的是专有服务器连接还是共享服务器连接。
另请参见《Oracle AI 数据库性能调优指南》以获取 PGA 内存管理的概述
Contents of the PGA(PGA 的内容)
PGA 被细分为不同的区域,每个区域都有不同的用途。
下图显示了专有服务器会话的 PGA 可能包含的内容。并非所有 PGA 区域都会在每种情况下存在。
Figure 17-11 PGA Contents(图17-11 PGA 内容)

-
• Private SQL Area(私有 SQL 区)私有 SQL 区保存有关已解析的 SQL 语句的信息以及用于处理的其他特定于会话的信息。 -
• SQL Work Areas(SQL 工作区)工作区是用于内存密集型操作的 PGA 内存的私有分配。
Private SQL Area(私有 SQL 区)
私有 SQL 区保存有关已解析的 SQL 语句的信息以及用于处理的其他特定于会话的信息。
当服务器进程执行 SQL 或 PL/SQL 代码时,该进程使用私有 SQL 区来存储绑定变量值、查询执行状态信息以及查询执行工作区。
不要将 PGA 中的私有 SQL 区与 SGA 中存储执行计划的共享 SQL 区混淆。同一会话或不同会话中的多个私有 SQL 区可以指向 SGA 中的单个执行计划。例如,一个会话中对 SELECT * FROM sales 的 20 次执行,以及另一个会话中对同一查询的 10 次执行,可以共享同一个计划。每次执行的私有 SQL 区是不共享的,可能包含不同的值和数据。
游标是指向特定私有 SQL 区的名称或句柄。如下图所示,您可以将游标视为客户端上的指针和服务器端上的状态。由于游标与私有 SQL 区密切相关,因此这两个术语有时可以互换使用。
Figure 17-12 Cursor(图17-12 游标)

私有 SQL 区分为以下区域:
-
• The run-time area(运行时区)此区域包含查询执行状态信息。例如,运行时区跟踪全表扫描中到目前为止检索到的行数。Oracle AI 数据库在执行请求的第一步创建运行时区。对于 DML 语句,运行时区在 SQL 语句关闭时释放。 -
• The persistent area(持久区)此区域包含绑定变量值。绑定变量值在运行时执行 SQL 语句时提供。持久区仅在游标关闭时释放。
客户端进程负责管理私有 SQL 区。私有 SQL 区的分配和释放很大程度上取决于应用程序,尽管客户端进程可以分配的私有 SQL 区数量受初始化参数 OPEN_CURSORS 的限制。
尽管大多数用户依赖数据库实用程序的自动游标处理,但 Oracle AI 数据库编程接口为开发人员提供了对游标的更多控制。通常,应用程序应关闭所有不再使用的打开游标,以释放持久区并最大限度地减少应用程序用户所需的内存。
另请参见
-
• “Shared SQL Areas”(共享 SQL 区) -
• 《Oracle AI 数据库开发指南》和《Oracle AI 数据库 PL/SQL 语言参考》以了解如何使用游标
SQL Work Areas(SQL 工作区)
工作区是用于内存密集型操作的 PGA 内存的私有分配。
例如,排序运算符使用排序区来对一组行进行排序。类似地,哈希连接运算符使用哈希区从其左侧输入构建哈希表,而位图合并使用位图合并区来合并从多个位图索引扫描中检索到的数据。
以下示例显示了 employees 和 departments 的连接及其查询计划:
SQL>SELECT*2FROM employees e JOIN departments d3ON e.department_id=d.department_id4ORDERBY last_name;...--------------------------------------------------------------------------------| Id| Operation | Name |Rows| Bytes | Cost (%CPU)|Time|--------------------------------------------------------------------------------|0|SELECT STATEMENT ||106|9328|7 (29)|00:00:01||1| SORT ORDERBY||106|9328|7 (29)|00:00:01||*2| HASH JOIN||106|9328|6 (17)|00:00:01||3|TABLE ACCESS FULL| DEPARTMENTS |27|540|2 (0)|00:00:01||4|TABLE ACCESS FULL| EMPLOYEES |107|7276|3 (0)|00:00:01|--------------------------------------------------------------------------------
在前面的示例中,运行时区跟踪全表扫描的进度。会话在哈希区中执行哈希连接以匹配来自两个表的行。ORDER BY 排序发生在排序区中。
如果要由运算符处理的数据量不适合工作区,那么 Oracle AI 数据库会将输入数据分割成更小的片段。通过这种方式,数据库在内存中处理一些数据片段,同时将其余部分写入临时磁盘存储以供以后处理。
当启用自动 PGA 内存管理时,数据库会自动调整工作区大小。您也可以手动控制和调整工作区的大小。
通常,更大的工作区可以显著提高运算符的性能,但代价是更高的内存消耗。最佳情况下,工作区的大小足以容纳输入数据及其关联 SQL 运算符分配的辅助内存结构。如果不是,响应时间会增加,因为部分输入数据必须缓存在磁盘上。在极端情况下,如果工作区的大小与输入数据大小相比太小,那么数据库必须对数据片段执行多次传递,从而显著增加响应时间。
另请参见
-
• 《Oracle AI 数据库管理员指南》以了解如何使用自动 PGA 管理 -
• 《Oracle AI 数据库性能调优指南》以了解如何调优 PGA 内存
PGA Usage in Dedicated and Shared Server Modes(专有和共享服务器模式下的 PGA 使用)
PGA 内存分配取决于数据库使用的是专有服务器连接还是共享服务器连接。
下表显示了差异。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
另请参见《Oracle AI 数据库管理员指南》以了解如何为共享服务器配置数据库
Overview of the User Global Area(用户全局区概述)
UGA 是会话内存,即分配给会话变量的内存,例如登录信息以及数据库会话所需的其他信息。本质上,UGA 存储会话状态。
下图描绘了 UGA。
Figure 17-13 User Global Area (UGA)(图17-13 用户全局区 (UGA))

如果会话将 PL/SQL 包加载到内存中,那么 UGA 包含包状态,即在特定时间所有包变量中存储的值集合。当包子程序更改变量时,包状态会发生变化。默认情况下,包变量对于会话是唯一的,并在会话的生命周期内持续存在。
OLAP 页池也存储在 UGA 中。此池管理 OLAP 数据页,这些数据页等效于数据块。页池在 OLAP 会话开始时分配,并在会话结束时释放。每当用户查询维度对象(如多维数据集)时,OLAP 会话会自动打开。
UGA 必须在会话的整个生命周期内对数据库会话可用。因此,当使用共享服务器连接时,UGA 不能存储在 PGA 中,因为 PGA 是特定于单个进程的。因此,当使用共享服务器连接时,UGA 存储在 SGA 中,使任何共享服务器进程都能访问它。当使用专有服务器连接时,UGA 存储在 PGA 中。
另请参见
-
• “PL/SQL Packages”(PL/SQL 包) -
• “Connections and Sessions”(连接与会话) -
• 《Oracle AI 数据库网络服务管理员指南》以了解有关共享服务器连接的信息
Overview of the Managed Global Area (MGA)(托管全局区 (MGA) 概述)
托管全局区 (MGA) 是一个独特的内存框架,能够在一组受信任的 Oracle 进程之间共享和协调内存。
它能够成为一个可配置、弹性、模块化、按需、可恢复的共享内存区域。MGA 提供了一种在数据库中使用不同类型共享内存区域的方法。它以命名空间的形式公开给内部数据库层,每个命名空间仅属于其中一个层。命名空间主要由一组共享内存段及其伴随的元数据组成。
数据库中的层可以定义命名空间的特性、范围、生命周期和内部段大小。所有 MGA 都计入 PGA 聚合限制之下。
在 Linux 上,MGA 需要将 tempfs 挂载在 /dev/shm 上,并且其配置至少为 PGA 聚合限制的大小。当同一台机器上运行多个实例时,/dev/shm 的大小需要至少为所有实例的 sum(PGA_AGGREGATE_LIMIT)。
另请参见
-
• Introduction to the Oracle AI Database Instance(Oracle AI 数据库实例简介) -
• 《Oracle AI 数据库性能调优指南》以了解有关区组大小的更多信息
Overview of Software Code Areas(软件代码区概述)
软件代码区是用于存储正在运行或可以运行的代码的内存部分。Oracle AI 数据库代码存储在一个软件区域中,该区域通常比用户程序的位置更独占、更受保护。
软件区域的大小通常是静态的,仅在软件更新或重新安装时才会更改。这些区域所需的大小因操作系统而异。
软件区域是只读的,可以安装为共享或非共享。一些数据库工具和实用程序,如 Oracle Forms 和 SQL*Plus,可以安装为共享,但有些则不能。如果可能,数据库代码是共享的,这样所有用户都可以访问它,而无需在内存中保存多个副本,从而减少主内存并整体提高性能。如果运行在同一台计算机上,一个数据库的多个实例可以使用不同的数据库共享相同的数据库代码区域。
注意:安装共享软件的选项并非适用于所有操作系统,例如,在运行 Microsoft Windows 的 PC 上。有关更多信息,请参阅特定于您的操作系统的文档。
夜雨聆风