一、内存管理简介
必须管理的内存结构是系统全局区域(SGA)和实例程序全局区域(实例PGA)。Oracle数据库支持多种内存管理方式,可通过初始化参数的设置进行选择。
1.自动内存管理(Automatic Memory Management)
Oracle数据库可以完全自动管理SGA内存和实例PGA内存。您只指定实例使用的总内存大小,Oracle数据库根据需要在SGA和实例PGA之间动态交换内存,以满足处理需求。这种功能称为自动内存管理(automatic memory management)。通过这种内存管理方法,数据库还可以动态调优单个SGA组件的大小和单个PGA的大小。Oracle推荐对SGA和PGA内存总大小小于或等于4GB的数据库进行自动内存管理。
2.手动存管理(Manual Memory Management)
如果希望对各个内存组件的大小进行更直接的控制,可以禁用自动内存管理,并将数据库配置为手动内存管理。这里有几种可用于手动内存管理的不同方法。其中一些方法保留了一定程度的自动化。这些方法是:
- 自动共享内存管理-用于SGA
- 手动共享内存管理-用于SGA
- 自动PGA内存管理-用于实例PGA
- 手动PGA内存管理—用于实例PGA
如果您使用数据库配置助手(DBCA)创建数据库,并选择基本安装选项,则当系统内存小于或等于4GB时,将启用自动内存管理。当系统内存大于4GB时,自动内存管理会被禁用,自动共享内存管理将被启用。如果您选择高级安装,那么DBCA允许您选择自动内存管理或自动共享内存管理。
当SGA和PGA内存的总大小为4GB或更大时,Oracle推荐自动共享内存管理。
说明:管理内存最简单的方法是使用Oracle Enterprise Manager Database Express (EM Express)或Oracle Enterprise Manager Cloud Control (Cloud Control)的图形用户界面。
二、内存结构概述
与Oracle数据库相关的基本内存结构包括:
- 系统全局区(SGA)
SGA是一组共享内存结构,被称为SGA组件,包含一个Oracle数据库实例的数据和控制信息。SGA被所有服务器进程和后台进程所共享。存储在SGA中的数据的例子包括缓存的数据块和共享的SQL区域。 - 程序全局区(PGA)
PGA是一个包含服务器进程的数据和控制信息的内存区域。它是Oracle数据库在服务器进程启动时创建的非共享内存。对于服务器进程访问PGA是独占的。每个服务器进程都有一个PGA。后台进程也分配它们自己的PGA。分配给连接到Oracle数据库实例的所有后台进程和服务器进程的总PGA内存称为实例总PGA内存。所有单个PGA的集合称为总实例PGA,或简称为实例PGA。
下图(源自Oracle管网)表明了这些内存结构之间的关系:
该图中大矩形代表SGA。在SGA内部有两行框表示SGA组件。最上面一行的三个框,从左到右,分别是Java池、重做缓冲区和缓冲区缓存。最下面一行的四个框,从左到右,分别标记为共享池、流池、大型池和其他组件。SGA之外是另一个标记为Database Smart Flash Cache的内存组件。它通过一个双向箭头连接到SGA内部的Buffer Cache框。SGA外部有三个框,分别为服务器进程1、服务器进程2和服务器进程3,以及两个框,分别为后台进程。这5个进程中的每一个都通过双向箭头连接到大SGA框,表示每个进程从SGA读取和写入数据。每个进程还通过一个双向箭头连接到一个标记为PGA的小框。每个进程都有自己连接的PGA框。
如果数据库运行在Solaris或Oracle Linux上,则可选择的添加另一个内存组件:数据库智能闪存缓存(Database Smart Flash Cache)。数据库智能闪存缓存是常驻SGA的缓冲区缓存(buffer cache)的扩展,为数据库块提供了2级缓存。它可以提高读密集型在线事务处理(OLTP)工作负载和数据仓库环境中特殊查询和批量数据修改的响应时间和吞吐量。数据库智能闪存缓存驻留在一个或多个闪存盘设备上,它们是使用闪存的固态存储设备。数据库智能闪存缓存通常比额外的主存更经济,而且比磁盘驱动器快一个数量级。
从Oracle Database 12c Release 1(12.1.0.2)开始,大表缓存允许串行查询和并行查询使用缓冲区缓存。大表缓存促进了在数据仓库环境中大型表的高效缓存,即使这些表不能完全装入缓冲区缓存中。表扫描可以在以下场景中使用大表缓存:
- 并行查询
在单实例和Oracle RAC数据库中,当DB_BIG_TABLE_CACHE_PERCENT_TARGET初始化参数设置为非零值,并且PARALLEL_DEGREE_POLICY设置为AUTO或ADAPTIVE时,并行查询可以使用大表缓存。 - 串行查询
仅在单实例配置中,当DB_BIG_TABLE_CACHE_PERCENT_TARGET初始化参数设置为非零值时,串行查询可以使用大表缓存。
三、使用自动内存管理
1.自动内存管理简介
管理实例内存最简单的方法是允许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设置得太低。
注意:如果LOCK_SGA初始化参数为TRUE,则不能启用自动内存管理。
2.启用自动内存管理
如果在创建数据库时没有启用自动内存管理(通过在DBCA中选择适当的选项或为CREATE database SQL语句设置适当的初始化参数),在稍后的时间里你可以启用它。启用自动内存管理涉及数据库的关闭和重启。
如何启用自动内存管理?
# 1.启动SQL*PLus,使用sysdba管理权限连接到Oracle数据库实例
su - oracle
sqlplus / as sysdba
# 2.计算MEMORY_TARGET的最小值
# a.确定SGA_TARGET和PGA_AGGREGATE_TARGET的当前大小(以兆字节为单位)
SYS@orcl> show parameter sga_target;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
sga_target big integer 2400M
SYS@orcl> show parameter pga_aggregate_target;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_target big integer 797M
# b.确定自数据库启动以来分配的最大实例PGA(以兆字节为单位):
SYS@orcl> select value/(1024*1024) max_allocated_MB from v$pgastat where name = 'maximum PGA allocated';
MAX_ALLOCATED_MB
----------------
275.426758
# c. 计算MEMORY_TARGET的最小值
MEMORY_TARGET >= SGA_TARTGET + MAX(PGA_AGGREGATE_TARGET,maximum PGA allocated)
MEMORY_TARGET >= 2400MB + 797MB = 3197MB
# 3.为target_memory确定一个值
# 可以是在第2步中计算的最小值,如果有足够的物理内存可用,也可以选择使用更大的值。
# 4.对于MEMORY_MAX_TARGET初始化参数,决定您希望在可预见的将来分配给数据库的最大内存量。
# 也就是说,决定SGA和实例PGA大小之和的最大值。
# 这个数字可以大于或等于您在上一步中选择的MEMORY_TARGET值。
# 修改MEMORY_MAX_TARGET参数的值分以下两种情况:
# a.如果您使用服务器参数文件启动Oracle数据库实例,如果您使用数据库配置助手(DBCA)创建数据库,则默认使用服务器参数文件
SYS@orcl> alter system set memory_max_target = 3197M scope=spfile;
System altered.
# SCOPE = SPFILE子句只在服务器参数文件中设置值,而不是为运行的实例设置值。
# 您必须包含这个SCOPE子句,因为MEMORY_MAX_TARGET不是一个动态初始化参数。
# b.如果使用文本初始化参数文件启动实例,请手动编辑该文件,使其包含以下语句
memory_max_target = 3197M
memory_target = 3197M
# 5.关闭数据库,然后重新启动它
SYS@orcl> shutdown immediate;
SYS@orcl> startup;
# 6.如果您使用服务器参数文件启动Oracle数据库实例,请输入以下命令:
SYS@orcl> alter system set memory_target=3197M;
System altered.
SYS@orcl> alter system set sga_target=0;
System altered.
SYS@orcl> alter system set pga_aggregate_target=0;
System altered.
注意:在文本初始化参数文件中,如果省略MEMORY_MAX_TARGET的行并包含MEMORY_TARGET的值,则数据库将自动将MEMORY_MAX_TARGET设置为MEMORY_TARGET的值。如果省略MEMORY_TARGET的行并包含MEMORY_MAX_TARGET的值,则MEMORY_TARGET参数默认为零。在启动之后,您可以动态地将MEMORY_TARGET更改为一个非零值,前提是它不超过MEMORY_MAX_TARGET的值。
设置MEMORY_TARGET后,SGA_TARGET设置成为SGA的最小大小,PGA_AGGREGATE_TARGET设置成为实例PGA的最小大小。将它们都设置为零,就没有最小值,只要SGA和实例PGA的和小于或等于MEMORY_TARGET设置,它们就可以根据需要增长。SQL工作区域的大小仍然是自动的。
可以省略将SGA_TARGET和PGA_AGGREGATE_TARGET参数值设置为零的语句,并将其中一个或两个值保留为正数。在这种情况下,这些值充当SGA或实例PGA大小的最小值。
此外,可以使用PGA_AGGREGATE_LIMIT初始化参数为PGA内存设置实例范围的硬限制。无论是否使用自动内存管理,都可以设置PGA_AGGREGATE_LIMIT。
3.监控和调整自动内存管理
动态性能视图V$MEMORY_DYNAMIC_COMPONENTS显示了所有动态调优内存组件的当前大小,包括SGA和实例PGA的总大小。
# 1.查询V$MEMORY_TARGET_ADVICE视图,查看MEMORY_TARGET初始化参数的调优建议:
SYS@orcl> select * from v$memory_target_advice order by memory_size;
MEMORY_SIZE MEMORY_SIZE_FACTOR ESTD_DB_TIME ESTD_DB_TIME_FACTOR VERSION CON_ID
----------- ------------------ ------------ ------------------- ---------- ----------
799 .2499 202 1 1 0
1598 .4998 202 1 1 0
2397 .7498 202 1 1 0
3996 1.2499 202 1 1 0
4795 1.4998 202 1 1 0
5594 1.7498 202 1 1 0
6394 2 202 1 1 0
MEMORY_SIZE_FACTOR为1的行显示由MEMORY_TARGET初始化参数设置的当前内存大小,以及完成当前工作负载所需的DB时间量。在前面和后面的行中,显示了几种可选的MEMORY_TARGET大小。在示例中并没有看到MEMORY_SIZE_FACTOR值为1的行,但不影响,如果有,正如前一句话所说,该行的MEMORY_SIZE反映memory_target当前值。对于每个可选大小,数据库将显示大小因子(当前大小的倍数),以及如果将MEMORY_TARGET参数更改为可选大小,则估计完成当前工作负载所需的DB时间。注意,对于总内存大小小于当前MEMORY_TARGET大小的内存,估计的DB时间会增加。注意,对于总内存大小小于当前MEMORY_TARGET大小的内存,估计的DB时间会增加(需具体而论,本次给出的示例DB时间都是一样的,说明当前的数据库的负载并不高)。所以对于本次示例的MEMORY_TARGET的大小调整,可以降低,例如降低至1024M(不可以设置得太小):
# 如果memory_target设置得太小会报如下错:
SYS@orcl> alter system set memory_target = 800M;
alter system set memory_target = 800M
*
ERROR at line 1:
ORA-02097: parameter cannot be modified because specified value is invalid
ORA-00838: Specified value of MEMORY_TARGET is too small, needs to be at least 1024M
SYS@orcl> alter system set memory_target = 1024M;
System altered.
SYS@orcl> select * from v$memory_target_advice;
MEMORY_SIZE MEMORY_SIZE_FACTOR ESTD_DB_TIME ESTD_DB_TIME_FACTOR VERSION CON_ID
----------- ------------------ ------------ ------------------- ---------- ----------
512 .5 244 1.1193 3 0
768 .75 244 1.1193 3 0
1280 1.25 218 1 3 0
1536 1.5 218 1 3 0
1792 1.75 218 1 3 0
2048 2 218 1 3 0
EM Express提供了一个易于使用的图形化内存建议器,帮助您为MEMORY_TARGET选择最佳大小。
四、手动配置内存
1.手动内存管理简介
对于SGA和实例PGA各有两种不同的手动内存管理方法。
对于SGA,使用自动共享内存管理,您可以为SGA设置目标和最大大小。然后,数据库将SGA的总大小设置为指定的目标大小,并动态调整许多SGA组件的大小。使用手动共享内存管理,您可以设置几个单独SGA组件的大小,从而确定整体SGA的大小。然后在持续变化的基础上手动调整这些单独的SGA组件。
对于实例PGA,有自动的PGA内存管理,您可以为实例PGA设置目标大小。然后,数据库将实例PGA的大小设置为您指定的目标值,并动态调整各个PGA的大小。还有手动PGA内存管理,您可以为每种类型的SQL运算子(如排序或哈希连接)设置最大工作区域大小。虽然支持这种内存管理方法,但不推荐使用。
2.自动共享内存管理
Automatic Shared Memory Management简化了SGA的内存管理。
(1)自动共享内存管理简介
通过自动共享内存管理,您可以使用SGA_TARGET初始化参数指定一个实例可用的SGA内存总量,Oracle数据库会自动在各种SGA组件之间分配这些内存,以确保最有效的内存利用率。
当启用自动共享内存管理时,不同SGA组件的大小是灵活的,可以适应工作负载的需要,而不需要任何额外的配置。数据库根据需要自动在各种组件之间分配可用内存,允许系统最大限度地利用所有可用的SGA内存。
如果您使用的是服务器参数文件(SPFILE),数据库会记住实例关闭时自动调优的SGA组件的大小。因此,数据库实例不需要在每次实例启动时再次学习工作负载的特征。实例可以从前一个实例的信息开始,并继续评估上一次关闭时停止的工作负载。
(2)SGA中的组件和颗粒(Granule)
SGA由数个内存组件组成,它们是用于满足特定类型的内存分配请求的内存池。
内存组件的示例包括共享池(用于为SQL和PL/SQL执行分配内存)、java池(用于java对象和其他java执行内存)和缓冲区缓存(用于缓存磁盘块)。所有SGA组件都以颗粒为单位分配和释放空间。Oracle数据库根据每个SGA组件的内部颗粒数跟踪SGA内存使用情况。
SGA中动态组件的内存是以颗粒为单位进行分配的。颗粒大小(也叫粒度,后续都称为粒度)由实例启动时请求的SGA内存量决定。具体来说,颗粒大小基于SGA_MAX_SIZE初始化参数的值。不同SGA内存总量对应的颗粒大小如下表所示:
SGA内存总量(SGA Memory Amount)(标识为total) | 粒度(Granule Size) |
total <= 1 GB | 4 MB |
1 GB < total <= 8 GB | 16 MB |
8 GB < total <=16 GB | 32 MB |
16 GB < total <= 32 GB | 64 MB |
32 GB < total <= 64 GB | 128 MB |
64 GB < total <= 128 GB | 256 MB |
total > 128 GB | 512 MB |
可能会产生一些平台依赖关系。请查阅操作系统特定的文档以获得更多详细信息。
您可以查询V$SGAINFO视图来查看实例正在使用的粒度。SGA中的所有组件都使用相同的粒度:
SYS@orcl> select name,bytes/(1024*1024) MB from v$sgainfo;
NAME MB
-------------------------------- ----------
Fixed SGA Size 8.48968506
Redo Buffers 7.5078125
Buffer Cache Size 336
In-Memory Area Size 0
Shared Pool Size 496
Large Pool Size 16
Java Pool Size 0
Streams Pool Size 0
Shared IO Pool Size 128
Data Transfer Cache Size 0
Granule Size 16
Maximum SGA Size 3199.9975
Startup overhead in Shared Pool 186.138718
Free SGA Memory Available 2336
## 本例中,粒度为16MB,SGA内存总量超过1G小于16G。
如果您为组件指定的大小不是粒度的倍数,Oracle数据库会将指定的大小取整到最接近的倍数值。
(3)设置最大SGA大小
SGA_MAX_SIZE初始化参数指定实例生命周期内系统全局区域的最大大小。
你可以动态地改变该初始化参数,影响缓冲缓存、共享池、大池、Java池和流池的大小,但这些大小和SGA的其他组件(固定SGA、可变SGA和重做日志缓冲区)的大小的总和不超过SGA_MAX_SIZE指定的值。
如果您没有指定SGA_MAX_SIZE, Oracle数据库将选择一个默认值,该值是初始化时所有指定的或默认的组件总和。如果您指定了SGA_MAX_SIZE,并且在数据库初始化时,该值小于为所有组件分配的内存总和(无论是显式地在参数文件中还是默认情况下),那么数据库将忽略SGA_MAX_SIZE的设置,并为该参数选择正确的值:
# 1.修改sga_max_size值,sga_max_size是一个非动态初始化参数
SYS@orcl> alter system set sga_max_size=1024M scope=spfile;
SYS@orcl> show parameter sga_max_size;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
sga_max_size big integer 3200M
SYS@orcl> shutdown immediate;
SYS@orcl> startup;
SYS@orcl> show parameter sga_max_size;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
sga_max_size big integer 1G
# 2.如果将sga_max_size设置得过小,如下:
SYS@orcl> alter system set sga_max_size = 512M scope=spfile;
System altered.
SYS@orcl> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SYS@orcl> startup;
ORACLE instance started.
Total System Global Area 905968152 bytes
Fixed Size 8895000 bytes
Variable Size 251658240 bytes
Database Buffers 637534208 bytes
Redo Buffers 7880704 bytes
Database mounted.
Database opened.
SYS@orcl> show parameter sga_max_size;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
sga_max_size big integer 864M
(4)设置SGA目标大小
通过将SGA_TARGET初始化参数设置为非零值,可以启用自动共享内存管理特性。该参数设置SGA的总大小。
如何启用自动共享内存管理特性?
将SGA_TARGET初始化参数设置为一个非零值。
注意:
STATISTICS_LEVEL初始化参数必须设置为TYPICAL(默认值)或ALL,以便自动共享内存管理起作用。启用自动共享内存管理的一种更简单的方法是使用EM Express。当您启用自动共享内存管理并设置总SGA大小时,EM Express自动生成ALTER SYSTEM语句将SGA_TARGET设置为指定的大小,并将所有自动估算大小的SGA组件设置为零。
如果使用SQL*Plus设置SGA_TARGET,则必须将自动调整大小的SGA组件设置为零或最小值。
1)自动估算大小的组件
当设置SGA_TARGET时,一些SGA组件会自动调整大小,如下表所示:
SGA Component | Initialization Parameter |
Fixed SGA and other internal allocations needed by the Oracle Database instance | N/A |
The shared pool | SHARED_POOL_SIZE |
The large pool | LARGE_POOL_SIZE |
The Java pool | JAVA_POOL_SIZE |
The buffer cache | DB_CACHE_SIZE |
The Streams pool | STREAMS_POOL_SIZE |
除了将SGA_TARGET设置为非零值外,还必须将上表列出的所有初始化参数设置为零,以启用自动调整大小的SGA组件的全自动调优。
或者,您可以将一个或多个自动调整大小的SGA组件设置为非零值,然后在SGA调优期间将该值用作该组件的最小设置。
手动调整大小的参数如下所示:
SGA Component | Initialization Parameter |
The log buffer | LOG_BUFFER |
The keep and recycle buffer caches | DB_KEEP_CACHE_SIZE,DB_RECYCLE_CACHE_SIZE |
Nonstandard block size buffer caches | DB_nK_CACHE_SIZE |
2)SGA和虚拟内存
为了在大多数系统中获得最佳性能,整个SGA应该装入实际内存中。如果不这样做,并且使用虚拟内存存储其中的部分数据,那么数据库系统的总体性能会急剧下降。这是因为SGA的部分是由操作系统分页(写入磁盘和从磁盘读取)的。
3)监视和调优SGA目标大小
V$SGAINFO视图提供了关于各种SGA组件的当前调优大小的信息。V$SGA_TARGET_ADVICE视图提供了帮助您确定SGA_TARGET值的信息。
SYS@orcl> 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 ESTD_BUFFER_CACHE_SIZE ESTD_SHARED_POOL_SIZE CON_ID
---------- --------------- ------------ ------------------- ------------------- ---------------------- --------------------- ----------
432 .5 228 1.1466 12887 96 256 0
648 .75 199 1 12663 240 320 0
864 1 199 1 12663 480 320 0
1080 1.25 199 1 12663 672 320 0
1296 1.5 199 1 12663 864 320 0
1512 1.75 199 1 12663 1056 320 0
1728 2 199 1 12663 1248 320 0
这个视图中的信息类似于V$MEMORY_TARGET_ADVICE视图中为自动内存管理提供的信息。
(5)启用自动共享内存管理
启用自动共享内存管理(ASMM)的过程因从手动共享内存管理或从自动内存管理更改为ASMM而异。
1)从手动共享内存管理更改为ASMM
# 1.获取sga_target的值
SYS@orcl> select (
(select sum(value) from v$sga) -
(select current_size from v$sga_dynamic_free_memory) ) "SGA_TARGET" from dual;
SGA_TARGET
----------
905968152
# 2.通过编辑文本初始化参数文件并重新启动数据库,或者通过以下语句来设置SGA_TARGET的值
SYS@orcl> alter system set sga_target=905968152;
System altered.
SYS@orcl> show parameter sga_target;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
sga_target big integer 864M
# 3.为了实现更完整的自动调优,请将自动调整大小的SGA组件的值设置为零。
# 通过编辑文本初始化参数文件或发出ALTER SYSTEM语句来完成此操作。
alter system set shared_pool_size=0;
alter system set large_pool_size=0;
alter system set java_pool_size=0;
alter system set streams_pool_size=0;
alter system set db_cache_size=0;
#### 或
# 若要控制一个或多个自动调整大小的SGA组件的最小大小,请将这些组件的大小设置为所需的值。
# 将其他自动调整大小的SGA组件的大小设置为零
如果您知道在特定组件中没有最小的内存量,应用程序就不能正常工作,那么这样做是很有用的。
手动限制一个或多个自动调整大小的组件的最小大小将减少可用于动态调整的总内存量。这种减少又限制了系统适应工作负载变化的能力。因此,除非在特殊情况下,不建议进行这种操作。默认的自动管理行为可以最大化系统性能和可用资源的使用。
2)从自动内存管理改为ASMM
# 1.将MEMORY_TARGET初始化参数设为0
alter system set memory_target=0;
# 数据库基于当前SGA内存分配设置SGA_TARGET,同时pga_aggregate_target参数会被自动设置为当前分配的值,
# 这两个参数的值不再为0,如下所示:
SYS@orcl> show parameter pga_aggregate_target;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_target big integer 2384M
SYS@orcl> show parameter sga_target;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
sga_target big integer 816M
# 2.同从手动共享内存管理更改为ASMM过程的步骤3一致
(6)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_TARGET设置为所需的非零值。动态地将SGA_TARGET从零修改为非零值可能无法达到预期的结果,因为共享池可能无法收缩。启动后,可根据需要动态调整SGA_TARGET。
(7)为自动调整大小的组件修改参数值
如果给SGA组件设置的值小于其当前大小,则该组件的大小不会立即发生变化。新的设置只限制自动调优算法在未来减少的最小尺寸。
例如,探讨以下配置:
- SGA_TARGET = 512M
- LARGE_POOL_SIZE = 256M
- 当前实际大池大小= 284M
在本例中,如果将LARGE_POOL_SIZE的值增加到大于组件当前实际大小的值,系统将扩展组件以适应增加的最小大小。例如,如果您将LARGE_POOL_SIZE的值增加到300M,那么系统将逐步增加大池,直到它达到300M。这种调整是以牺牲一个或多个自动调整组件为代价的。如果将LARGE_POOL_SIZE的值减少到200,则该组件的大小不会立即发生变化。新的设置只会限制将来大池的大小最低减少至200M。
注意:如果不设置SGA_TARGET,则不启用自动共享内存管理特性。因此,控制所有组件参数调整大小的规则与早期版本相同。
(8)为手动调整大小的组件修改参数值
手动设置大小的组件的参数也可以动态更改。但是,该参数的值指定了相应组件的精确大小,而不是设置最小大小。
当您增加手动调整大小组件的大小时,额外的内存从一个或多个自动调整大小组件中拿出。当您降低手动调整大小的组件的大小时,释放的内存将分配给自动调整大小的组件。
例如,探讨以下配置:
- SGA_TARGET = 512M
- DB_8K_CACHE_SIZE = 128M
在本例中,将DB_8K_CACHE_SIZE增加16M到144M意味着从自动调整大小的组件中去掉16M。同样,将DB_8K_CACHE_SIZE减少16M到112M意味着16M是给自动调整大小的组件的。
3.手动共享内存管理
要手动管理共享内存,首先要确保自动内存管理和自动共享内存管理都是禁用的。然后手动配置、监视和调优内存组件。
(1)手动共享内存管理简介
如果决定不使用自动内存管理或自动共享内存管理,则必须手动配置几个SGA组件的大小,然后随着数据库工作负载的变化不断监视和调优这些大小。
如果使用DBCA创建数据库并选择手动共享内存管理,DBCA提供了必须输入缓冲区缓存、共享池、大池和Java池大小的字段。然后在它创建的服务器参数文件(SPFILE)中设置相应的初始化参数。
如果你使用create database SQL语句和一个文本初始化参数文件来创建数据库,你可以执行以下操作之一:
- 提供用于设置SGA组件大小的初始化参数值。
- 在文本初始化文件中省略SGA组件大小参数。Oracle数据库会为没有设置大小的任何组件选择合理的默认值。
(2)启用手动共享内存管理
没有初始化参数本身启用手动共享内存管理。通过禁用自动内存管理和自动共享内存管理,可以有效地启用手动共享内存管理。
启用手动共享内存管理:
# 1.将MEMORY_TARGET初始化参数设置为0:
alter system set memory_target=0;
# 2.将SGA_TARGET初始化参数设置为0:
alter system set sga_target=0;
然后必须为各种SGA组件设置值,如下面的部分所述。
(3)设置Buffer Cache初始化参数
缓冲缓存初始化参数决定了SGA缓冲缓存组件的大小。
您可以使用它们为数据库使用的各种块大小指定缓存的大小。这些初始化参数都是动态的。
缓冲缓存的大小影响性能。较大的缓存大小通常会减少磁盘读和写的数量。然而,一个大的缓存可能会占用太多的内存,并导致内存分页或交换。
Oracle数据库在一个数据库中支持多种块大小。如果您使用非标准块大小创建表空间,则必须配置非标准块大小缓冲区来容纳这些表空间。标准块大小用于SYSTEM表空间。可以通过设置初始化参数DB_BLOCK_SIZE指定标准块大小。合法的值从2K到32K。
如果你想在数据库中使用多种块大小,你必须设置DB_CACHE_SIZE和至少一个DB_nK_CACHE_SIZE参数。Oracle数据库为DB_CACHE_SIZE参数分配了一个适当的默认值,但是DB_nK_CACHE_SIZE参数默认为0,并且没有配置额外的块大小缓存。
注意:32K块大小仅在64位平台上有效。
1)设置块和缓存大小示例
DB_BLOCK_SIZE=4096
DB_CACHE_SIZE=1024M
DB_2K_CACHE_SIZE=256M
DB_8K_CACHE_SIZE=512M
在上面的例子中,参数DB_BLOCK_SIZE将数据库的标准块大小设置为4K。标准块缓冲区的缓存大小是1024MB。此外,还配置了2K和8K缓存,大小分别为256MB和512MB。
注意:DB_nK_CACHE_SIZE参数不能用于调整标准块的缓存大小。当DB_BLOCK_SIZE的值为nK时,设置DB_nK_CACHE_SIZE无效。标准块的缓存大小总是由DB_CACHE_SIZE的值决定。
缓存的大小是有限的,因此并不是磁盘上的所有数据都能装进缓存。当缓存已满时,后续的缓存丢失会导致Oracle数据库将缓存中已经存在的脏数据写入磁盘,为新数据腾出空间。(如果一个缓冲区不是脏的,在一个新的块可以被读入缓冲区之前,它不需要被写入磁盘。)对写入磁盘然后覆盖的任何数据的后续访问将导致额外的缓存丢失。
缓存的大小影响对数据的请求导致缓存命中的可能性。如果缓存很大,则更有可能包含请求的数据。增加缓存的大小会增加导致缓存命中的数据请求的百分比。
您可以在实例运行时更改缓冲区缓存的大小,而不必关闭数据库。使用ALTER SYSTEM语句执行此操作。
使用固定视图V$BUFFER_POOL来跟踪不同缓存组件的大小和任何挂起的调整大小操作。
SYS@orcl> select name,block_size,resize_state,current_size,buffers,target_size,target_buffers from v$buffer_pool;
NAME BLOCK_SIZE RESIZE_STA CURRENT_SIZE BUFFERS TARGET_SIZE TARGET_BUFFERS
-------------------- ---------- ---------- ------------ ---------- ----------- --------------
DEFAULT 8192 STATIC 544 66368 544 66368
SYS@orcl> show parameter db_cache_size;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_cache_size big integer 544M
2)多种缓冲池
您可以使用独立的缓冲池配置数据库缓冲缓存,这些缓冲池要么将数据保存在缓冲缓存中,要么在使用数据块后立即为新数据提供缓冲。
然后可以将特定的模式对象(表、集群、索引和分区)分配给适当的缓冲池,以控制它们的数据块从缓存中取出的方式。
- KEEP缓冲池将模式对象的数据块保留在内存中。
- 一旦不再需要数据块,RECYCLE缓冲池就会从内存中删除这些数据块。
- DEFAULT缓冲池包含来自未分配给任何缓冲池的模式对象的数据块,以及显式分配给DEFAULT池的模式对象。
配置KEEP和RECYCLE缓冲池的初始化参数是DB_KEEP_CACHE_SIZE和DB_RECYCLE_CACHE_SIZE。
注意:多种缓冲池仅适用于标准块。非标准块的缓存只有一个DEFAULT池。
(4)指定共享池大小
SHARED_POOL_SIZE初始化参数是一个动态参数,允许您指定或调整SGA的共享池组件的大小。Oracle数据库会为它选择一个合适的默认值。
# 我并没有设置该参数
SYS@orcl> show parameter shared_pool_size;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
shared_pool_size big integer 240M
在Oracle Database 10g之前的版本中,分配的共享池内存量等于初始化参数SHARED_POOL_SIZE的值加上实例启动期间计算的内部SGA开销。内部SGA开销指的是Oracle数据库在启动过程中根据其他初始化参数的值分配的内存。该内存用于维护SGA中不同服务器组件的状态。例如,SHARED_POOL_SIZE参数设置为64MB, SGA内部开销计算为12MB,则共享池的实际大小为64 + 12 = 76MB,但SHARED_POOL_SIZE参数的值仍然显示为64MB。
从Oracle Database 10g开始,内部SGA开销的大小包含在用户指定的SHARED_POOL_SIZE值中。如果不使用自动内存管理或自动共享内存管理,则在启动时分配给共享池的内存量等于SHARED_POOL_SIZE初始化参数的值,取整到粒度的倍数。因此,您必须设置此参数,以便除了共享池大小的所需值之外,还包括内部SGA开销。在前面的例子中,如果SHARED_POOL_SIZE参数在启动时设置为64 MB,那么在假定SGA内部开销不变的情况下,启动后可用的共享池为64 - 12 = 52 MB。为了在启动后为共享池内存保持64 MB的有效值,必须将SHARED_POOL_SIZE参数设置为64 + 12 = 76 MB。
当从Oracle Database 10g之前的版本进行迁移时,迁移实用程序会根据升级前环境中的内部SGA开销值和该参数的旧值为该参数推荐一个新值。从Oracle数据库10g开始,内部SGA开销的确切值,也称为共享池中的启动开销,可以从V$SGAINFO视图中查询。
SYS@orcl> select name,bytes/(1024*1024) from v$sgainfo where name = 'Startup overhead in Shared Pool';
NAME BYTES/(1024*1024)
-------------------------------- -----------------
Startup overhead in Shared Pool 168.405022
此外,在手动共享内存管理模式下,如果用户指定的SHARED_POOL_SIZE值太小,甚至无法满足内部SGA开销的要求,Oracle数据库在启动时将生成ORA-00371错误,并建议SHARED_POOL_SIZE参数的使用值。当使用自动共享内存管理时,共享池会自动调整,不会产生ORA-00371错误。
结果缓存从共享池获取它的内存。因此,如果希望增加结果缓存的最大大小,请在调整共享池大小时考虑这一点。
(5)指定大池大小
LARGE_POOL_SIZE初始化参数是一个动态参数,允许您指定或调整SGA大池组件的大小。大池是SGA的可选组件。要创建大池,必须专门设置LARGE_POOL_SIZE参数。
SYS@orcl> show parameter large_pool_size;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
large_pool_size big integer 16M
(6)指定Java池大小
JAVA_POOL_SIZE初始化参数是一个动态参数,允许您指定或调整SGA的Java池组件的大小。Oracle数据库会为它选择一个合适的默认值。
SYS@orcl> show parameter java_pool_size;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
java_pool_size big integer 0
(7)指定流池大小
STREAMS_POOL_SIZE初始化参数是一个动态参数,允许您指定或调整SGA的流池组件的大小。如果STREAMS_POOL_SIZE设置为0,则Oracle Streams产品在需要时将内存从缓冲缓存中传输到流池。
SYS@orcl> show parameter streams_pool_size;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
streams_pool_size big integer 0
(8)指定结果缓存的最大大小
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设置为非零值(或从文本初始化参数文件中删除此参数以获得默认的最大大小),然后重新启动数据库。
注意,在禁用结果缓存的情况下启动数据库后,如果使用ALTER SYSTEM语句将RESULT_CACHE_MAX_SIZE设置为非零值但不重新启动数据库,尽管查询RESULT_CACHE_MAX_SIZE参数的值将返回非零值,但是结果缓存仍然被禁用。
因此,RESULT_CACHE_MAX_SIZE的值不是确定结果缓存是否启用的最可靠方法。你可以使用以下查询:
SYS@orcl> select dbms_result_cache.status() from dual;
DBMS_RESULT_CACHE.STATUS()
----------------------------------------------------------------------------------------------------
ENABLED
结果缓存从共享池中获取内存,因此如果您增加了结果缓存的最大大小,请考虑同时增加共享池的大小。
视图V$RESULT_CACHE_STATISTICS和PL/SQL包过程DBMS_RESULT_CACHE.MEMORY_REPORT的显示信息,可以帮助您确定当前分配给结果缓存的内存量。
SYS@orcl> select * from v$result_cache_statistics;
ID NAME VALUE CON_ID
---------- -------------------------------------------------- -------------------- ----------
1 Block Size (Bytes) 1024 0
2 Block Count Maximum 2464 0
3 Block Count Current 0 0
4 Result Size Maximum (Blocks) 123 0
5 Create Count Success 0 0
6 Create Count Failure 0 0
7 Find Count 0 0
8 Invalidation Count 0 0
9 Delete Count Invalid 0 0
10 Delete Count Valid 0 0
11 Hash Chain Length 0 0
12 Find Copy Count 0 0
13 Latch (Share) 0 0
14 Bypass Object Create Count 0 0
15 Bypass Object Find Count 0 0
16 LRU Chain Scan Depth 0 0
SYS@orcl> SET SERVEROUTPUT ON
SYS@orcl> exec dbms_result_cache.memory_report(true);
R e s u l t C a c h e M e m o r y R e p o r t
[Parameters]
Block Size = 1K bytes
Maximum Cache Size = 2464K bytes (2464 blocks)
Maximum Result Size = 123K bytes (123 blocks)
[Memory]
Total Memory = 5848 bytes [0.002% of the Shared Pool]
... Fixed Memory = 5848 bytes [0.002% of the Shared Pool]
....... Memory Mgr = 208 bytes
....... Cache Mgr = 832 bytes
....... Bloom Fltr = 2K bytes
....... State Objs = 2760 bytes
... Dynamic Memory = 0 bytes [0.000% of the Shared Pool]
PL/SQL procedure successfully completed.
PL/SQL包函数DBMS_RESULT_CACHE.FLUSH将清除结果缓存并将所有内存释放回共享池。
(9)指定其他SGA初始化参数
LOCK_SGA参数设置为TRUE时,将整个SGA锁定到物理内存中。此参数不能与自动内存管理一起使用。
SHARED_MEMORY_ADDRESS和HI_SHARED_MEMORY_ADDRESS参数指定SGA在运行时的起始地址。这些参数很少使用。对于64位平台,HI_SHARED_MEMORY_ADDRESS指定64位地址的高32位。
4.自动PGA内存管理
默认情况下,Oracle数据库自动全局管理专用于实例PGA的内存总量。可以通过设置初始化参数PGA_AGGREGATE_TARGET来控制这个数量。
Oracle数据库尝试确保分配给所有数据库服务器进程和后台进程的PGA内存总量永远不会超过这个目标。
如果使用DBCA创建数据库,可以为实例的总GA指定一个值。然后,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内存管理方法适用于专用和共享服务器进程分配的工作区域。
5.手动PGA内存管理
Oracle数据库支持手动PGA内存管理,手动调整SQL工作区域。
在Oracle Database 10g之前的版本中,数据库管理员通过设置以下参数来控制SQL工作区的最大大小:SORT_AREA_SIZE, HASH_AREA_SIZE, BITMAP_MERGE_AREA_SIZE 和 CREATE_BITMAP_AREA_SIZE。设置这些参数非常困难,因为需要从数据输入大小和系统中活动的工作区域总数中选择理想的最大工作区域大小。这两个因素在不同的工作区域和不同的时间有很大的不同。因此,在最好的情况下也很难调整各种*_AREA_SIZE参数。
因此,Oracle强烈建议您启用自动PGA内存管理。
如果决定手动调整SQL工作区域,则必须将WORKAREA_SIZE_POLICY初始化参数设置为MANUAL。
注意:初始化参数WORKAREA_SIZE_POLICY是一个会话和系统级参数,只能接受两个值:MANUAL或AUTO。默认为AUTO。可以设置PGA_AGGREGATE_TARGET,然后在自动内存管理模式和手动内存管理模式之间来回切换。当WORKAREA_SIZE_POLICY设置为AUTO时,将忽略*_AREA_SIZE参数的设置。
标签:TARGET,管理,PGA,SGA,内存,Oracle,大小,SIZE From: https://blog.51cto.com/u_13482808/8352454