暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle Administrator's Guide(Oracle 19c):6.4 Configuring Memory Manually

原创 Ryan Bai 2025-05-22
320

如果您更喜欢对单个内存组件的大小进行更直接的控制,则可以禁用自动内存管理,并将数据库配置为手动内存管理。

关于手动内存管理

SGA 有两种不同的手动内存管理方法,PGA 也有两种。

SGA 的两种手动内存管理方法因 DBA 需要的工作量和知识数量而异。通过自动共享内存管理,您可以设置 SGA 的目标大小和最大大小。然后,数据库将 SGA 的总大小设置为指定的目标,并动态调整许多 SGA 组件的大小。通过手动共享内存管理,您可以设置几个单独的 SGA 组件的大小,从而确定总体 SGA 的大小。然后您可以在持续的基础上手动调整这些单独的 SGA 组件。

对于 PGA 实例,有自动PGA内存管理,其中您可以设置 PGA 实例的目标大小。然后,数据库将实例 PGA 的大小设置为目标,并动态调整单个 PGA 的大小。还有手动 PGA 内存管理,其中您可以为每种类型的 SQL 操作符(如排序或散列连接)设置最大工作区域大小。虽然支持这种内存管理方法,但不推荐使用。

使用自动共享内存管理

自动共享内存管理简化了SGA内存管理。

关于自动共享内存管理

使用自动共享内存管理,您可以使用 SGA_TARGET 初始化参数指定一个实例可用的 SGA 内存总量,Oracle 数据库会自动将该内存分配到各个 SGA 组件中,以确保最有效的内存利用率。

当启用自动共享内存管理时,不同 SGA 组件的大小是灵活的,可以适应工作负载的需要,而不需要任何额外的配置。数据库根据需要自动在各个组件之间分配可用内存,从而允许系统最大化地使用所有可用的 SGA 内存。

如果使用服务器参数文件(SPFILE),则数据库会在实例关闭期间记住自动调优的 SGA 组件的大小。因此,数据库实例不需要在每次启动实例时都重新学习工作负载的特性。实例可以从前一个实例的信息开始,并继续评估上次关闭时停止的工作负载。

SGA 中的组件和颗粒

SGA 包含几个内存组件,这些内存组件是用于满足特定内存分配请求的内存池。

内存组件的示例包括共享池(用于为 SQL 和 PL/SQL 执行分配内存)、java池(用于 java 对象和其他 java 执行内存)和缓冲区缓存(用于缓存磁盘块)。所有 SGA 组件以颗粒为单位分配和分配空间。Oracle 数据库跟踪每个 SGA 组件内部颗粒数中 SGA 内存的使用情况。

SGA 中动态组件的内存以粒为单位分配。粒度大小由实例启动时请求的 SGA 内存量决定。具体来说,粒度大小基于 SGA_MAX_SIZE 参数的值。下表显示了不同数量 SGA 内存的颗粒大小。

SGA 内存大小 颗粒大小
小于或等于 1 GB 4 MB
大于 1 GB,小于或等于 8 GB 16 MB
大于 8 GB,小于或等于 16 GB 32 MB
大于 16 GB,小于或等于 32 GB 64 MB
大于 32 GB,小于或等于 64 GB 128 MB
大于 64 GB,小于等于 128 GB 256 MB
大于 128 GB 512 MB

可能会出现一些平台依赖关系。有关详细信息,请参阅操作系统特定文档。

您可以查询 V$SGAINFO 视图,以查看实例正在使用的颗粒大小。SGA中的所有组件都使用相同的颗粒大小。

如果指定的组件大小不是粒度的倍数,Oracle 数据库会将指定的大小四舍五入到最近的倍数。例如,如果颗粒大小为 4MB,并且指定 DB_CACHE_SIZE 为 10MB,那么数据库实际上分配了 12MB。

设置最大 SGA 大小

SGA_MAX_SIZE 初始化参数指定实例生命周期中系统全局区域的最大大小。

要设置系统全局区域的最大大小:

  • 设置 SGA_MAX_SIZE 初始化参数。

你可以动态修改初始化参数影响大小的缓冲区缓存、共享池、大量 Java 池和流池,但只有在之和的大小和其他组件的大小 SGA(固定 SGA、变量 SGA 和重做日志缓冲区)由 SGA_MAX_SIZE不超过指定的值。

如果没有指定 SGA_MAX_SIZE,那么 Oracle 数据库将选择一个默认值,该值是初始化时指定或默认的所有组件的总和。如果你指定 SGA_MAX_SIZE,当时数据库初始化值小于的总和为所有组件分配的内存,在参数文件中明确或默认情况下,数据库然后忽略了设置 SGA_MAX_SIZE 和为这个参数选择正确的值。

设置 SGA 目标尺寸

通过将 SGA_TARGET 初始化参数设置为非零值,可以启用自动共享内存管理特性。此参数设置 SGA 的总大小。它替换了控制分配给一组特定组件的内存的参数,这些组件现在根据需要自动动态调整大小(调优)。

启用自动共享内存管理功能:

  • SGA_TARGET 初始化参数设置为非零值。
SGA 的目标和自动大小的 SGA 组件

当设置 SGA_TARGET 时,一些 SGA 组件会自动调整大小。

下表列出了设置 SGA_TARGET 时自动调整大小的 SGA 组件。对于每个 SGA 组件,列出了其相应的初始化参数。

SGA 组件 初始化参数
修正了 Oracle 数据库实例所需的 SGA 和其他内部分配 N/A
共享池 SHARED_POOL_SIZE
大池 LARGE_POOL_SIZE
Java 池 JAVA_POOL_SIZE
缓冲区缓存 DB_CACHE_SIZE
流池 STREAMS_POOL_SIZE

如果设置了下表中列出的手动调整大小的参数,则从 SGA_TARGET 中提取它们的内存,留下上表中列出的组件可用的内存。

SGA 组件 初始化参数
日志缓冲区 LOG_BUFFER
保存和回收缓冲区缓存 DB_KEEP_CACHE_SIZEDB_RECYCLE_CACHE_SIZE
非标准块大小的缓冲区缓存 DB_nK_CACHE_SIZE

除了将 SGA_TARGET 设置为非零值外,还必须将所有初始化参数设置为零,以启用对自动调整大小的 SGA 组件的全自动调优。

或者,您可以将一个或多个自动调整大小的 SGA 组件设置为非零值,然后在SGA调优期间将该值用作该组件的最小设置。本节稍后将详细讨论这一点。

SGA 和虚拟内存

为了在大多数系统中获得最佳性能,整个 SGA 应该适合实际内存。如果没有,并且使用虚拟内存存储部分内存,那么整个数据库系统的性能可能会显著下降。原因是操作系统对SGA的某些部分进行分页(写入和从磁盘读取)。

监控和调整SGA目标尺寸

V$SGAINFO 视图提供关于各种 SGA 组件的当前调优大小的信息。V$SGA_TARGET_ADVICE 视图提供了帮助您决定 SGA_TARGET 值的信息。

监测和调整 SGA 目标大小:

  • 查询 V$SGAINFOV$SGA_TARGET_ADVICE 视图。

例如,运行以下查询:

SQL> select * from v$sga_target_advice order by sga_size; SGA_SIZE SGA_SIZE_FACTOR ESTD_DB_TIME ESTD_DB_TIME_FACTOR ESTD_PHYSICAL_READS ---------- --------------- ------------ ------------------- ------------------- 290 .5 448176 1.6578 1636103 435 .75 339336 1.2552 1636103 580 1 270344 1 1201780 725 1.25 239038 .8842 907584 870 1.5 211517 .7824 513881 1015 1.75 201866 .7467 513881 1160 2 200703 .7424 513881

这个视图中的信息类似于用于自动内存管理的 V$MEMORY_TARGET_ADVICE 视图中提供的信息。

EM Express 提供了一个易于使用的图形内存顾问,以帮助您为 SGA_TARGET 选择最佳大小。

启用自动共享内存管理

启用自动共享内存管理(ASMM)的过程会根据您是从手动共享内存管理更改为ASMM还是从自动内存管理更改为ASMM而有所不同。

从手动共享内存管理改为ASMM:

  1. 运行以下查询来获取 SGA_TARGET 的值:

    SELECT ( (SELECT SUM(value) FROM V$SGA) - (SELECT CURRENT_SIZE FROM V$SGA_DYNAMIC_FREE_MEMORY) ) "SGA_TARGET" FROM DUAL;
  2. 设置 SGA_TARGET 的值,或者通过编辑文本初始化参数文件并重新启动数据库,或者通过发出以下语句:

    ALTER SYSTEM SET SGA_TARGET=value [SCOPE={SPFILE|MEMORY|BOTH}]

    其中 value 是在步骤 1 中计算的值,或者是所有 SGA 组件大小和 SGA_MAX_SIZE 之间的某个值。

  3. 做以下事情之一:

    • 要获得更完整的自动调优,请将表 2 中列出的自动调整大小的 SGA 组件的值设置为零。通过编辑文本初始化参数文件或发出 ALTER SYSTEM 语句来实现这一点。
    • 要控制一个或多个自动调整大小的 SGA 组件的最小大小,请将这些组件大小设置为所需的值。将其他自动调整大小的 SGA 组件的值设置为零。通过编辑文本初始化参数文件或发出 ALTER SYSTEM 语句来实现这一点。

从自动内存管理改为ASMM:

  1. MEMORY_TARGET 初始化参数设置为 0。

    ALTER SYSTEM SET MEMORY_TARGET = 0;

    数据库根据当前的 SGA 内存分配设置 SGA_TARGET

  2. 做以下事情之一:

    • 要获得更完整的自动调优,请将表 2 中列出的自动调整大小的 SGA 组件的大小设置为零。通过编辑文本初始化参数文件或发出 ALTER SYSTEM 语句来实现这一点。
    • 要控制一个或多个自动调整大小的 SGA 组件的最小大小,请将这些组件大小设置为所需的值。将其他自动调整大小的 SGA 组件的大小设置为零。通过编辑文本初始化参数文件或发出 ALTER SYSTEM 语句来实现这一点。

例 1:使用 ASMM

例如,假设您当前为手动共享内存管理配置了一个实例,并将 SGA_MAX_SIZE 设置为 1200M,那么该实例的参数配置如下:

  • SHARED_POOL_SIZE = 200M
  • DB_CACHE_SIZE = 500M
  • LARGE_POOL_SIZE = 200M

还假设查询结果如下:

查询 结果
SELECT SUM(value) FROM V$SGA 1200M
SELECT CURRENT_SIZE FROM V$SGA_DYNAMIC_FREE_MEMORY 208M

您可以通过发出以下语句来利用自动共享内存管理:

CopyALTER SYSTEM SET SGA_TARGET = 992M;
ALTER SYSTEM SET SHARED_POOL_SIZE = 0;
ALTER SYSTEM SET LARGE_POOL_SIZE = 0;
ALTER SYSTEM SET JAVA_POOL_SIZE = 0;
ALTER SYSTEM SET DB_CACHE_SIZE = 0;
ALTER SYSTEM SET STREAMS_POOL_SIZE = 0;

其中992M = 1200M - 208M。

为自动调整尺寸的SGA组件设置最小值

通过指定与这些组件对应的参数的最小值,可以对自动调整大小的 SGA 组件的大小进行一些控制。如果您知道应用程序如果没有特定组件中的最小内存量就无法正常运行,那么这样做是非常有用的。

要指定组件的最小 SGA 空间:

  • 为其对应的初始化参数设置一个值。

手动限制一个或多个自动调整大小的组件的最小大小会减少可用于动态调整的内存总量。这种减少反过来又限制了系统适应工作负载变化的能力。因此,除非在特殊情况下,否则不推荐这种做法。默认的自动管理行为最大化了系统性能和可用资源的使用。

动态修改 SGA_TARGET

可以动态地将 SGA_TARGET 参数增加到为 SGA_MAX_SIZE 参数指定的值,还可以减少 SGA_TARGET 参数。

如果降低 SGA_TARGET 的值,系统将标识一个或多个自动调优的组件,为其释放内存。您可以减小 SGA_TARGET,直到一个或多个自动调优的组件达到它们的最小大小。Oracle 数据库根据几个因素确定了 SGA_TARGET 的最小允允值,包括为自动调整大小的组件设置的值、使用 SGA_TARGET 空间的手动调整大小的组件以及 CPU 的数量。

修改 SGA_TARGET 时物理内存使用量的变化取决于操作系统。在一些不支持动态共享内存的 UNIX 平台上,SGA 使用的物理内存等于 SGA_MAX_SIZE 参数的值。在这样的平台上,将 SGA_TARGET 设置为小于 SGA_MAX_SIZE 的值并没有真正的好处。因此,不建议在这些平台上设置 SGA_MAX_SIZE

在其他平台上,比如 Solaris 和 Windows,SGA 消耗的物理内存等于 SGA_TARGET 的值。

例如,假设您有一个配置如下的环境:

  • SGA_MAX_SIZE = 1024 M
  • SGA_TARGET = 512 M
  • DB_8K_CACHE_SIZE = 128 M

在本例中,SGA_TARGET 的值可以调整到 1024M,也可以减小,直到一个或多个自动调整大小的组件达到其最小大小。确切的值取决于环境因素,比如系统上cpu的数量。但是,DB_8K_CACHE_SIZE 的值始终固定在 128M

修改自动大小元件的参数

启用自动共享内存管理时,自动调整大小的组件的手动指定大小作为组件大小的下限。您可以通过更改相应参数的值动态地修改此限制。

如果给定SGA组件的大小的指定下限小于其当前大小,则该组件的大小不会立即更改。新设置只将自动调优算法限制为将来减小的最小大小。

要设置组件大小的下限:

  • 将组件的初始化参数设置为最小值。

例如,考虑以下配置:

  • SGA_TARGET = 512M
  • LARGE_POOL_SIZE = 256M
  • 当前实际大池大小 = 284M

在本例中,如果将 LARGE_POOL_SIZE 的值增加到大于组件当前实际大小的值,系统将扩展组件以适应增加的最小大小。例如,如果将 LARGE_POOL_SIZE 的值增加到 300M,那么系统将逐步增加大池,直到它达到 300M。这种调整是以牺牲一个或多个自动调优的组件为代价的。如果将 LARGE_POOL_SIZE 的值降低到 200,则不会立即更改该组件的大小。新设置只限制在未来将大型游泳池的规模减少到 200M。

修改手动尺寸组件的参数

手动调整组件大小的参数也可以动态更改。但是,参数的值不是设置最小大小,而是指定相应组件的精确大小。

当您增加手动调整大小的组件的大小时,会从一个或多个自动调整大小的组件中删除额外的内存。当您减小手动调整大小的组件的大小时,释放的内存将分配给自动调整大小的组件。

修改组件的精确尺寸:

  • 设置组件的初始化参数。

例如,考虑以下配置:

  • SGA_TARGET = 512 M
  • DB_8K_CACHE_SIZE = 128 M

在本例中,将 DB_8K_CACHE_SIZE 增加 16M 到 144M 意味着从自动调整大小的组件中去掉 16M。同样,将 DB_8K_CACHE_SIZE 减少 16M 到 112M 意味着将 16M 分配给自动调整大小的组件。

使用手动共享内存管理

要手动管理共享内存,首先要确保禁用自动内存管理和自动共享内存管理。然后手动配置、监视和调优内存组件。

关于手动共享内存管理

如果决定不使用自动内存管理或自动共享内存管理,则必须手动配置几个 SGA 组件大小,然后随着数据库工作负载的变化不断监视和调优这些大小。您可以按照指导原则设置控制这些 SGA 组件大小的参数。

如果使用 DBCA 创建数据库并选择手动共享内存管理,DBCA 提供了一些字段,其中必须输入缓冲区缓存、共享池、大池和 Java 池的大小。然后在它创建的服务器参数文件(SPFILE)中设置相应的初始化参数。如果您使用 CREATE DATABASE SQL语句和文本初始化参数文件创建数据库,您可以执行以下操作之一:

  • 为设置 SGA 组件大小的初始化参数提供值。
  • 从文本初始化文件中省略 SGA 组件大小参数。Oracle 数据库为未设置大小的任何组件选择合理的默认值。

支持手动共享内存管理

没有初始化参数本身支持手动共享内存管理。通过禁用自动内存管理和自动共享内存管理,您可以有效地启用手动共享内存管理。

要启用手动共享内存管理:

  1. MEMORY_TARGET 初始化参数设置为 0。
  2. SGA_TARGET 初始化参数设置为 0。

然后必须为各种 SGA 组件设置值,如下面的部分所述。

设置缓冲区缓存初始化参数

缓冲区缓存初始化参数决定 SGA 的缓冲区缓存组件的大小。

您可以使用它们为数据库使用的各种块大小指定缓存的大小。这些初始化参数都是动态的。

缓冲区缓存的大小影响性能。较大的缓存大小通常会减少磁盘读写的数量。然而,大型缓存可能占用太多内存,并导致内存分页或交换。

Oracle 数据库支持数据库中的多个块大小。如果使用非标准块大小创建表空间,则必须配置非标准块大小缓冲区来容纳这些表空间。标准块大小用于 SYSTEM 表空间。通过设置初始化参数 DB_BLOCK_SIZE 指定标准块大小。合法的值从 2K 到 32K。

如果你打算使用多个数据库中的块大小,您必须 DB_CACHE_SIZE 和至少一个 DB_nK_CACHE_SIZE 参数组,Oracle 数据库 DB_CACHE_SIZE 参数指定一个适当的默认值,但 DB_nK_CACHE_SIZE 参数默认为 0,也没有额外的块大小配置缓存。

非标准块大小缓冲区的大小和数量由以下参数指定:

DB_2K_CACHE_SIZE
DB_4K_CACHE_SIZE
DB_8K_CACHE_SIZE
DB_16K_CACHE_SIZE
DB_32K_CACHE_SIZE

每个参数指定对应块大小的缓存大小。

设置块和缓存大小的示例

一个例子说明了设置块和缓存大小。

DB_BLOCK_SIZE=4096
DB_CACHE_SIZE=1024M
DB_2K_CACHE_SIZE=256M
DB_8K_CACHE_SIZE=512M

在前面的示例中,参数 DB_BLOCK_SIZE 将数据库的标准块大小设置为 4K。标准块大小缓冲区的缓存大小为 1024 MB。此外,还配置了 2K 和 8K 缓存,大小分别为 256MB 和 512MB。

缓存的大小是有限的,因此不是磁盘上的所有数据都能放入缓存中。当缓存已满时,后续缓存丢失会导致Oracle数据库将缓存中已存在的脏数据写到磁盘,以便为新数据腾出空间。(如果缓冲区不是脏的,则不需要在将新块读入缓冲区之前将其写入磁盘。)随后对写入磁盘的任何数据的访问,然后重写,会导致额外的缓存丢失。

缓存的大小影响数据请求导致缓存命中的可能性。如果缓存很大,则更可能包含请求的数据。增加缓存的大小会增加导致缓存命中的数据请求的百分比。

您可以在实例运行时更改缓冲区缓存的大小,而不必关闭数据库。使用 ALTER SYSTEM 语句执行此操作。

使用固定视图 V$BUFFER_POOL 跟踪不同缓存组件的大小和任何挂起的调整大小操作。

多个缓冲池

您可以使用单独的缓冲池来配置数据库缓冲缓存,这些缓冲池要么将数据保存在缓冲缓存中,要么在使用数据块之后立即为新数据提供缓冲。

然后可以将特定的模式对象(表、集群、索引和分区)分配给适当的缓冲池,以控制数据块离开缓存的方式。

  • KEEP 缓冲池将模式对象的数据块保存在内存中。
  • RECYCLE 缓冲池会从内存中删除数据块,当不再需要数据块时
  • DEFAULT 缓冲池包含来自未分配给任何缓冲池的模式对象的数据块,以及显式分配给默认池的模式对象。

配置保存和回收缓冲池的初始化参数是 DB_KEEP_CACHE_SIZEDB_RECYCLE_CACHE_SIZE

指定共享池大小

SHARED_POOL_SIZE 初始化参数是一个动态参数,允许您指定或调整 SGA 的共享池组件的大小。Oracle 数据库选择适当的默认值。

在 Oracle 数据库 10g 之前的版本中,分配的共享池内存量等于 SHARED_POOL_SIZE 初始化参数的值,加上实例启动期间计算的内部 SGA 开销。内部SGA开销是指 Oracle 数据库在启动期间根据其他几个初始化参数的值分配的内存。此内存用于维护 SGA 中不同服务器组件的状态。例如,如果 SHARED_POOL_SIZE 参数设置为 64 MB 和内部 SGA 开销计算 12 MB,真正的共享池的大小是 64 + 12 = 76 MB,尽管 SHARED_POOL_SIZE 参数的值仍然显示为 64 MB。

从 Oracle 数据库 10g 开始,内部SGA开销的大小包含在用户指定的 SHARED_POOL_SIZE 值中。如果不使用自动内存管理或自动共享内存管理,则在启动时分配的共享池内存量等于 SHARED_POOL_SIZE 初始化参数的值,四舍五入为粒度大小的倍数。因此,必须设置此参数,以便除了共享池大小所需的值之外,还包括内部 SGA 开销。在前面的示例中,如果 SHARED_POOL_SIZE 参数在启动时设置为 64 MB,那么启动后可用的共享池为 64 - 12 = 52 MB,假设内部 SGA 开销的值保持不变。为了在启动后为共享池内存保持 64 MB的有效值,必须将 SHARED_POOL_SIZE 参数设置为64 + 12 = 76 MB。

当从 Oracle Database 10g 之前的版本迁移时,迁移实用程序根据升级前环境中的内部 SGA 开销值和该参数的旧值为该参数推荐一个新值。从 Oracle 数据库 10g 开始,可以从 V$SGAINFO 视图查询内部 SGA 开销(也称为共享池中的启动开销)的确切值。此外,在手动共享内存管理模式下,如果用户指定的 SHARED_POOL_SIZE 值太小,甚至无法满足内部 SGA 开销的要求,那么 Oracle 数据库在启动时将生成一个 ORA-00371 错误,建议使用 SHARED_POOL_SIZE 参数的值。当使用自动共享内存管理时,共享池将自动调优,不会生成 ORA-00371 错误。

结果缓存和共享池大小

结果缓存从共享池中获取内存。因此,如果希望增加结果缓存的最大大小,请在调整共享池的大小时考虑这一点。

指定大池大小

LARGE_POOL_SIZE 初始化参数是一个动态参数,允许您指定或调整 SGA 的大池组件的大小。

大池是 SGA 的一个可选组件。必须特别设置 LARGE_POOL_SIZE 参数才能创建大池。在 Oracle 数据库性能调优指南中讨论了如何配置大池。

指定Java池大小

JAVA_POOL_SIZE 初始化参数是一个动态参数,允许您指定或调整 SGA 的 Java 池组件的大小。

Oracle 数据库选择适当的默认值。在 Oracle 数据库 Java 开发人员指南中讨论了 Java 池的配置。

指定流池大小

STREAMS_POOL_SIZE 初始化参数是一个动态参数,允许您指定或调整 SGA 的 Streams 池组件的大小。

如果 STREAMS_POOL_SIZE 设置为 0,那么 Oracle Streams 产品在需要时将内存从缓冲区缓存传输到 Streams 池。

指定结果缓存的最大大小

RESULT_CACHE_MAX_SIZE 初始化参数是一个动态参数,它允许您指定 SGA 的结果缓存组件的最大大小。

通常,不需要指定此参数,因为数据库根据 SGA 可用的总内存和当前使用的内存管理方法选择默认的最大大小。通过显示 RESULT_CACHE_MAX_SIZE 参数的值,可以查看当前默认的最大大小。要更改这个最大大小,可以使用 ALTER SYSTEM 语句设置 RESULT_CACHE_MAX_SIZE,或者在文本初始化参数文件中指定该参数。在每种情况下,该值都四舍五入到最近的32K的倍数。

如果实例启动时 RESULT_CACHE_MAX_SIZE 为 0,则禁用结果缓存。要重新启用它,您必须将 RESULT_CACHE_MAX_SIZE 设置为非零值(或从文本初始化参数文件中删除此参数以获得默认的最大大小),然后重新启动数据库。

注意,启动数据库结果缓存禁用后,如果您使用一个改变系统声明 RESULT_CACHE_MAX_SIZE 设置为非零值但不重启数据库,查询 RESULT_CACHE_MAX_SIZE 参数的值返回一个非零值,即使结果缓存仍然是禁用的。因此,RESULT_CACHE_MAX_SIZE 的值不是确定是否启用结果缓存的最可靠方法。你可以使用以下查询:

SELECT dbms_result_cache.status() FROM dual; DBMS_RESULT_CACHE.STATUS() --------------------------------------------- ENABLED

结果缓存从共享池中获取内存,因此,如果您增加了最大结果缓存大小,也可以考虑增加共享池大小。

视图 V$RESULT_CACHE_STATISTICS 和 PL/SQL 包过程 DBMS_RESULT_CACHE.MEMORY_REPORT 显示信息帮助您确定当前分配给结果缓存的内存数量。

PL/SQL 包函数 DBMS_RESULT_CACHE.FLUSH 清除结果缓存并将所有内存释放回共享池。

指定其他 SGA 初始化参数

您可以设置一些额外的初始化参数来控制 SGA 如何使用内存。

物理内存

LOCK_SGA 参数设置为 TRUE 时,将整个 SGA 锁定到物理内存中。

此参数不能用于自动内存管理。

SGA 启动地址

SHARED_MEMORY_ADDRESSHI_SHARED_MEMORY_ADDRESS 参数指定 SGA 在运行时的起始地址。

这些参数很少使用。对于 64 位平台,HI_SHARED_MEMORY_ADDRESS 指定 64 位地址的高阶 32 位。

使用自动 PGA 内存管理

默认情况下,Oracle 数据库自动全局地管理专用于实例 PGA 的内存总量。您可以通过设置初始化参数PGA_AGGREGATE_TARGET 来控制这个数量。

然后,Oracle 数据库尝试确保跨所有数据库服务器进程和后台进程分配的 PGA 内存总量永远不会超过这个目标。

如果使用 DBCA 创建数据库,可以为总实例 PGA 指定一个值。然后,DBCA 在它创建的服务器参数文件(SPFILE)中设置 PGA_AGGREGATE_TARGET 初始化参数。如果不指定总实例 PGA,则 DBCA 选择一个合理的缺省值。

如果使用 CREATE DATABASE SQL 语句和文本初始化参数文件创建数据库,则可以为 PGA_AGGREGATE_TARGET 提供一个值。如果省略该参数,数据库将为其选择一个默认值。

使用自动 PGA 内存管理,SQL 工作区域的大小是自动调整的,忽略所有 *_AREA_SIZE 初始化参数。在任何给定时间,实例上活动工作区域可用的 PGA 内存总量自动从参数 PGA_AGGREGATE_TARGET 派生。这个量被设置为 PGA_AGGREGATE_TARGET 的值减去分配给其他用途(例如,会话内存)的 PGA 内存。然后根据特定的内存需求将生成的 PGA 内存分配给各个活动工作区域。

有动态性能视图提供 PGA 内存使用统计数据。当设置 PGA_AGGREGATE_TARGET 时,大多数统计信息都是启用的。

  • 有关工作区域内存的分配和使用的统计数字,可在以下动态性能视图中查看:
    • V$SYSSTAT
    • V$SESSTAT
    • V$PGASTAT
    • V$SQL_WORKAREA
    • V$SQL_WORKAREA_ACTIVE
  • V$PROCESS视图中的以下三列报告Oracle数据库进程分配和使用的PGA内存:
    • PGA_USED_MEM
    • PGA_ALLOC_MEM
    • PGA_MAX_MEM

PGA_AGGREGATE_TARGET 设置是一个目标。因此,Oracle 数据库试图将 PGA 内存使用限制在目标范围内,但是有时使用可能会超过设置。要指定 PGA 内存使用的硬限制,请使用 PGA_AGGREGATE_LIMIT 初始化参数。Oracle 数据库确保 PGA 大小不超过这个限制。如果数据库超过此限制,则数据库将中止具有最高不可调优 PGA 内存分配的会话的调用。无论是否使用自动内存管理,都可以设置 PGA_AGGREGATE_LIMIT。如果没有设置 PGA_AGGREGATE_LIMIT,那么 Oracle 数据库将确定一个适当的默认限制。

使用手动 PGA 内存管理

Oracle 数据库支持手动 PGA 内存管理,您可以在其中手动调优 SQL 工作区。

在 Oracle Database 10g 之前的版本中,数据库管理员通过设置以下参数来控制 SQL 工作区的最大大小:SORT_AREA_SIZEHASH_AREA_SIZEBITMAP_MERGE_AREA_SIZECREATE_BITMAP_AREA_SIZE。设置这些参数很困难,因为从数据输入大小和系统中活动的工作区域总数中理想地选择了最大工作区域大小。这两个因素在不同的工作领域和不同的时间有很大的差异。因此,在最好的情况下,各种 *_AREA_SIZE 参数都很难调优。

出于这个原因,Oracle 强烈建议启用自动 PGA 内存管理。

如果决定手动调优 SQL 工作区,则必须将 WORKAREA_SIZE_POLICY 初始化参数设置为 MANUAL

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论