Oracle 内存管理深度

Oracle 内存管理深度

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


1. 概述

Oracle 内存管理深度解析[1]:

组成

  • SGA:System Global Area
  • PGA:Program Global Area
  • UGA:User Global Area

详细见:Oracle 内存管理 SGA/PGA


2. SGA 结构

2.1 Buffer Cache

- 数据块缓存
- LRU 算法
- 多种池
  - Default Pool
  - Keep Pool
  - Recycle Pool
  - NkCaches(2K/4K/8K/16K/32K)

2.2 Shared Pool

- Library Cache
  - 共享 SQL/PLSQL
  - 控制结构
- Data Dictionary Cache
- Result Cache
- Reserved Pool(大对象)

2.3 Redo Log Buffer

- Redo 记录
- LGWR 写入
- 循环

2.4 Large Pool

- RMAN 备份/恢复
- 共享服务器
- 并行查询
- 异步 I/O

2.5 Java Pool

- JVM
- Java 存储过程

2.6 Streams Pool

- Streams
- GoldenGate
- 队列

2.7 In-Memory Area(12c+)

- 列存储
- IM 列存储
- 快速分析

2.8 Fixed SGA

- 内部数据结构
- 后台进程通信

3. PGA 结构

3.1 Private SQL Area

- 绑定变量
- 运行时统计

3.2 SQL Work Area

- Sort Area
- Hash Area
- Bitmap Merge Area
- Bitmap Create Area

3.3 Session Memory

- 会话变量
- UGA(共享服务器在 SGA)

4. AMM vs ASMM

4.1 AMM(自动内存管理)

ALTER SYSTEM SET memory_target = 16G;
ALTER SYSTEM SET memory_max_target = 32G;

4.2 ASMM(自动共享内存管理)

ALTER SYSTEM SET sga_target = 12G;
ALTER SYSTEM SET pga_aggregate_target = 4G;

4.3 手动

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

5. Buffer Cache 详解

5.1 状态

- Pinned:被使用
- Clean:可重用
- Free:空闲
- Dirty:已修改

5.2 LRU List

- Most Recently Used
- Least Recently Used
- 辅助 LRU

5.3 Write List

- Dirty buffers
- DBWn 写入

5.4 多池

ALTER TABLE important_table STORAGE (BUFFER_POOL KEEP);
ALTER TABLE big_table STORAGE (BUFFER_POOL RECYCLE);

6. Shared Pool 详解

6.1 Library Cache

- SQL/PLSQL
- 游标
- 对象
- Latch 保护

6.2 共享 SQL

- 相同文本
- 相同对象
- 相同绑定类型
- 共享游标

6.3 绑定变量

-- 推荐
SELECT * FROM t WHERE id = :id;

-- 不推荐
SELECT * FROM t WHERE id = 100;
SELECT * FROM t WHERE id = 101;
-- 多个游标

7. Redo Log Buffer

7.1 流程

DML → Redo Log Buffer → LGWR → Redo Log File

7.2 触发 LGWR

- 提交
- 1/3 满
- 3 秒
- 1MB

7.3 调优

ALTER SYSTEM SET log_buffer = 64M;
-- 减少 log file sync

8. PGA 调优

8.1 Work Area

ALTER SYSTEM SET pga_aggregate_target = 4G;
ALTER SYSTEM SET pga_aggregate_limit = 8G;

8.2 自动

- Auto Memory Management
- Work Area 自动分配

8.3 监控

SELECT 
  name, value / 1024 / 1024 AS mb
FROM v$pgastat
WHERE name IN ('total PGA allocated', 'maximum PGA allocated');

9. In-Memory(12c+)

9.1 启用

ALTER SYSTEM SET inmemory_size = 4G SCOPE=SPFILE;

9.2 表

ALTER TABLE sales INMEMORY;
ALTER TABLE sales INMEMORY MEMCOMPRESS FOR QUERY LOW;

9.3 列存储

- 列式存储
- 快速分析
- 与行存储同步

详细见:Oracle In-Memory 列存储


10. HugePages

10.1 配置

# Linux
echo "vm.nr_hugepages = 4096" >> /etc/sysctl.conf
sysctl -p
******

### 10.2 启用

```sql
ALTER SYSTEM SET use_large_pages = ONLY SCOPE=SPFILE;

10.3 优势

- 减少 Page Table
- 大内存 SGA 性能
- TLB 高效

详细见:Oracle 内存管理 SGA/PGA


11. 内存监控

11.1 SGA

SELECT 
  pool, name, bytes / 1024 / 1024 AS mb
FROM v$sgastat
WHERE pool IS NOT NULL
ORDER BY pool, bytes DESC;

11.2 SGA Info

SELECT name, bytes / 1024 / 1024 AS mb, resizeable 
FROM v$sgainfo;

11.3 PGA

SELECT 
  spid, program, pga_used_mem, pga_alloc_mem, pga_max_mem
FROM v$process;

11.4 Buffer Cache

SELECT 
  name, 
  physical_reads, 
  db_block_gets, 
  consistent_gets,
  1 - (physical_reads / (db_block_gets + consistent_gets)) AS hit_ratio
FROM v$buffer_pool_statistics;

12. 内存建议

12.1 Buffer Cache Advice

SELECT 
  size_for_estimate AS size_mb,
  estd_physical_read_factor,
  estd_physical_reads
FROM v$db_cache_advice;

12.2 Shared Pool Advice

SELECT 
  shared_pool_size_for_estimate AS size_mb,
  estd_lc_size, estd_lc_memory_objects,
  estd_lc_time_saved
FROM v$shared_pool_advice;

12.3 PGA Advice

SELECT 
  pga_target_for_estimate AS target_mb,
  estd_pga_cache_hit_percentage,
  estd_overalloc_count
FROM v$pga_target_advice;

13. 性能问题

13.1 ORA-04031

- Shared Pool 不足
- 增大 Shared Pool
- 绑定变量
- 自动管理

13.2 ORA-04020

- Library Cache Latch
- 解析过多
- 绑定变量

13.3 低 Buffer Cache 命中率

- 增大 Buffer Cache
- 索引优化
- SQL 调优

14. 内存调优

14.1 SGA 大小

- 物理 50-70%
- OLTP:Buffer Cache 大
- DW:PGA 大

14.2 PGA 大小

- 物理 20-30%
- 排序多:增大
- pga_aggregate_limit

14.3 自动管理

- AMM 推荐
- ASMM 次选
- HugePages:禁用 AMM

15. 常见坑与排错

15.1 AMM + HugePages

- 冲突
- 选其一
- 生产用 ASMM + HugePages

15.2 PGA 爆

-- 1. 找高 PGA 会话
SELECT sid, serial#, program, pga_used_mem
FROM v$session
ORDER BY pga_used_mem DESC;

-- 2. kill
ALTER SYSTEM KILL SESSION 'sid,serial#';

15.3 Shared Pool 碎片

- 没 bind vars
- 大量 hard parse
- flush shared_pool(临时)

16. 最佳实践

  1. ASMM + HugePages:生产
  2. AMM:开发
  3. PGA 自动:现代
  4. Buffer Cache 命中率:监控
  5. 绑定变量:Shared Pool
  6. In-Memory:分析
  7. 监控告警:及时
  8. 建议视图:调整
  9. 定期检查:健康
  10. 文档化:配置

17. 参考资料

[1] Oracle Database Concepts 19c, “Memory” https://docs.oracle.com/en/database/oracle/oracle-database/19/cncpt/memory-architecture.html