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. 最佳实践
- ASMM + HugePages:生产
- AMM:开发
- PGA 自动:现代
- Buffer Cache 命中率:监控
- 绑定变量:Shared Pool
- In-Memory:分析
- 监控告警:及时
- 建议视图:调整
- 定期检查:健康
- 文档化:配置
17. 参考资料
[1] Oracle Database Concepts 19c, “Memory” https://docs.oracle.com/en/database/oracle/oracle-database/19/cncpt/memory-architecture.html