Managing Memory

一、12c:官档

  • Books → Database Administrator’s Guide → Part I Basic Database Administration → 6 Managing Memory

二、关于内存管理

必须管理的内存结构是系统全局区域(SGA)和实例程序全局区域(实例PGA)。Oracle数据库支持各种内存管理方法,这些方法是由初始化参数设置选择的。
自动内存管理
Oracle数据库可以完全自动地管理SGA内存和实例PGA内存。您只指定了实例使用的总内存大小,Oracle数据库则在SGA和实例PGA之间动态地交换内存以满足处理需求。此功能称为自动内存管理。通过这种内存管理方法,数据库还可以动态调整SGA组件的大小和单个pga的大小。Oracle建议对数据库进行自动内存管理,在SGA和PGA内存的总大小小于或等于4g 数据库中。
手动内存管理
如果您更喜欢对单个内存组件的大小进行更直接的控制,则可以禁用自动内存管理,并配置用于手动内存管理的数据库。有几种不同的方法可用于手动内存管理。其中一些方法保持了一定程度的自动化。因此,这些方法在DBA所需的努力和知识方面存在差异。这些方法是:
  • 自动共享内存管理——用于SGA
  • 手动共享内存管理——用于SGA
  • 自动PGA内存管理——用于实例PGA
  • 手动PGA内存管理——例如PGA
本章后面将介绍这些内存管理方法。
如果您使用数据库配置助理(DBCA)创建数据库,并选择基本的安装选项,那么当系统内存小于或等于4gb时,将启用自动内存管理(AMM)。当系统内存大于4gb时,自动内存管理被禁用,自动共享内存管理(ASMM)被启用。如果选择高级安装,那么DBCA使您能够选择 AMM 或 ASMM。
当 SGA 和 PGA 内存的总大小为 4GB 或更大时,Oracle 推荐 ASMM。
Note:
管理内存的最简单方法是使用Oracle Enterprise Manager数据库Express (EM Express)或Oracle Enterprise Manager云控制(云控制)的图形用户界面。
有关使用EM Express管理内存的信息,请参见《Oracle Database 2 Day DBA》。
有关使用Cloud Control管理内存的信息,请参见《the Cloud Control online help》。
See Also:
  • 《Oracle Database Concepts》介绍各种自动和手动管理内存的方法

三、内存体系结构概述

了解与Oracle数据库相关的基本内存结构。
与Oracle数据库相关的基本内存结构包括:
  • System Global Area (SGA)
    SGA是一组共享内存结构,称为SGA组件,其中包含一个Oracle数据库实例的数据和控制信息。SGA由所有服务器和后台进程共享。存储在SGA中的数据示例包括缓存的数据块和共享的SQL区域。
  • Program Global Area (PGA)
    PGA是一个内存区域,它包含服务器进程的数据和控制信息。它是在服务器进程启动时由Oracle数据库创建的非共享内存。访问PGA仅限于服务器进程。每个服务器进程都有一个PGA。后台进程也分配他们自己的PGA。分配给Oracle数据库实例的所有后台进程和服务器进程的总PGA内存称为总实例PGA内存,所有单个PGA的集合称为总实例PGA,或只是实例PGA。

图 1 说明了这些内存结构之间的关系。


图 1:Oracle内存结构
如果您的数据库运行在Solaris或Oracle Linux上,您可以选择添加另一个内存组件:数据库 Smart Flash Cache。数据库 Smart Flash Cache 是SGA驻留缓冲区缓存的扩展,为数据库块提供二级缓存。在数据仓库环境中,它可以提高读取密集型在线事务处理(OLTP)工作负载、临时查询和批量数据修改的响应时间和总体吞吐量。数据库 Smart Flash Cache 驻留在一个或多个闪存盘设备上,闪存盘设备是使用闪存的固态存储设备。数据库 Smart Flash Cache 通常比额外的主内存更经济,并且比磁盘驱动器快一个数量级。

从Oracle Database 12c Release 1(12.1.0.2)开始,大表缓存使串行查询和并行查询能够使用缓冲区缓存。大表缓存为数据仓库环境中的大型表提供了高效的缓存,即使这些表不完全适合缓冲区缓存。表扫描可以在以下场景中使用大表缓存:

  • 并行查询
    在单实例和 RAC 数据库中,当 DB_BIG_TABLE_CACHE_PERCENT_TARGET 初始化参数设置为非零值时,并行查询可以使用大表缓存,并将 PARALLEL_DEGREE_POLICY 设置为 AUTO 或 ADAPTIVE。
  • 串行查询
    在单实例配置中,当 DB_BIG_TABLE_CACHE_PERCENT_TARGET 初始化参数设置为非零值时,串行查询可以使用大表缓存。
See Also:
  • 《Configuring Database Smart Flash Cache》
  • 《Oracle Database Concepts》有关Oracle数据库实例中的内存架构的更多信息
  • 《Oracle Database Reference》有关DB_BIG_TABLE_CACHE_PERCENT_TARGET初始化参数的更多信息
  • 《Oracle Database Reference》有关PARALLEL_DEGREE_POLICY初始化参数的更多信息
  • 《Oracle Database VLDB and Partitioning Guide》有关大表缓存的更多信息

四、使用自动内存管理(AMM)

您可以允许Oracle数据库实例自动管理和调优内存。

1 关于AMM

管理实例内存的最简单方法是允许Oracle数据库实例自动管理和调优它。要做到这一点(在大多数平台上),您只设置了目标内存大小初始化参数(MEMORY_TARGET)和可选的最大内存大小初始化参数(MEMORY_MAX_TARGET)。
基于MEMORY_TARGET的值,实例使用的总内存相对固定,实例自动分配系统全局区域(SGA)和实例程序全局区域(实例PGA)之间的内存。随着内存需求的变化,实例动态地重新分配SGA和实例PGA之间的内存。
当没有启用自动内存管理时,必须手动设置SGA和实例PGA。
因为MEMORY_TARGET初始化参数是动态的,所以您可以在不重新启动数据库的情况下随时更改MEMORY_TARGET。MEMORY_MAX_TARGET不是动态的,它可以作为一个上限,这样您就不会意外地将MEMORY_TARGET设置得过高,这样就可以为数据库实例留出足够的内存,以防将来需要增加总实例内存。因为某些SGA组件要么不能很容易地缩小,要么必须保持最小的大小,这个实例还可以防止您将MEMORY_TARGET设置得太低。
Note:
如果LOCK_SGA初始化参数为TRUE,则无法启用自动内存管理。有关此参数的信息,请参见《Oracle Database Reference》。
See Also:
  • 《Platforms That Support Automatic Memory Management》

2 启动AMM

如果您在数据库创建时没有启用自动内存管理(通过在DBCA中选择适当的选项或为CREATE DATABASE SQL语句设置适当的初始化参数),那么您可以在稍后的时间启用它。启用自动内存管理需要关闭和重新启动数据库。
启用自动内存管理:
  1. 启动SQL*Plus,并使用SYSDBA管理特权连接到Oracle数据库实例。
    参见“Connecting to the Database with SQL*Plus”和“Database Administrator Authentication”以获得指示。
  2. 计算MEMORY_TARGET的最小值如下:
    例如,如果SGA_TARGET是2.72 m, PGA_AGGREGATE_TARGET是90M,如果最大的PGA分配是120M,那么MEMORY_TARGET应该至少是392M (272M + 120M)。
    1. 通过输入以下SQL*Plus命令,确定当前的SGA_TARGET和PGA_AGGREGATE_TARGET的大小:
      SHOW PARAMETER SGA_TARGET
      
      NAME                                 TYPE        VALUE
      ------------------------------------ ----------- --------------------------
      sga_target                           big integer 272M
      
      SHOW PARAMETER PGA_AGGREGATE_TARGET
      
      NAME                                 TYPE        VALUE
      ------------------------------------ ----------- --------------------------
      pga_aggregate_target                 big integer 90M
      如果没有设置SGA_TARGET参数,请参见“Enabling Automatic Shared Memory Management”。
    2. 运行以下查询,以确定自数据库启动以来以 MB 为单位分配的最大实例PGA:
      SELECT VALUE/1048576 FROM V$PGASTAT WHERE NAME='maximum PGA allocated';
    3. 计算步骤2b和PGA_AGGREGATE_TARGET之间的查询结果之间的最大值。将SGA_TARGET添加到该值。
      MEMORY_TARGET = SGA_TARGET + MAX(PGA_AGGREGATE_TARGET, MAXIMUM PGA ALLOCATED)
  3. 选择要使用的MEMORY_TARGET的值。
    这可能是您在步骤2中计算的最小值,或者如果您有足够的物理内存,您可以选择使用更大的值。
  4. 对于MEMORY_MAX_TARGET初始化参数,决定您希望在可预见的将来分配到数据库的最大内存数量。也就是说,确定SGA和实例PGA大小的总和的最大值。这个数字可以大于或与您在上一步中选择的MEMORY_TARGET值相同。
  5. 做下列工作之一:
    • 如果您使用服务器参数文件启动Oracle数据库实例,如果您使用 DBCA 创建数据库,那么这是默认的,请输入以下命令:
      ALTER SYSTEM SET MEMORY_MAX_TARGET = nM SCOPE = SPFILE;
      其中n是在步骤4中计算的值。
      SCOPE = SPFILE 子句仅在服务器参数文件中设置值,而不为正在运行的实例设置值。您必须包含这个作用域子句,因为 MEMORY_MAX_TARGET 不是动态初始化参数。
    • 如果使用文本初始化参数文件启动实例,请手动编辑该文件,使其包含以下语句:
      memory_max_target = nM
      memory_target = mM
      其中n是在步骤4中确定的值,m是步骤3中确定的值。
      Note:
      在文本初始化参数文件中,如果省略了 MEMORY_MAX_TARGET 的行,并包含了 MEMORY_TARGET 的值,那么数据库会自动将MEMORY_MAX_TARGET  设置为 MEMORY_TARGET 的值。如果您省略了 MEMORY_TARGET 的行,并包含了 MEMORY_MAX_TARGET 的值,那么 MEMORY_TARGET 参数默认为零。启动后,您可以动态地将 MEMORY_TARGET 更改为非零值,前提是它不超过 MEMORY_MAX_TARGET 的值。

  6. 关闭并重启数据库
    有关说明,请参见“Starting Up and Shutting Down”。
  7. 如果使用服务器参数文件启动Oracle数据库实例,请输入以下命令:
    ALTER SYSTEM SET MEMORY_TARGET = nM;
    ALTER SYSTEM SET SGA_TARGET = 0;
    ALTER SYSTEM SET PGA_AGGREGATE_TARGET = 0;
    其中n是步骤3中确定的值。
Note:
使用MEMORY_TARGET设置,SGA_TARGET设置成为SGA的最小大小,PGA_AGGREGATE_TARGET设置成为实例PGA的最小大小。通过将这两个值设置为零,就可以看到没有最小值,只要它们的和小于或等于MEMORY_TARGET设置,SGA和实例PGA就可以增长。SQL工作区域的规模仍然是自动的。
您可以省略将SGA_TARGET和PGA_AGGREGATE_TARGET参数值设置为0,并将其中一个或两个值作为正数。在这种情况下,值作为SGA或实例PGA大小的最小值。
此外,您可以使用 PGA_AGGREGATE_LIMIT 初始化参数来为PGA内存设置实例范围的硬限制。您可以设置PGA_AGGREGATE_LIMIT是否使用自动内存管理。参见“Using Automatic PGA Memory Management”。
See Also:
  • 《About Automatic Memory Management》
  • 《Memory Architecture Overview》
  • 《Oracle Database SQL Language Reference》有关ALTER SYSTEM SQL语句的信息

3 监控 & 调优AMM

动态性能视图V$MEMORY_DYNAMIC_COMPONENTS显示所有动态调整的内存组件的当前大小,包括SGA和实例PGA的总大小。
  • 查询V$MEMORY_TARGET_ADVICE视图,为MEMORY_TARGET初始化参数提供调优建议。
例如,运行以下查询:
SQL>  select * from v$memory_target_advice order by memory_size;
 
MEMORY_SIZE MEMORY_SIZE_FACTOR ESTD_DB_TIME ESTD_DB_TIME_FACTOR    VERSION
----------- ------------------ ------------ ------------------- ----------
        180                 .5          458               1.344          0
        270                .75          367              1.0761          0
        360                  1          341                   1          0
        450               1.25          335               .9817          0
        540                1.5          335               .9817          0
        630               1.75          335               .9817          0
        720                  2          335               .9817          0
与MEMORY_SIZE_FACTOR(1)的行显示内存的当前大小,由MEMORY_TARGET初始化参数设置,以及完成当前工作负载所需的DB时间。在前面和后面的行中,结果显示了几种替代MEMORY_TARGET大小。对于每个可选的大小,数据库显示了大小因素(当前大小的倍数),以及如果MEMORY_TARGET参数更改为可选的大小,则估计来完成当前工作负载所需的DB时间。注意,对于总内存大小小于当前MEMORY_TARGET大小的,估计DB时间增加。请注意,在本例中,增加总内存大小超过450MB是没有任何好处的。但是,如果还没有运行完整的工作负载,这种情况可能会发生变化。
EM Express提供了一个易于使用的图形内存顾问,帮助您为MEMORY_TARGET选择最佳大小。详见《Oracle Database 2 Day DBA》。
See Also:
  • 《Oracle Database Reference》有关V$MEMORY_DYNAMIC_COMPONENTS动态性能视图的更多信息
  • 《Oracle Database Reference》有关V$MEMORY_TARGET_ADVICE动态性能视图的更多信息
  • 《Oracle Database Performance Tuning Guide》对于DB时间的定义

五、配置手动内存管理

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

1 关于手动内存管理

对于SGA,有两种不同的手动内存管理方法,还有两个用于实例PGA。
SGA的两种手动内存管理方法在DBA所需的工作量和知识方面有所不同。使用自动共享内存管理,您可以为SGA设置目标和最大大小。然后,数据库将SGA的总大小设置为指定的目标,并动态调整许多SGA组件的大小。通过手动共享内存管理,您可以设置几个单独的SGA组件的大小,从而确定总体的SGA大小。然后您可以在持续的基础上手动调整这些SGA组件。
对于实例PGA,有自动PGA内存管理,在其中设置了实例PGA的目标大小。然后,数据库将实例PGA的大小设置为目标,并动态地优化各个PGA的大小。也有手动PGA内存管理,您可以为每种类型的SQL操作设置最大 Work Area 大小(例如 sort 或 hash join)。这种内存管理方法虽然支持,但不推荐使用。
See Also:
  • 《Oracle Database Concepts》有关Oracle数据库内存管理方法的概述

2 使用自动共享内存管理(ASMM)

ASMM 简化了SGA内存管理。
See Also:
  • 《Oracle Database Performance Tuning Guide》有关优化SGA组件的信息

2.1 关于ASMM

使用 ASMM,您可以使用 SGA_TARGET 初始化参数指定一个实例可用的SGA内存总量,Oracle数据库会自动在各种SGA组件之间分配该内存,以确保最有效的内存利用率。
在启用 ASMM 时,不同SGA组件的大小是灵活的,可以适应工作负载的需要,而不需要任何额外的配置。数据库自动将可用内存分配到所需的各个组件中,从而允许系统最大化地使用所有可用的SGA内存。
如果您使用的是服务器参数文件(SPFILE),那么数据库会记住在实例关闭时自动调整的SGA组件的大小。因此,每次启动实例时,数据库实例不需要再次学习工作负载的特性。该实例可以从先前实例的信息开始,并继续评估在上次关闭时中断的工作负载。

2.2 SGA中的组件和颗粒

SGA包含几个内存组件,它们是用来满足特定类别的内存分配请求的内存池。
内存组件的例子包括 Shared Pool(用于为SQL和PL/SQL执行分配内存)、 Java Pool(用于java对象和其他java执行内存)和 Buffer Cache(用于缓存磁盘块)。所有SGA组件在颗粒单元中分配和释放空间。Oracle数据库跟踪SGA内存在每个SGA组件的内部颗粒数中的使用情况。
SGA中动态组件的内存是在颗粒单元中分配的。粒度由实例启动时请求的SGA内存数量决定。具体来说,颗粒大小是基于SGA_MAX_SIZE初始化参数的值。表 1 显示了不同数量的SGA存储器的颗粒大小。

表 1:颗粒大小

SGA 内存大小颗粒大小
小于等于1G4 MB
大于1G且小于等于8G16 MB
大于8G且小于等于16G32 MB
大于16G且小于等于32G64 MB
大于32G且小于等于64G128 MB
大于64G且小于等于128G256 MB
大于128G512 MB

可能会出现一些平台依赖性。有关更多细节,请参考您的操作系统特定文档。
您可以查询V$SGAINFO视图,以查看实例使用的粒度。SGA中的所有组件都使用相同的颗粒大小。
如果您为一个不是多个粒度大小的组件指定一个大小,Oracle数据库将指定的大小轮到最近的倍数。例如,如果颗粒大小为4 MB,并且指定 DB_CACHE_SIZE 为10 MB,那么数据库实际上分配了12 MB。

2.3 设置 SGA 最大大小

SGA_MAX_SIZE 初始化参数指定实例生命周期内的 SGA 的最大大小。
设置 SGA 的最大大小:
  • 设置SGA_MAX_SIZE初始化参数。
你可以动态修改初始化参数影响Buffer Caches、Shared Pool、Large Pool、Java Pool 和 Streams Pool 的大小,但仅限于这些大小的和以及SGA的其他组件(固定SGA、变量SGA和 Redo Log Buffers)的大小不超过 SGA_MAX_SIZE 指定的值。
如果您没有指定SGA_MAX_SIZE,那么Oracle数据库将选择一个默认值,该值是在初始化时指定或默认的所有组件的总和。如果你指定SGA_MAX_SIZE,当初始化数据库时,该值小于为所有组件分配的内存之和,在参数文件中明确或默认情况下,数据库会忽略了SGA_MAX_SIZE,并为这个参数选择正确的值。

2.4 设置 SGA 目标大小

通过将SGA_TARGET初始化参数设置为非零值,可以启用 ASMM 特性。这个参数设置了SGA的总大小。它取代了控制分配给一组特定组件的内存的参数,这些组件现在根据需要自动和动态调整大小。
启用 ASMM 功能:
  • 将SGA_TARGET初始化参数设置为非零值。
Note:
  • STATISTICS_LEVEL 初始化参数必须设置为 TYPICAL (默认的)或 ALL,以便 ASMM 工作。
  • 启用 ASMM 的一种更简单的方法是使用EM Express。当启用 ASMM 并设置总SGA大小时,EM Express自动生成 ALTER SYSTEM 语句,将 SGA_TARGET 设置为指定的大小,并将所有自动大小的SGA组件设置为零。有关更多信息,请参见“Oracle Database 2 Day DBA”。
如果您使用SQL*Plus来设置SGA_TARGET,那么您必须将自动大小的SGA组件设置为零或最小值。
2.4.1 SGA目标和自动大小的SGA组件
一些SGA组件在设置SGA_TARGET 时会自动调整大小。
下表列出了在设置 SGA_TARGET 时自动调整大小的SGA组件。对于每个SGA组件,列出了其相应的初始化参数。 

表 2:自动调整SGA组件和相应的参数

SGA 组件初始化参数
修正了Oracle数据库实例所需的SGA和其他内部分配N/A
shared poolSHARED_POOL_SIZE
large poolLARGE_POOL_SIZE
Java poolJAVA_POOL_SIZE
buffer cacheDB_CACHE_SIZE
Streams poolSTREAMS_POOL_SIZE

如果设置了表 3 中列出的手动大小的参数,则从 SGA_TARGET 获取它们的内存,保留表 2 中列出的组件可用的内存。

表 3 使用 SGA_TARGET 空间的手动大小的SGA组件

SGA 组件初始化参数
log bufferLOG_BUFFER
keep buffer cache 和 recycle buffer cacheDB_KEEP_CACHE_SIZE
DB_RECYCLE_CACHE_SIZE
非标准块大小 buffer cacheDB_nK_CACHE_SIZE

除了将SGA_TARGET设置为非零值之外,还必须将表 2 中列出的所有初始化参数设置为零,以启用自动调整大小的SGA组件的自动调整。
或者,您可以将一个或多个自动大小的SGA组件设置为非零值,然后在SGA调优中作为该组件的最小设置。本节后面将详细讨论这个问题。
2.4.2 SGA 和虚拟内存
为了在大多数系统中获得最佳性能,整个SGA应该适合于实际内存。如果不这样做,如果使用虚拟内存来存储部分内容,那么整个数据库系统的性能就会显著下降。原因是SGA的部分被操作系统分页(写入并从磁盘读取)。
有关监视分页活动的说明,请参阅操作系统文档。还可以使用云控制查看分页活动。有关更多信息,请参见《Oracle Database 2 Day》 + 《Performance Tuning Guide》。
2.4.3 监控和调优 SGA 目标大小
V$SGAINFO视图提供关于各种SGA组件的当前调整大小的信息。V$SGA_TARGET_ADVICE视图提供了帮助您确定SGA_TARGET值的信息。
监视和调整SGA目标尺寸:
  • 查询V$SGAINFO和V$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 视图中为自动内存管理提供的信息类似。请参阅 “Monitoring and Tuning Automatic Memory Management” 以解释该视图。
EM Express提供了一个易于使用的图形内存顾问,帮助您为 SGA_TARGET 选择最佳大小。详见“Oracle Database 2 Day DBA”。
See Also:
  • 《Oracle Database Reference》有关V$SGAINFO视图的更多信息
  • 《Oracle Database Reference》有关V$SGA_TARGET_ADVICE视图的更多信息

2.5 启用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}]
    其中值是在步骤1中计算的值,或者是所有SGA组件大小总和和 SGA_MAX_SIZE 之间的某个值。有关ALTER SYSTEM语句及其范围子句的更多信息,请参见《Oracle Database SQL Language Reference》。
  3. 执行下列操作之一:
    • 对于更完整的自动调优,将表 2 中列出的自动大小的SGA组件的值设置为零。通过编辑文本初始化参数文件或通过发出 ALTER SYSTEM 语句来实现这一点。
    • 要控制一个或多个自动大小的SGA组件的最小大小,请将这些组件大小设置为所需的值。(详情请参阅下一节。)将其他自动大小的 SGA 组件的值设置为零。通过编辑文本初始化参数文件或通过发出 ALTER SYSTEM 语句来实现这一点。
从自动内存管理更改为ASMM:
  1. 设置 MEMORY_TARGET 初始化参数为 0。
    ALTER SYSTEM SET MEMORY_TARGET = 0;
    数据库设置SGA_TARGET基于当前的SGA内存分配。
  2. 执行下列操作之一:
    • 对于更完整的自动调优,将表 2 中所列的自动大小的SGA组件的大小设置为0。通过编辑文本初始化参数文件或通过发出ALTER SYSTEM语句来实现这一点。
    • 要控制一个或多个自动大小的SGA组件的最小大小,请将这些组件大小设置为所需的值。(详情请参阅下一节。)将其他自动大小的SGA组件的大小设置为零。通过编辑文本初始化参数文件或通过发出ALTER SYSTEM语句来实现这一点。
示例 1:使用 ASMM
例如,假设您当前配置了一个用于手动共享内存管理的实例的参数配置,而 SGA_MAX_SIZE 设置为 1200M:
  • SHARED_POOL_SIZE = 200
  • DB_CACHE_SIZE = 500
  • LARGE_POOL_SIZE = 200

还假设有以下查询结果:

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

通过发布以下语句,您可以利用ASMM:
ALTER 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 = 1200米- 208M。

2.6 为自动大小的SGA组件设置最小值

您可以通过为这些组件对应的参数指定最小值来控制自动大小的SGA组件的大小。如果您知道应用程序不能在特定组件中的最小内存量正常运行,那么这样做是有用的。
若要为组件指定最小SGA空间,请执行以下操作:
  • 为其相应的初始化参数设置一个值。 
手动限制一个或多个自动大小组件的最小大小可以减少可用于动态调整的内存总量。这种减少反过来限制了系统适应工作量变化的能力。因此,除例外情况外,不建议采取这种做法。默认的自动管理行为可以最大化系统性能和可用资源的使用。
Related Topics
  • The SGA Target and Automatically Sized SGA Components

2.7 动态修改SGA_TARGET

SGA_TARGET 参数可以动态地增加到为 SGA_MAX_SIZE 参数指定的值,也可以减少它。
如果您减少了 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 = 1024M
  • SGA_TARGET = 512M
  • DB_8K_CACHE_SIZE = 128M
在这个示例中,SGA_TARGET的值可以调整到1024M,并且也可以减少,直到一个或多个自动大小的组件达到最小大小为止。确切的数值取决于环境因素,如系统上的cpu数量。但是,DB_8K_CACHE_SIZE的值始终保持在128M。
Note:
在启用 ASMM 时,最好在启动数据库之前将SGA_TARGET设置为所需的非零值。动态修改SGA_TARGET从零到非零值可能无法达到预期的结果,因为共享池可能无法收缩。启动后,您可以根据需要动态调整SGA_TARGET。

2.8 为自动大小的组件修改参数

当启用 ASMM 时,手动指定大小的自动大小的组件可以作为组件大小的下界。您可以通过改变相应参数的值来动态修改这个限制。
如果给定SGA组件的大小的指定下限小于其当前大小,那么该组件的大小不会立即发生变化。新设置仅将自动调整算法限制在将来减小最小大小的范围内。
为组件的大小设置下界:
  • 将组件的初始化参数设置为最小值。
例如,考虑以下配置:
  • SGA_TARGET = 512M
  • LARGE_POOL_SIZE = 256M
  • 当前实际 large pool 大小 = 284M
在本例中,如果将 LARGE_POOL_SIZE 的值增加到大于该组件的实际当前大小的值,则系统将扩展该组件以适应增加的最小大小。例如,如果将 LARGE_POOL_SIZE 的值增加到 300M,那么系统会逐渐的增加 large pool,直到达到300M。这种调整是以牺牲一个或多个自动调整组件为代价的。如果将 LARGE_POOL_SIZE 的值减少到 200M,则该组件的大小不会立即发生变化。新的设置只限制了大池的尺寸在未来为 200 M。
Note:
如果没有设置 SGA_TARGET,则不会启用 ASMM 功能。因此,控制所有组件参数的大小的规则与之前的版本相同。

2.9 修改手动大小组件的参数

手动大小的组件的参数也可以动态更改。但是,参数的值不是设置最小大小,而是指定相应组件的精确大小。 
当您增加手动大小组件的大小时,额外的内存将从一个或多个自动大小的组件中移除。当您减小手工大小的组件的大小时,释放的内存将被分配给自动大小的组件。
若要修改组件的精确大小,请执行以下操作: 
  • 为组件设置初始化参数。
例如,考虑以下配置:
SGA_TARGET = 512M
DB_8K_CACHE_SIZE = 128M
在本例中,通过增加 DB_8K_CACHE_SIZE 16M 到 144M 意味着将16M从自动大小的组件中删除。同样地,减少 DB_8K_CACHE_SIZE 16M 到112M 意味着16M被赋予自动大小的组件。

3 使用手动共享内存管理

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

3.1 关于手动共享内存管理

如果您决定不使用 AMM 或 ASMM,那么您必须手动配置多个SGA组件大小,然后在数据库工作负载变化时监视和调整这些大小。您可以遵循有关设置控制这些SGA组件大小的参数的准则。
如果使用DBCA创建数据库并选择手动共享内存管理,DBCA提供了必须为 Buffer Cache、Shared Pool、Large Pool 和 Java Pool 输入大小。然后在服务器参数文件(SPFILE)中设置相应的初始化参数。如果使用 CREATE DATABASE SQL语句和文本初始化参数文件创建数据库,您可以执行以下操作之一:
  • 为设置SGA组件大小的初始化参数提供值。
  • 从文本初始化文件中省略SGA组件大小参数。Oracle数据库为您没有设置的任何组件选择合理的默认值。

3.2 启用手动共享内存管理

没有初始化参数本身就启用了手动共享内存管理。通过禁用 AMM 和 ASMM,可以有效地启用手动共享内存管理。 
启用手动共享内存管理:
  1. 将 MEMORY_TARGET 初始化参数设置为0。 
  2. 将 SGA_TARGET 初始化参数设置为0。
您必须为各种SGA组件设置值,如下节所述。

3.3 设置 Buffer Cache 初始化参数

buffer cache 初始化参数确定SGA的 buffer cache 组件的大小。
您可以使用它们为数据库使用的各种大小的块指定缓存的大小。这些初始化参数都是动态的。
buffer cache 的大小影响性能。较大的缓存大小通常会减少磁盘读写的次数。但是,大型缓存可能占用过多的内存,导致内存分页或交换。
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
每个参数指定对应块大小的缓存大小。
Note:
特定于平台的限制适用于最大块大小,因此在某些平台上可能不允许其中的一些大小。
32K的块大小只在64位平台上有效。
See Also:
  • 《Specifying Nonstandard Block Sizes for Tablespaces》
3.3.1 设置块和缓冲大小的例子
一个示例说明了设置块和缓存大小。
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缓存,大小分别为256 MB和512 MB。
Note:
不能使用DB_nK_CACHE_SIZE参数对标准块大小的缓存进行大小调整。如果DB_BLOCK_SIZE的值是nK,那么设置DB_nK_CACHE_SIZE是无效的。标准块大小的缓存大小总是由DB_CACHE_SIZE的值决定。

缓存的大小是有限的,所以磁盘上的所有数据都不能放入缓存中。当缓存满时,随后的缓存丢失会导致Oracle数据库将缓存中的脏数据写入磁盘,以便为新数据腾出空间。(如果缓冲区不脏,则不需要将它写到磁盘上,然后在缓冲区中读取一个新的块。)随后对写入到磁盘的任何数据的访问,然后覆盖额外的缓存遗漏的结果。
缓存的大小影响到对数据的请求导致缓存命中的可能性。如果缓存很大,则更有可能包含请求的数据。增加缓存的大小会增加导致缓存命中的数据请求的百分比。
您可以在实例运行时更改 buffer cache 的大小,而不必关闭数据库。使用ALTER SYSTEM语句执行此操作。
使用视图V$BUFFER_POOL来跟踪不同的缓存组件的大小和任何挂起的大小调整操作。
3.3.2 多个缓冲池
您可以使用单独的缓冲池配置数据库 buffer cache,这些缓冲池要么将数据保存在缓冲区缓存中,要么在使用数据块后立即使缓冲区可用于新数据。
然后,可以将特定的模式对象(表、簇、索引和分区)分配给适当的缓冲池,以控制其数据块在缓存之外的使用方式。
  • KEEP 缓冲池将模式对象的数据块保留在内存中。 
  • RECYCLE 缓冲池一旦不再需要数据块,就会从内存中清除数据块。 
  • DEFAULT 缓冲池包含没有分配给任何缓冲池的架构对象的数据块,以及显式分配给 DEFAULT 池的架构对象。
配置 KEEP 和 RECYCLE 缓冲池的初始化参数是 DB_KEEP_CACHE_SIZE 和 DB_RECYCLE_CACHE_SIZE。
Note:
多个缓冲池仅对标准块大小可用。非标准块大小缓存有一个 DEFAULT 池。
See Also:
  • 《Oracle Database Performance Tuning Guide》有关调整 buffer cache 的信息和有关多个 buffer cache 的更多信息

3.4 指定 Shared Pool 大小

SHARED_POOL_SIZE 初始化参数是一个动态参数,它允许您指定或调整 SGA 共享池组件的大小。Oracle数据库选择适当的默认值。
在 Oracle Database 10g 之前发布的版本中,分配的共享池内存的数量等于 SHARED_POOL_SIZE 初始化参数的值加上实例启动时计算的内部 SGA 开销的数量。内部 SGA 开销是指在启动时由 Oracle 数据库分配的内存,基于其他几个初始化参数的值。此内存用于维护 SGA 中不同服务器组件的状态。例如,如果 SHARED_POOL_SIZE 参数设置为 64MB,而内部 SGA 开销被计算为12MB,那么 Shared Pool 的实际大小为 64+12=76MB,尽管SHARED_POOL_SIZE 参数的值仍然显示为64MB。
从 Oracle Database 10g 开始,内部 SGA 开销的大小包含在 SHARED_POOL_SIZE 的用户指定值中。如果您没有使用 AMM 或 ASMM,那么在启动时分配的 shared pool 内存的数量等于 SHARED_POOL_SIZE 初始化参数的值,将其集中到粒度大小的倍数。因此,您必须设置此参数,以便它包括内部的SGA开销,以及 Shared Pool 大小所需的值。在前面的例子中,如果 SHARED_POOL_SIZE 参数在启动时设置为 64MB,那么在启动后可用的 shared pool 是 64-12=52MB,假设内部SGA开销的值保持不变。为了在启动后为 Shared Pool 内存维护 64MB 的有效值,必须将 SHARED_POOL_SIZE 参数设置为 64+12=76MB。
当从比 Oracle 数据库 10g 更早的版本迁移时,Oracle数据库 12c 迁移实用程序根据升级前环境中的内部SGA开销的值以及该参数的旧值,推荐该参数的新值。从Oracle Database 10g开始,内部SGA开销的确切值,也称为 Shared Pool 中的启动开销,可以从V$SGAINFO视图查询。另外,在手动共享内存管理模式中,如果 SHARED_POOL_SIZE 的用户指定值太小,甚至不能满足内部 SGA 开销的要求,那么 Oracle 数据库在启动时生成 ORA-00371 错误,建议值用于 SHARED_POOL_SIZE 参数。当在 Oracle Database 12c 中使用 ASMM 时,共享池会自动调优,并且不会生成ORA-00371错误。
3.4.1 Result Cache 和 Shared Pool Size
Result Cache 从 Shared Pool 中获取其内存。因此,如果您希望增加 Result Cache 最大大小,则在调整 Shared Pool 的大小时要考虑到这一点。
See Also:
  • 《Specifying the Result Cache Maximum Size》

3.5 指定 Large Pool 大小

LARGE_POOL_SIZE 初始化参数是一个动态参数,允许您指定或调整 SGA 的 Large Pool 组件的大小。
Large Pool 是SGA的一个可选组件。您必须特别设置 LARGE_POOL_SIZE 参数以创建一个 Large Pool。配置 Large Pool 将在《Oracle Database Performance Tuning Guide》中讨论。

3.6 指定 Java Pool 大小

JAVA_POOL_SIZE 初始化参数是一个动态参数,允许您指定或调整SGA的 Java Pool 组件的大小。
Oracle 数据库选择适当的默认值。Java Pool 的配置在《Oracle Database Java Developer's Guide》中进行了讨论。

3.7 指定 Streams Pool 大小

STREAMS_POOL_SIZE 初始化参数是一个动态参数,允许您指定或调整 SGA 的 Streams Pool 组件的大小。
如果 STREAMS_POOL_SIZE 设置为0,那么Oracle Streams产品在需要时将内存从 buffer cache 传输到 Streams Pool。有关详细信息,请参阅《Oracle Streams Replication Administrator's Guide.》的讨论。

3.8 指定 Result Cache 最大大小

RESULT_CACHE_MAX_SIZE 初始化参数是一个动态参数,允许您指定SGA的 Result Cache 组件的最大大小。
通常,不需要指定此参数,因为数据库根据 SGA 可用的总内存和当前使用的内存管理方法选择默认的最大大小。您可以通过显示 RESULT_CACHE_MAX_SIZE 参数的值来查看当前的默认最大大小。若要更改此最大大小,可以使用 ALTER SYSTEM 语句设置RESULT_CACHE_MAX_SIZE,也可以在文本初始化参数文件中指定此参数。在每种情况下,该值都被舍入到最接近的32K倍数。
如果在实例启动时 RESULT_CACHE_MAX_SIZE 为0,则 Result Cache 将被禁用。要重新启用它,您必须将 RESULT_CACHE_MAX_SIZE 设置为非零值(或从文本初始化参数文件中删除此参数以获得默认的最大大小),然后重新启动数据库。
请注意,如果使用 ALTER SYSTEM 语句将 RESULT_CACHE_MAX_SIZE 设置为非零值,但不重新启动数据库,则查询 RESULT_CACHE_MAX_SIZE 参数的值返回非零值,即使 Result Cache 仍处于禁用状态。因此,RESULT_CACHE_MAX_SIZE 的值不是确定 Result Cache 是否已启用的最可靠的方式。您可以改用以下查询:
SELECT dbms_result_cache.status() FROM dual;

DBMS_RESULT_CACHE.STATUS()
---------------------------------------------
ENABLED
Result Cache 从 Shared Pool 获取其内存,因此,如果您增加了最大 Result Cache 大小,也可以考虑增加 Shared Pool 大小。
视图 V$RESULT_CACHE_STATISTICS 和 PL/SQL 包过程 DBMS_RESULT_CACHE.MEMORY_REPORT 显示信息,以帮助您确定当前分配给结果缓存的内存量。
PL/SQL 包函数 DBMS_RESULT_CACHE.FLUSH 清除 Result Cache 并将所有内存释放回 Shared Pool。
See Also:
  • 《Oracle Database Performance Tuning Guide》有关结果缓存的更多信息
  • 《Oracle Database PL/SQL Packages and Types Reference》有关 DBMS_RESULT_CACHE 包过程和函数的更多信息
  • 《Oracle Database Reference》更多关于视图 V$RESULT_CACHE_STATISTICS 的信息。
  • 《Oracle Real Application Clusters Administration and Deployment Guide》有关设置群集数据库的 RESULT_CACHE_MAX_SIZE 的信息。

3.9 指定SGA中其它项的初始化参数

您可以设置一些额外的初始化参数来控制SGA如何使用内存。
3.9.1 物理内存
LOCK_SGA参数,当设置为 TRUE 时,将整个SGA锁定到物理内存中。
此参数不能用于自动内存管理。
See Also:
  • 《Oracle Database Reference》有关这些初始化参数的更多信息
  • 《Using Automatic Memory Management》
  • 《Using Automatic Shared Memory Management》
3.9.2 SGA 开始地址
SHARED_MEMORY_ADDRESS 和 HI_SHARED_MEMORY_ADDRESS 参数指定运行时SGA的起始地址。
这些参数很少使用。对于64位平台,HI_SHARED_MEMORY_ADDRESS 指定64位地址的高阶32位.
See Also:
  • 《Oracle Database Reference》有关 SHARED_MEMORY_ADDRESS 初始化参数的更多信息
  • 《Oracle Database Reference》有关 HI_SHARED_MEMORY_ADDRESS 初始化参数的更多信息
  • 《Using Automatic Memory Management》
  • 《Using Automatic Shared Memory Management》

4 使用自动 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 Work Area 的大小调整是自动的,并且忽略了所有 *_AREA_SIZE 初始化参数。在任何给定时间,实例上活动 Work Area可用的 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 数据库将确定适当的默认限制。有关此参数的详细信息,请参阅《Oracle Database Reference》。
Note:
自动PGA内存管理方法适用于由专用和共享服务器进程分配的工作区。有关专用和共享服务器模式下 PGA 内存分配的信息,请参阅《Oracle Database Concepts》。
See Also:
  • 《Oracle Database Reference》有关本节中描述的初始化参数和视图的信息
  • 《Oracle Database Performance Tuning Guide》有关使用本节中描述的视图的信息

5 使用手动 PGA 内存管理

Oracle数据库支持手动PGA内存管理,在其中手动优化SQL Work Area。
在比 Oracle 数据库 10g 更早的版本中,数据库管理员通过设置以下参数来控制 SQL Work Area 的最大大小:SORT_AREA_SIZE、HASH_AREA_SIZE、BITMAP_MERGE_AREA_SIZE 和 CREATE_BITMAP_AREA_SIZE。设置这些参数是困难的,因为理想的情况是从数据输入大小和系统中活动的工作区总数中选择最大工作区大小。这两个因素在不同的 Work Area 和不同的时间有很大的不同。因此,在最好的情况下,各种 *_AREA_SIZE 参数很难调优。
因此,Oracle强烈建议您启用自动PGA内存管理。
如果您决定手动调优SQL工作区,则必须将 WORKAREA_SIZE_POLICY 初始化参数设置为手动。
Note:
初始化参数 WORKAREA_SIZE_POLICY 是一个会话级和系统级参数,只能接受两个值:MANUAL 或 AUTO。默认是 AUTO。您可以设置 PGA_AGGREGATE_TARGET,然后来回切换,从自动内存管理模式切换到手动内存管理模式。当 WORKAREA_SIZE_POLICY 设置为 AUTO 时,您对 *_AREA_SIZE 参数的设置将被忽略。

六、使用强制全库缓存模式

Oracle数据库实例可以在 buffer cache 中缓存整个数据库。
Note:
此特性可从Oracle数据库12c第1版(12.1.0.2)开始。

1 关于强制全库缓存模式

在默认缓存模式下,当用户查询大型表时,Oracle数据库并不总是缓存底层数据,因为这样做可能会从缓冲区缓存中删除更多有用的数据。从Oracle Database12c第1版(12.1.0.2)开始,如果Oracle数据库实例确定缓冲区缓存中有足够的空间缓存完整数据库,并且这样做是有益的,那么实例将自动将完整数据库缓存在缓冲区缓存中。
在 buffer cache 中缓存整个数据库可能会提高性能。可以使用 ALTER DATABASE FORCE FULL DATABASE CACHING 语句强制实例在 buffer cache 中缓存数据库。此语句使实例生效完全数据库缓存模式。在这种模式下,Oracle数据库假设 buffer cache 足够大,足以缓存整个数据库,并尝试缓存随后访问的所有块。
当Oracle数据库实例生效的完全数据库缓存模式时,以下查询返回是:
SELECT FORCE_FULL_DB_CACHING FROM V$DATABASE;
当实例处于默认缓存模式时,NOCACHE LOB不会缓存在 buffer cache 中。但是,当实例生效时,可以在缓冲区缓存中缓存NOCACHE LOB。另外,使用 SecureFiles LOB 存储的 LOB 和使用 BasicFiles LOB 存储的 LOB 都可以在 buffer cache 中缓存,而只能强制完全数据库缓存模式。
Note:
当一个实例被强制执行完全数据库缓存模式时,数据库对象不会立即加载到缓冲区缓存中。相反,当它们被访问时,缓存在缓冲区缓存中。
在一个多租户环境,强制全数据库缓存模式应用于整个多租户数据库(CDB)的容器,包括所有的可插拔数据库(PDB)。
关于强制全库缓存模式的信息存储在控制文件中。如果替换或重新创建控制文件,则有关“完全数据库缓存模式”的信息将丢失。还原的控制文件可能包含或可能不包含此信息,这取决于备份控制文件的时间。
See Also:
  • 《Managing a Multitenant Environment》
  • 《Managing Control Files》
  • 《Oracle Database Performance Tuning Guide》有关何时使用强制全数据库缓存模式的信息

2 启用强制全库缓存模式之前

数据库必须处于 12.0.0 或更高的兼容性级别,以启用数据库实例的强制完整数据库缓存模式。此外,请确保缓冲区缓存足够大,可以缓存整个数据库。
当数据库配置为使用 SGA_TARGET 或 MEMORY_TARGET 初始化参数进行自动内存管理时,buffer cache 的大小可能会根据工作负载的不同而改变。在实例处于正常工作负载下时,运行以下查询来估计 buffer cache 大小:
SELECT NAME, BYTES FROM V$SGAINFO WHERE NAME='Buffer Cache Size';
此查询返回所有可能块大小的 buffer cache 大小。如果数据库使用多个块大小,则最好确保每个可能块大小的缓冲区高速缓存大小大于块大小的总数据库大小。
可以使用 DB_nK_CACHE_SIZE 初始化参数确定非默认块大小的 buffer cache 大小。对于 SGA_TARGET 或 MEMORY_TARGET,默认池中默认块大小的 buffer cache 大小可能会根据工作负载的不同而改变。以下查询返回默认池中当前默认块大小的缓冲区缓存大小:
SELECT COMPONENT, CURRENT_SIZE
  FROM V$SGA_DYNAMIC_COMPONENTS 
 WHERE COMPONENT LIKE 'DEFAULT buffer cache';
如果您正在评估在 buffer cache 中完全运行数据库所需的内存,那么可以将缓冲区缓存的大小估计为以下内容之一:
  • 如果您计划使用 SGA_TARGET,则可以估计缓冲区缓存大小为 SGA_TARGET 的60%。
  • 如果计划使用 MEMORY_TARGET,则可以估计 SGA 大小为 MEMORY_TARGET 的 60%,缓冲区缓存大小为 SGA 大小的60%。也就是说,您可以将缓冲区缓存大小估计为 MEMORY_TARGET 的 36%。
See Also:
  • 《Using Automatic Memory Management》

3 启用强制全库缓存模式

可以为数据库启用强制完全数据库缓存模式。
  1. 以具有 ALTER DATABASE 系统特权的用户身份连接到实例。
  2. 确保数据库 mounted 状态。
    参照《Starting an Instance and Mounting a Database》
  3. 发出以下SQL语句:
    ALTER DATABASE FORCE FULL DATABASE CACHING;
  4. (可选)打开数据库:
    ALTER DATABASE OPEN;

4 禁用强制全库缓存模式

你可以为一个数据库禁用力全数据库缓存模式。
  1. 以具有 ALTER DATABASE 系统特权的用户身份连接到实例。
  2. 确保数据库 mounted 状态。
    参照《Starting an Instance and Mounting a Database》
  3. 发出以下SQL语句:
    ALTER DATABASE NO FORCE FULL DATABASE CACHING;
  4. (可选)打开数据库:
    ALTER DATABASE OPEN;

七、配置数据库 Smart Flash Cache

数据库 Smart Flash Cache 功能是利用固态设备(SSD)技术对数据库缓冲区缓存的透明扩展。数据库 Smart Flash Cache 可以大大提高 Oracle 数据库的性能,减少磁盘I/O的数量,成本比增加等效的RAM要低得多。
See Also:
  • 《Memory Architecture Overview》数据库 Smart Flash Cache 的描述

1 什么时候配置数据库Smart Flash Cache

当满足某些条件时,应考虑配置数据库 Smart Flash Cache。
当下列所有条件都为真时,请考虑添加数据库 Smart Flash Cache:
  • 您的数据库正在Solaris或Oracle Linux操作系统上运行。数据库 Smart Flash Cache 只支持操作系统。 
  • 自动工作负载存储库(AWR)报告或STATSPACK报告中的 Buffer Pool 咨询部分表明,buffer cache 的大小翻倍是有益的。 
  • DB文件顺序读取是一个 top 等待事件。
  • 你有多余的CPU。
Note:
您不能在多个实例之间共享一个闪存文件。但是,如果使用逻辑卷管理器或类似工具静态地对闪存设备进行分区,则可以在多个实例之间共享单个闪存设备。

2 数据库Smart Flash Cache大小

一般情况下,数据库 Smart Flash Cache 的大小为 buffer cache 大小的2倍至10倍。
少于两倍的乘数都不会带来任何好处。如果您使用的是 ASMM,请使数据库 Smart Flash Cache 在 SGA_TARGET 大小的 2 到 10 倍之间。使用 80%的 SGA_TARGET 大小,而不是完整的大小,也足以进行此计算。

3 为数据库 Smart Flash Cache 优化内存

对于从 buffer cache 移动到数据库 Smart Flash Cache 的每个数据库块,在 buffer cache 中保存了少量关于该块的元数据。
对于单个实例数据库,元数据大约消耗100字节。对于Oracle实际应用程序集群(Oracle RAC)数据库,它更接近200字节。因此,在添加数据库 Smart Flash Cache 时,必须考虑到这个额外的内存需求。
要调优数据库 Smart Flash Cache 的内存,请完成以下操作之一:
  • 如果您手动管理内存,那么将 buffer cache 的大小增加大约等于配置的数据库块的数量,乘以100 (Oracle RAC的200)。
  • 如果您使用的是 AMM,那么使用上面描述的算法增加 MEMORY_TARGET 初始化参数的大小。您可能首先需要增加 MEMORY_MAX_TARGET 初始化参数的大小。
  • 如果使用 ASMM,则增加SGA_TARGET初始化参数的大小。
另外,对于使用闪存缓存的Oracle RAC数据库,必须为全局缓存服务(GCS)资源的 shared pool 分配额外的内存。每个GCS资源在 shared pool 中需要大约208个字节。
Note:
  • 您可以选择不增加 buffer cache 大小来说明数据库 Smart Flash Cache。在这种情况下,buffer cache 的有效大小会减少。在某些情况下,您可以使用更大的数据库 Smart Flash Cache 来弥补这一损失。
  • 您可以通过发出一个 ALTER SYSTEM FLUSH FLASH_CACHE语句来刷新数据库 Smart Flash Cache。如果您需要从相同的起点度量重写查询或一组查询的性能,或者缓存中可能有损坏,那么刷新数据库智能Flash缓存可能非常有用。
See Also:
  • 《About Memory Management》

4 数据库 Smart Flash Cache 初始化参数

您可以使用一组初始化参数来配置数据库 Smart Flash Cache。

表 4:数据库 Smart Flash Cache 初始化参数

参数描述
DB_FLASH_CACHE_FILE指定要在操作系统文件系统或Oracle ASM磁盘组中包含数据库 Smart Flash Cache 的文件的路径和文件名列表。如果指定的文件不存在,则数据库将在启动期间创建该文件。每个文件必须驻留在闪存设备上。如果在磁盘驱动器(spindle)上配置数据库 Smart Flash Cache,则性能可能会受到影响。最多支持16个文件。
DB_FLASH_CACHE_SIZE指定数据库 Smart Flash Cache 中每个文件的大小。每个大小对应于 DB_FLASH_CACHE_FILE 中指定的文件。文件和大小按照指定的顺序进行对应。如果指定大小的数量与指定的文件数不匹配,则会引发错误。
每个尺寸规格必须小于或等于其闪存设备的物理内存大小。大小表示为nG,表示千兆字节(GB)的数量。例如,若要指定16 GB数据库 Smart Flash Cache,请将 DB_FLASH_CACHE_SIZE 值设置为16G。

例如,假设您的数据库智能闪存缓存使用以下闪存设备:

文件大小
/dev/sda32G
/dev/sdb32G
/dev/sdc64G

可以将初始化参数设置为以下值:
DB_FLASH_CACHE_FILE = /dev/sda, /dev/sdb, /dev/sdc
DB_FLASH_CACHE_SIZE = 32G, 32G, 64G
您可以查询V$FLASHFILESTAT视图,以确定每个文件的累计延迟和读取计数,并计算平均延迟。
您可以使用ALTER SYSTEM将DB_FLASH_CACHE_SIZE将每个要禁用的闪存设备设置成零。您还可以使用ALTER SYSTEM将任何禁用的闪存设备的大小设置回原来的大小,以重新启用它。但是,不支持动态更改数据库智能闪存缓存的大小。
See Also:
  • 《Oracle Database Reference》有关本节中描述的初始化参数的更多信息,以及有关V$FLASHFILESTAT视图的更多信息

5 数据库 Smart Flash Cache 应用于Oracle RAC 环境

Oracle建议您在Oracle RAC 环境中的所有实例或没有实例上配置数据库 Smart Flash Cache。此外,在每个实例上配置的总闪存大小应该大致相同。

八、使用In-Memory的列存储提高查询性能

内存中的列存储(IM列存储)是存储表、表分区和其他数据库对象副本的系统全局区域(SGA)的可选部分。在IM列存储中,数据由列填充,而不是像SGA的其他部分那样由行填充,并且数据是为快速扫描而优化的。IM列存储包含在Oracle内存数据库选项中。
IM 列存储没有替换 buffer cache,而是作为补充,以便数据可以以行和列格式存储在内存中。
在IM列存储中存储数据库对象可以显著地改进对在数据库对象上执行的以下类型的操作的性能:
  • 一个扫描大量行并应用过滤器的查询,它使用以下操作符:=、<、>和 IN
  • 从包含大量列的表格或物化视图中选择少量列的查询,例如从100列表中选择五列的查询
  • 将小表连接到大表的查询。
  • 聚集数据的查询。
Note:
这个特性可以从Oracle Database 12c Release 1(12.1.0.2)开始。
Related Topics:
  • 《Oracle Database In-Memory Guide》

九、内存管理参考

一些平台只支持自动内存管理。此外,还可以查询一组数据字典视图,以获得有关内存管理的信息。

1 支持自动内存管理的平台

一些平台支持自动内存管理。
以下平台支持自动内存管理--Oracle数据库能够自动调整SGA和PGA的大小,根据需要将内存从一个重新分配到另一个,以优化性能:
  • Linux
  • Solaris
  • Windows
  • HP-UX
  • AIX

2 管理内存的数据字典视图

一组动态性能视图提供有关内存管理的信息。

视图描述
V$SGA显示有关系统全局区域(SGA)的摘要信息。
V$SGAINFO显示有关SGA的大小信息,包括不同SGA组件的大小、粒度大小和空闲内存。
V$SGASTAT显示有关如何在Shared Pool、Large Pool、Java Pool 和 Steams Pool 中分配内存的详细信息。
V$PGASTATPGA内存使用统计显示以及自动PGA内存管理统计,当它被激活(即,当 PGA_AGGREGATE_TARGET 设置)。在实例启动以来V$PGASTAT 累计的累计值。
V$MEMORY_DYNAMIC_COMPONENTS显示所有自动调优和静态内存组件的当前大小的信息,发生在每个组件上最后一个操作(例如,增长或收缩)。
V$SGA_DYNAMIC_COMPONENTS显示所有SGA组件的当前大小,以及每个组件的最后一个操作。
V$SGA_DYNAMIC_FREE_MEMORY显示有关未来动态SGA调整操作的SGA内存数量的信息。
V$MEMORY_CURRENT_RESIZE_OPS显示当前正在进行的调整操作的信息。调整大小的操作包括扩展或减少SGA、实例 PGA 或动态 SGA 组件。
V$SGA_CURRENT_RESIZE_OPS显示当前正在进行的动态SGA组件调整大小操作的信息。
V$MEMORY_RESIZE_OPS显示最后800个已完成的内存组件的调整大小的操作信息,包括SGA_TARGET 和 PGA_AGGREGATE_TARGET的业务自动成长和萎缩。
V$SGA_RESIZE_OPS显示有关最近800个已完成的SGA组件调整大小操作的信息。
V$MEMORY_TARGET_ADVICE如果启用自动内存管理,则显示帮助您优化内存目标的信息。
V$SGA_TARGET_ADVICE显示帮助您优化 SGA_TARGET 的信息。
V$PGA_TARGET_ADVICE显示帮助您调优 PGA_AGGREGATE_TARGET 的信息。
V$IM_SEGMENTS显示有关存储分配在我列式存储所有段的信息。
Note: 这一观点是Oracle数据库12C版本1开始(12.1.0.2)。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值