启用大页内存(HugePages)
大页内存可减少页表管理开销,提升Oracle对内存的访问效率。需通过sysctl.conf配置:在/etc/sysctl.conf中添加vm.nr_hugepages=计算值(计算公式:Oracle SGA总大小(KB)/ 2048,取整数),执行sysctl -p使配置生效。例如,SGA为8GB时,vm.nr_hugepages=4096(8×1024×1024/2048)。
调整内核内存参数
kernel.shmall(系统共享内存总页数,通常设为物理内存(KB)/页大小(默认4KB))、kernel.shmmax(单个共享内存段最大大小,建议≥SGA_MAX_SIZE);fs.file-max(系统最大文件句柄数,建议≥10×进程数);fs.aio-max-nr(异步I/O请求数,建议≥10×进程数);net.core.rmem_default/net.core.rmem_max(接收缓冲区)、net.core.wmem_default/net.core.wmem_max(发送缓冲区),提升网络传输效率。优化swappiness参数
vm.swappiness控制系统使用交换分区(Swap)的倾向,建议设置为10或更低(默认60),减少内存交换对Oracle性能的影响(Swap会导致磁盘I/O骤增,降低响应速度)。
SGA是Oracle实例共享的内存区域,包括**数据库缓冲区缓存(DB Cache)、共享池(Shared Pool)、重做日志缓冲区(Redo Log Buffer)、大池(Large Pool)**等组件,优化重点是合理分配各组件大小,提升内存利用率。
采用自动共享内存管理(ASMM)
通过SGA_TARGET参数统一管理SGA内部组件,Oracle会根据负载自动调整各组件(如共享池、缓冲区缓存)的大小。需设置SGA_TARGET(SGA动态调整总大小,≤SGA_MAX_SIZE)和SGA_MAX_SIZE(SGA最大上限,静态参数,需重启生效)。适用于中大型数据库,简化管理的同时提升内存利用效率。
合理分配SGA组件大小
V$SGA_TARGET_ADVICE视图验证配置合理性;使用内存顾问工具
通过V$SGA_TARGET_ADVICE(SGA)和V$PGA_TARGET_ADVICE(PGA)视图,获取不同内存配置下的性能建议(如命中率、吞吐量),避免经验主义配置。例如,执行SELECT * FROM V$SGA_TARGET_ADVICE ORDER BY SGA_SIZE,查看不同SGA_SIZE下的性能指标。
PGA是每个Oracle进程私有的内存区域,主要用于排序、哈希连接、位图合并等内存密集型操作,优化重点是合理分配PGA_AGGREGATE_TARGET并优化SQL。
采用自动PGA内存管理(APMM)
通过PGA_AGGREGATE_TARGET参数统一管理PGA总大小,Oracle会根据工作负载动态分配各进程的PGA内存(如排序区、哈希区)。适用于大多数生产环境,简化PGA管理。建议设置为系统内存的20%-30%(OLTP系统可适当降低,DSS系统可适当提高)。
优化高PGA消耗SQL
ORDER BY(如为排序字段创建索引)、增加过滤条件减少数据量;NESTED LOOPS替代HASH JOIN(小驱动集场景)、调整HASH_AREA_SIZE(通过ALTER SESSION SET HASH_AREA_SIZE=值);TEMPFILE(而非数据文件)、放置在SSD等高性能存储、采用临时表空间组(TEMPORARY TABLESPACE GROUP)分散I/O压力。监控PGA使用情况
通过V$SQL_WORKAREA_ACTIVE视图识别长期处于ONEPASS(单次遍历)或MULTIPASS(多次遍历)模式的操作(如大排序),优先为其分配更多PGA内存;通过V$PGA_TARGET_ADVICE视图验证PGA_AGGREGATE_TARGET的合理性(命中率>90%为佳)。
合理规划SGA与PGA比例
通常SGA占系统内存的50%-70%,PGA占20%-30%,预留**10%-20%**给操作系统(避免系统内存不足导致OOM Killer终止Oracle进程)。
善用内存顾问工具
除了SGA/PGA顾问,还可使用Memory Advisor(Oracle Enterprise Manager提供)自动化调整内存配置,减少人工干预。
控制总内存需求
避免过度分配Oracle内存(如SGA+PGA超过系统内存的80%),导致系统频繁使用Swap,引发性能骤降。通过free -h、vmstat等命令监控系统内存使用情况,及时调整Oracle内存参数。
优化SQL语句