Oracle数据库的内存管理围绕**系统全局区(SGA)和程序全局区(PGA)**两大核心组件展开,两者分别承担共享内存与私有内存的职责,是数据库性能的关键基础。
SGA的管理经历了从手动配置到自动管理的演进,核心目标是优化内存利用率以适应不同负载需求。
手动配置需为每个SGA组件(如DB_CACHE_SIZE、SHARED_POOL_SIZE、LARGE_POOL_SIZE)单独设置大小,通过初始化参数直接指定。这种方式要求DBA对业务负载有深入了解,能精准分配各组件内存,但调整繁琐且易出现内存浪费或不足(如Shared Pool过小导致SQL解析频繁,Buffer Cache过小导致磁盘I/O升高)。
通过设置SGA_TARGET参数(指定SGA总大小)启用,Oracle会自动分配SGA组件内存。该策略的优势在于:
SGA_TARGET=8G后,Oracle会根据需要自动分配Shared Pool、Buffer Cache等组件的大小,无需逐一设置SHARED_POOL_SIZE、DB_CACHE_SIZE。SHARED_POOL_SIZE手动设置,或在ASMM下由Oracle自动调整;DB_CACHE_SIZE设置,ASMM下自动调整;LARGE_POOL_SIZE设置,ASMM下自动调整。PGA的管理同样分为手动配置与自动管理两种模式,核心是优化Work Area(工作区)大小以提升内存密集型操作性能。
通过为每个SQL操作类型(如SORT、HASH JOIN)设置最大工作区大小(如SORT_AREA_SIZE、HASH_AREA_SIZE),控制PGA内存消耗。这种方式适用于需要严格限制PGA内存的场景(如内存资源紧张的系统),但需DBA根据经验调整,易导致工作区过小(多遍扫描)或过大(内存浪费)。
通过设置PGA_AGGREGATE_TARGET参数(指定PGA总大小)启用,Oracle会自动分配各进程的工作区内存。该策略的优势在于:
PGA_AGGREGATE_TARGET=4G后,Oracle会自动分配Sort、Hash Join等操作的工作区大小,目标是让90%以上的操作运行在最优大小。Work Area的大小直接影响内存密集型操作的性能,Oracle将其分为三类:
Oracle的内存管理需与Linux系统配置协同,以提升整体性能。
通过启用大页内存(HugePages)减少TLB(Translation Lookaside Buffer)未命中,降低页表管理开销。配置步骤包括:
grep Huge /proc/meminfo;/etc/sysctl.conf,添加vm.nr_hugepages=128(根据Oracle SGA大小计算);sysctl -p。调整Linux内核参数以适配Oracle内存需求:
kernel.shmall(系统共享内存总页数)、kernel.shmmax(单个共享内存段最大大小),需设置为大于SGA_MAX_SIZE;fs.file-max(系统最大文件句柄数)、fs.aio-max-nr(异步I/O请求数),避免因文件句柄不足导致性能下降;vm.swappiness(系统使用交换空间的倾向),建议设置为10或更低(减少交换,提升内存访问效率)。Linux系统默认使用**LRU(最近最少使用)**算法回收内存,Oracle也可通过DB_CACHE_ADVICE、SHARED_POOL_ADVICE等视图监控内存使用情况,结合ALTER SYSTEM FLUSH SHARED_POOL(清理Shared Pool)、ALTER SYSTEM FLUSH BUFFER_CACHE(清理Buffer Cache)等命令手动回收内存(需谨慎使用,避免影响正在运行的业务)。