Oracle 内存调优(SGA / PGA)
Oracle 内存调优(SGA / PGA)
适用版本:Oracle Database 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07
1. 概述
Oracle 内存主要分[1]:
- SGA:共享内存
- PGA:私有内存
2. SGA 组件
2.1 Buffer Cache
-- 查看
SELECT
name,
bytes/1024/1024 AS mb
FROM v$sgainfo WHERE name = 'Buffer Cache Size';
-- 命中率
SELECT
1 - (physical_reads / (consistent_gets + db_block_gets)) AS hit_ratio
FROM v$buffer_pool_statistics;
2.2 Shared Pool
-- 查看
SELECT bytes/1024/1024 AS mb FROM v$sgainfo WHERE name = 'Shared Pool Size';
-- 库缓存命中率
SELECT
SUM(gets - gethits) / SUM(gets) AS miss_rate
FROM v$librarycache;
2.3 Redo Log Buffer
SELECT bytes/1024/1024 AS mb FROM v$sgainfo WHERE name = 'Redo Buffers';
2.4 Large Pool / Java Pool / Streams Pool
SELECT * FROM v$sgainfo;
3. SGA 配置
3.1 AMM(自动内存管理)
ALTER SYSTEM SET memory_target = 8G SCOPE=SPFILE;
ALTER SYSTEM SET memory_max_target = 16G SCOPE=SPFILE;
3.2 ASMM(自动共享内存管理)
ALTER SYSTEM SET sga_target = 6G SCOPE=SPFILE;
ALTER SYSTEM SET sga_max_size = 8G SCOPE=SPFILE;
ALTER SYSTEM SET pga_aggregate_target = 2G SCOPE=SPFILE;
3.3 手动
ALTER SYSTEM SET db_cache_size = 4G SCOPE=SPFILE;
ALTER SYSTEM SET shared_pool_size = 1G SCOPE=SPFILE;
ALTER SYSTEM SET pga_aggregate_target = 2G SCOPE=SPFILE;
4. Buffer Cache 调优
4.1 命中率
SELECT
1 - SUM(decode(name, 'physical reads', value, 0)) /
SUM(decode(name, 'db block gets from cache', value, 0) +
decode(name, 'consistent gets from cache', value, 0)) AS hit_ratio
FROM v$sysstat
WHERE name IN ('physical reads', 'db block gets from cache', 'consistent gets from cache');
-- 期望 > 95%
4.2 多缓冲池
-- KEEP / RECYCLE / DEFAULT
ALTER SYSTEM SET db_keep_cache_size = 500M SCOPE=SPFILE;
ALTER SYSTEM SET db_recycle_cache_size = 200M SCOPE=SPFILE;
-- 分配
ALTER TABLE small_lookup STORAGE (BUFFER_POOL KEEP);
ALTER TABLE big_history STORAGE (BUFFER_POOL RECYCLE);
4.3 调整大小
-- Buffer Cache Advisory
SELECT
size_for_estimate AS mb,
estd_physical_read_factor AS factor,
estd_physical_reads AS reads
FROM v$db_cache_advice;
-- factor < 1: 增加有益
5. Shared Pool 调优
5.1 库缓存
SELECT
namespace,
gethitratio,
pinhitratio
FROM v$librarycache;
-- 期望 > 95%
5.2 数据字典缓存
SELECT
SUM(gets) AS gets,
SUM(getmisses) AS misses,
SUM(getmisses) / SUM(gets) AS miss_ratio
FROM v$rowcache;
-- 期望 < 10%
5.3 共享池大小
-- Shared Pool Advisory
SELECT
shared_pool_size_for_estimate AS mb,
estd_lc_size,
estd_lc_time_saved
FROM v$shared_pool_advice;
5.4 减少硬解析
-- 1. 绑定变量
-- 2. CURSOR_SHARING
ALTER SYSTEM SET cursor_sharing = FORCE; -- 谨慎
6. Redo Log Buffer 调优
6.1 等待
SELECT event, time_waited
FROM v$system_event
WHERE event IN ('log buffer space', 'log file sync');
6.2 调整
ALTER SYSTEM SET log_buffer = 64M SCOPE=SPFILE;
-- 重启生效
7. PGA 调优
7.1 查看
SELECT
name,
value/1024/1024 AS mb
FROM v$pgastat
WHERE name IN ('total PGA allocated', 'maximum PGA allocated', 'over allocation count');
7.2 命中率
SELECT
name,
value
FROM v$pgastat
WHERE name IN ('cache hit percentage', 'extra bytes read/written');
-- 期望 > 99%
7.3 PGA Advisory
SELECT
pga_target_for_estimate AS mb,
estd_pga_cache_hit_percentage AS hit_pct,
estd_overalloc_count
FROM v$pga_target_advice;
7.4 工作区
SELECT
low_optimal_size / 1024 AS low_kb,
high_optimal_size / 1024 AS high_kb,
total_executions,
total_optimal_executions AS optimal,
total_onepass_executions AS onepass,
total_multipass_executions AS multipass
FROM v$sql_workarea_histogram;
8. 内存建议
8.1 查看建议
SELECT * FROM v$memory_target_advice;
SELECT * FROM v$sga_target_advice;
SELECT * FROM v$pga_target_advice;
8.2 调整
- 增大:减少 I/O
- 减小:避免过度分配
- 平衡:SGA vs PGA
9. HugePages
9.1 概述
- 减少页表
- 提升 TLB 命中率
- 大内存推荐
9.2 配置
# Linux
# /etc/sysctl.conf
vm.nr_hugepages = 1024
# sysctl -p
****** Oracle 参数
ALTER SYSTEM SET use_large_pages = ONLY SCOPE=SPFILE;
9.3 查看
grep Huge /proc/meminfo
10. 内存诊断
10.1 查看 SGA
SELECT * FROM v$sga;
SELECT * FROM v$sgastat;
10.2 查看进程内存
SELECT
pid,
serial#,
program,
PGA_USED_MEM / 1024 / 1024 AS pga_mb
FROM v$process;
10.3 内存错误
SELECT * FROM v$sysstat WHERE name LIKE '%memory%';
11. 常见坑与排错
11.1 ORA-04031: 共享池内存不足
-- 1. 增大 Shared Pool
-- 2. 优化 SQL(绑定变量)
-- 3. FLUSH SHARED POOL(临时)
ALTER SYSTEM FLUSH SHARED_POOL;
11.2 ORA-04036: PGA 内存不足
-- 增大 PGA_AGGREGATE_TARGET
ALTER SYSTEM SET pga_aggregate_target = 4G;
11.3 Buffer Cache 命中率低
-- 1. 增大 Buffer Cache
-- 2. 优化 SQL
-- 3. 检查全表扫描
11.4 内存碎片
-- 查看大对象
SELECT * FROM v$db_object_cache WHERE sharable_mem > 10000000;
12. 最佳实践
- AMM 简化:自动
- ASMM 精细:控制
- HugePages:大内存
- 绑定变量:减少硬解析
- KEEP 池:小热表
- RECYCLE 池:大冷表
- 监控命中率:性能
- Advisory 指导:调整
- 平衡 SGA/PGA:综合
- 定期检查:持续
13. 参考资料
[1] Oracle Database Performance Tuning Guide 19c, “Memory Configuration” https://docs.oracle.com/en/database/oracle/oracle-database/19/tgdba/memory.html