为满足数据库的需求,通过内存管理来维护 Oracle 实例内存结构的最优大小。Oracle数 据库基于与内存相关的初始化参数设置来管理内存。
自动内存管理(Automatic memory management) 指定实例内存的目标大小,自动管理SGA内存和实例PGA内存。数据库实例自动优化到这个目标内存大小,根据需要在 SGA 和 PGA 实例之间重新分配内存。( memory_target)、Oracle推荐对SGA和PGA内存总大小 小于或等于4GB的数据库进行自动内存管理。
在实现自动内存管理时,只需要设置目标内存大小初始化参数(MEMORY_TARGET)和可选的最大内存大小初始化参数(MEMORY_MAX_TARGET),根据MEMORY_TARGET的值,会自动分配内存给给SGA和PGA,当需求发生变化时,也会动态调整SGA和PGA的值。
启用自动内存管理
1.计算memory_target的最小值
确定sga_target和pga_aggregate_target的当前大小
show parameter sga_target;
show parameter pga_aggregate_target;
确定自数据库启动以来分配的最大实例PGA(以兆字节为单位):
select value/(1024*1024) max_allocated_MB from v$pgastat where name = ‘maximum PGA allocated’;
计算MEMORY_TARGET的最小值
MEMORY_TARGET >= SGA_TARTGET + MAX(PGA_AGGREGATE_TARGET,maximum PGA allocated)
2.设置最大值
target_memory确定一个值,可以是最小值,如果有足够的内存可以使用,也可以设置最大值
MEMORY_MAX_TARGET初始化参数,决定分配给数据库的最大内存量(SGA+PGA的最大值)
MEMORY_MAX_TARGET参数的设置大于等于MEMORY_TARGET
自动共享内存管理(Automatic shared memory management) 设置一个 SGA 的目标大小,然后设置 PGA 总目 标大小,SGA_TARGET初始化参数指定一个实例可用的SGA内存总量,Oracle数据库会自动在各种SGA组件之间分配这些内存,以确保最有效的内存利用率。如果数据库使用的参数文件是SPFILE,数据库会记住实例关闭时自动调优的SGA组件的大小。因此,数据库实例不需要在每次实例启动时再次学习工作负载的特征。实例可以从前一个实例的信息开始,并继续评估上一次关闭时停止的工作负载。
启动自动共享内存管理
通过将SGA_TARGET初始化参数设置为非零值,可以启用自动共享内存管理特性。该参数设置SGA的总大小。
如: alter system set sga_target=100M;
当设置SGA_TARGET时,一些SGA组件会自动调整大小
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
1.获取sga_target的值
select (
(select sum(value) from v s g a ) − ( s e l e c t c u r r e n t s i z e f r o m v sga) - (select current_size from v sga)−(selectcurrentsizefromvsga_dynamic_free_memory) ) “SGA_TARGET” from dual;
2.设置SGA_TARGET的值
alter system set sga_target=xxx;
为了实现更完整的自动调优,请将自动调整大小的SGA组件的值设置为零
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;
手工内存管理(Manual memory management) 不必设置总的内存大小,但需要设置许多初始化参数,以单独管理 SGA 和 PGA 实例中的 各个组件。
AMM---->ASMM
Oracle 会根据当前 SGA 内存使用情况自动设置 SGA_TARGET
alter system set memory_target=0;
当 memory_target=0,根据 AMM 所设置的 sga_target 和 pga_aggregate_target 的值来设置ASMM 的 sga_target 和 pga_aggregate_target,Oraccle 会自动调整SGA 的组件
ASMM----->AMM
将sga_target和pga_aggregate_target设置为0,并设置memory_target的大小
alter system set memory_target=896M;
alter system set sga_target=0;
alter system set pga_aggregate_target=0;
手动----->ASMM
基于当前值计算 SGA_TARGET 值
select ((select sum(value) from v$sga)-(select current_size from v$sga_dynamic_free_memory)) "sga_target " from dual;
sga_target
-----------
838858864
2)alter system set sga_target=422670336;
3)将 SGA 组件初始化参数设置为 0
alter system set streams_pool_size=0;
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;
memory_max_target 内存最大值
memory_target 内存目标值
sga_max_size SGA的最大值
sga_min_size SGA最小值
sga_target SGA的目标值
pga_aggregate_target PGA的目标值
db_16k_cache_size 16K块的大小
db_2k_cache_size 2K块的大
db_32k_cache_size 32K块的大
db_4k_cache_size 4K块的大
db_8k_cache_size 8K块的大
db_cache_size 高速缓冲区的大小
db_keep_cache_size keep缓冲池 ,让表长期保存在内存区中,提高查询速度
db_recycle_cache_size 从内存中清除数据缓存
log_buffer 日志缓冲区大小
java_pool_size Java池大小
large_pool_size 大池大小
shared_pool_size 共享池大小
streams_pool_size 流池大小
bitmap_merge_area_size 位图大小
inmemory_size inmemory区大小
v$sga 显示有关系统全局区域(SGA)的摘要信息
v$sgainfo 显示有关SGA的大小信息,包括不同SGA成分的大小、和可用内存
v$sga_target_advice SGA的建议值
v$pga_target_advice PGA的建议值
v$memory_target_advice 内存的建议值
在以下动态性能视图中可以查看工作区域内存的分配和使用统计数据:
V S Y S S T A T V SYSSTAT V SYSSTATVSESSTAT
V P G A S T A T V PGASTAT V PGASTATVSQL_WORKAREA
V$SQL_WORKAREA_ACTIVE
V$PROCESS视图中的以下三列报告了Oracle数据库进程所分配和使用的PGA内存:
PGA_USED_MEM
PGA_ALLOC_MEM
PGA_MAX_MEM