Oracle数据库将信息存储在内存缓存和磁盘上,内存访问比磁盘访问快得多;与内存访问相比,磁盘访问(物理I/O)占用大量时间,也会增加所需的CPU资源,因此频繁访问的对象的数据请求通过内存执行会更有效率,而不是需要磁盘访问。
影响性能的主要Oracle数据库内存缓存包括:数据库缓冲区缓存、重做日志缓冲区、共享池(含库缓存、数据字典缓存和服务器结果缓存等)、Java池、流池、大池、进程专用内存、内存列存储(IM列存储)等。
一、自动内存管理
自动内存管理使Oracle数据库能够自动管理和调优数据库内存。在自动内存管理模式下,对共享全局区域(SGA)和程序全局区域(实例PGA)内存的管理完全由Oracle数据库处理。这个方法是最自动化且被Oracle强烈推荐的。
如果禁用了自动内存管理,则Oracle数据库使用自动共享内存管理来管理SGA内存。在这种模式下,Oracle数据库会根据总SGA内存设置的目标大小自动将内存分配给各个SGA组件。
如果禁用了自动内存管理和自动共享内存管理,就必须通过在SGA中调整单个内存池来手动管理SGA内存。这种模式能够完全控制SGA内存的分布,但它需要更大的工作量。
如果禁用了自动内存管理,则Oracle数据库将使用自动PGA内存管理来管理PGA内存。在这种模式下,Oracle数据库根据总PGA内存设置的目标大小自动将内存分配到实例PGA中的工作区域。
如果自动内存管理和自动PGA内存管理都被禁用,就必须通过调整PGA内存的部分来手动管理PGA内存。这种方法可能非常困难,因为工作负载总是在变化,Oracle强烈建议使用自动内存管理或自动PGA内存管理。
使用自动内存管理,需要设置MEMORY_TARGET和MEMORY_MAX_TARGET 初始化参数。在MEMORY_TARGET初始化参数中指定目标内存大小,再根据需要在SGA和实例PGA之间重新分配内存;此参数是动态的,因此可以随时更改其值,而无需重新启动数据库。而MEMORY_MAX_TARGET初始化参数指定的最大内存大小,该值用作MEMORY_TARGET值的限制;该参数是静态的,因此实例启动后无法更改其值。
二、自动SGA内存管理
受自动管理的组件
自动共享内存管理简化了SGA的配置,自动分配内存用于以下内存池:数据库缓冲区缓存(默认池)、共享池、大型游泳池、Java池和流池,由 SGA_TARGET 参数控制。SGA_TARGET参数的值的变化会自动调整这些内存池的大小;如果将这些内存池设置为非零值,则自动共享内存管理将这些值作为最小值。
不自动管理的组件
以下内存缓存是手动大小的组件,不受自动共享内存管理控制:
重做日志缓冲区
重做日志缓冲区使用 LOG_BUFFER 初始化参数,该参数的值以字节表示,实例启动后,重做日志缓冲区的大小不能修改。
指标 REDO BUFFER ALLOCATION RETRIES 统计数据反映了在重做日志缓冲区中用户进程等待空间的次数。这个统计量的值应该在一个区间上接近于零,如果此值持续增加则意味着用户进程必须等待重做日志缓冲区中的空间可用。
-- 使用V$SYSSTAT性能视图查询此统计数据。
SQL> SELECT name, value FROM V$SYSSTAT WHERE name = 'redo buffer allocation retries';
NAME VALUE
--------------------------------------------- ----------
redo buffer allocation retries 2465
其他缓存缓存(例如KEEP、RECYCLE等)
KEEP池的大小使用 DB_KEEP_CACHE_SIZE 初始化参数,保持池的目的是在内存中保留对象,从而避免I/O操作。保存在保持池中的典型段是小的、经常使用的引用表。
RECYCLE池的大小使用 db_restcle_cache_size 初始化参数,回收池的目的是保留被扫描很少或不经常被引用的片段
固定SGA和其他内部分配
固定的SGA和其他内部分配使用DB_nK_CACHE_SIZE初始化参数。
当自动共享内存管理计算自动调优内存池的值时,分配给这些缓存的内存将从SGA_TARGET参数的值中扣除。修改SGA_TARGET参数的值可以使用 ALTER SYSTEM 命令。
启用自动共享内存管理需要设置初始化参数 STATISTICS_LEVEL 的值为 TYPICAL 或 ALL,并将 SGA_TARGET 的值设置为非零的小于或等于SGA_MAX_SIZE初始化参数值的值,SGA_MAX_SIZE参数的值默认为所有SGA组件的聚合设置,且不能动态调整;禁用自动共享内存管理时将SGA_TARGET在实例启动时将参数值动态设置为零。
三、手动共享内存管理
如果系统没有使用自动内存管理或自动共享内存管理,那么您必须手动配置以下SGA组件的大小:
数据库缓冲区缓存
数据库缓冲区缓存的大小使用DB_CACHE_SIZE初始化参数
-- 通过 V$DB_CACHE_ADVICE 咨询视图以返回缓冲池在各种大小的的I/O要求的预测
SQL> COLUMN size_for_estimate FORMAT 999,999,999,999 heading 'Cache Size (MB)'
SQL> COLUMN buffers_for_estimate FORMAT 999,999,999 heading 'Buffers'
SQL> COLUMN estd_physical_read_factor FORMAT 999.90 heading 'Estd Phys|Read Factor'
SQL> COLUMN estd_physical_reads FORMAT 999,999,999 heading 'Estd Phys| Reads'
SQL> SELECT size_for_estimate, buffers_