Oracle SGA 自动管理详解

Oracle SGA 自动管理详解

适用版本:Oracle Database 10g / 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07


1. 概述

SGA 自动管理(ASMM)自动调整 SGA 组件[1]:

详细见:Oracle 内存调优 SGA PGAOracle SGA 调优


2. ASMM

2.1 启用

ALTER SYSTEM SET sga_target = 8G SCOPE=BOTH;
ALTER SYSTEM SET sga_max_size = 10G SCOPE=SPFILE;

2.2 自动调整

- Buffer Cache
- Shared Pool
- Large Pool
- Java Pool
- Streams Pool
- Fixed SGA + Redo Buffer 不自动

3. AMM

3.1 启用

ALTER SYSTEM SET memory_target = 16G SCOPE=BOTH;
ALTER SYSTEM SET memory_max_target = 20G SCOPE=SPFILE;

3.2 优势

- SGA + PGA 统一管理
- 自动
- 简化

3.3 限制

- /dev/shm 大小
- HugePages
- 不适合所有场景

4. 组件

4.1 Buffer Cache

- 数据块缓存
- LRU
- 自动调整

4.2 Shared Pool

- 库缓存
- 数据字典
- 结果缓存

4.3 Large Pool

- RMAN
- 并行
- 共享服务器

4.4 Java Pool

- Java 程序
- JVM

4.5 Streams Pool

- Streams
- GoldenGate
- 队列

5. 查看

5.1 视图

SELECT * FROM v$sga;
SELECT * FROM v$sgainfo;
SELECT * FROM v$sga_dynamic_components;
SELECT * FROM v$sga_dynamic_free_memory;
SELECT * FROM v$sga_resize_ops;

5.2 参数

SHOW PARAMETER sga;
SHOW PARAMETER memory;

6. 调整

6.1 自动

- ASMM 自动调整
- 监控
- 评估

6.2 手动

ALTER SYSTEM SET db_cache_size = 4G;
ALTER SYSTEM SET shared_pool_size = 2G;

6.3 颗粒

SELECT * FROM v$sga_dynamic_components;
-- GRANULE_SIZE

7. HugePages

7.1 配置

# /etc/sysctl.conf
vm.nr_hugepages = 4096

# 检查
cat /proc/meminfo | grep Huge

7.2 Oracle

ALTER SYSTEM SET use_large_pages = ONLY SCOPE=SPFILE;

7.3 优势

- 大页
- TLB 效率
- 性能

8. Buffer Cache

8.1 大小

- 命中率 > 95%
- 监控
- 调整

8.2 查看

SELECT name, value FROM v$sysstat 
WHERE name IN ('db block gets', 'consistent gets', 'physical reads');

-- 命中率
SELECT 1 - (physical_reads / (db_block_gets + consistent_gets)) AS hit_ratio
FROM ...

8.3 多池

ALTER SYSTEM SET db_keep_cache_size = 1G;
ALTER SYSTEM SET db_recycle_cache_size = 1G;

详细见:Oracle Buffer Cache 调优


9. Shared Pool

9.1 库缓存

SELECT namespace, gets, gethits, pins, pinhits
FROM v$librarycache;

9.2 命中率

- gethitratio > 95%
- pinhitratio > 95%
- 调整

9.3 绑定变量

- 减少硬解析
- 命中率
- 性能

详细见:Oracle Shared Pool 调优


10. 监控

10.1 大小

SELECT component, current_size, min_size, max_size
FROM v$sga_dynamic_components;

10.2 调整历史

SELECT component, oper_type, oper_mode, parameter, 
       initial_size, target_size, final_size, status
FROM v$sga_resize_ops
ORDER BY start_time DESC;

10.3 建议

SELECT * FROM v$db_cache_advice;
SELECT * FROM v$shared_pool_advice;

11. 性能

11.1 命中率

- Buffer Cache: > 95%
- Library Cache: > 95%
- Dictionary Cache: > 95%

11.2 等待

SELECT event, time_waited 
FROM v$system_event 
WHERE event LIKE '%buffer%' OR event LIKE '%library%';

详细见:Oracle 数据库等待事件详解


12. 应用场景

12.1 OLTP

- Buffer Cache 大
- Shared Pool 中
- 绑定变量

12.2 OLAP

- Buffer Cache 大
- 并行
- Large Pool

12.3 混合

- 自动调整
- ASMM
- 监控

13. 常见问题

13.1 ORA-00838

- sga_target 过小
- 调整

13.2 ORA-04031

- Shared Pool 不足
- ASMM 自动
- 优化

13.3 性能

- 命中率
- 等待
- 调优

14. 最佳实践

  1. ASMM:推荐
  2. HugePages:大 SGA
  3. 绑定变量:硬解析
  4. 监控:命中率
  5. 调整:建议
  6. 颗粒:合理
  7. 多池:KEEP/RECYCLE
  8. 文档:配置
  9. 测试:性能
  10. 演练:定期

15. 参考资料

[1] Oracle Database Administrator’s Guide 19c, “Memory Management” https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/