Oracle Maclean Latch 与 Mutex 深入
Oracle Maclean Latch 与 Mutex 深入
来源:Maclean Liu (刘相兵) / oradb.me 适用版本:Oracle Database 10g+ 文档版本:v1.0 / 2026-07-22
1. 概述
Maclean 对 Latch/Mutex 有深入分析[1]。
详细见:Oracle Latch 与 Mutex 深度解析。
2. Latch
2.1 作用
- 共享内存结构保护
- 短期锁
- 串行化访问
2.2 特点
- 轻量
- 短时间持有
- 自旋(spin)
- 睡眠(sleep)
2.3 工作流程
1. 请求 Latch
2. Spin(CPU 循环)
3. 失败 → Sleep
4. 唤醒 → 重试
5. 获取 → 工作 → 释放
3. 常见 Latch
3.1 cache buffers chains
- 保护 Buffer Cache 哈希链
- 热点块
- 高并发
3.2 cache buffers lru chain
- 保护 LRU 链
- Buffer 替换
3.3 library cache
- 保护 Library Cache
- SQL/PLSQL
- 解析
3.4 shared pool
- 保护 Shared Pool
- 内存分配
3.5 redo allocation
- Redo Buffer 分配
- LGWR
3.6 redo copy
- Redo 写入
- 并行
4. Latch 诊断
4.1 v$latch
SELECT name, gets, misses, spin_gets, sleep1, wait_time
FROM v$latch
ORDER BY misses DESC
FETCH FIRST 10 ROWS ONLY;
4.2 v$latch_children
SELECT child#, gets, misses, spin_gets
FROM v$latch_children
WHERE name = 'cache buffers chains'
ORDER BY misses DESC FETCH FIRST 10 ROWS ONLY;
4.3 Maclean 分析
- gets 多:频繁访问
- misses 多:争用
- spin_gets:自旋成功
- sleep:睡眠多 → 严重
5. Mutex
5.1 作用
- 替代部分 Latch
- 更轻量
- 10g+ 引入
5.2 优势
- 内存更小
- 更快
- 减少 Latch 争用
5.3 类型
- Cursor Parent
- Cursor Pin
- Hash Bucket
- NLS
- Library Cache
6. Mutex 诊断
6.1 v$mutex_sleep
SELECT mutex_type, location, sleeps, wait_time
FROM v$mutex_sleep
ORDER BY sleeps DESC;
6.2 v$mutex_sleep_history
SELECT * FROM v$mutex_sleep_history
WHERE rownum <= 10;
6.3 Maclean 分析
- sleeps 多:争用
- location:代码位置
- 关联 SQL
7. Latch vs Mutex
7.1 对比
| 方面 | Latch | Mutex |
|---|---|---|
| 内存 | 大 | 小 |
| 速度 | 慢 | 快 |
| 持有 | 短期 | 更短 |
| 数量 | 有限 | 多 |
| 替代 | - | 部分 Latch |
7.2 Maclean 观点
- Mutex 是演进
- 减少 Latch 争用
- 11g+ Library Cache Mutex
8. 热点块
8.1 查找
-- Latch 地址
SELECT hladdr FROM x$bh WHERE hladdr IN (
SELECT addr FROM v$latch_children
WHERE name = 'cache buffers chains'
ORDER BY misses DESC FETCH FIRST 5 ROWS ONLY
);
-- 块
SELECT d.owner, d.object_name, d.object_type
FROM dba_extents d, x$bh x
WHERE d.file_id = x.file#
AND x.dbabuf BETWEEN d.block_id AND d.block_id + d.blocks - 1
AND x.hladdr = '&latch_addr';
8.2 Maclean 方法
- Latch → 地址 → 块 → 对象
- 找热块
- 优化
9. 优化
9.1 cache buffers chains
- 反向索引
- 分区表
- 减少热点
- 调整 DB_BLOCK_BUFFERS
9.2 library cache
- 绑定变量
- 共享池大小
- 减少硬解析
9.3 shared pool
- 共享池足够
- 减少解析
- 评估
9.4 redo
- LOG_BUFFER
- Redo Log 大小
- LGWR 优化
10. 参数
10.1 spin
- _spin_count(隐含)
- 默认 2000
- 调整谨慎
10.2 Latch
- _latch_class_*(隐含)
- 谨慎
10.3 Maclean 警告
- 隐含参数慎用
- 优先 SQL/结构优化
- 联系 Oracle Support
11. 案例:library cache lock
11.1 现象
- Library Cache Lock
- 应用卡
11.2 Maclean 诊断
SELECT sid, event, p1raw, sql_id
FROM v$session
WHERE event LIKE 'library cache%';
11.3 根因
- 未用绑定变量
- DDL 冲突
- 共享池不足
11.4 优化
- 绑定变量
- 共享池
- 评估
12. 案例:cache buffers chains
12.1 现象
- Latch 争用
- 高并发
12.2 Maclean 诊断
- 找热块
- 评估
12.3 优化
- 反向索引
- 分区
- 减少并发
13. 监控
13.1 AWR
- Latch/Mutex 部分
- TOP 等待
13.2 ASH
SELECT event, count(*) FROM v$active_session_history
WHERE event LIKE '%latch%' OR event LIKE '%mutex%'
GROUP BY event;
13.3 趋势
- 历史对比
- 监控
14. Maclean 方法论
14.1 步骤
1. 等待事件
2. Latch/Mutex 类型
3. 找热块/SQL
4. 根因
5. 优化
14.2 工具
- v$latch
- v$latch_children
- v$mutex_sleep
- x$bh
15. 最佳实践
- 绑定变量:必用
- 共享池:足够
- 热点块:消除
- 反向索引:评估
- 分区:分散
- 隐含参数:慎用
- 监控:Latch/Mutex
- ASH:定位
- 测试:验证
- 原理:理解
16. 参考资料
[1] Maclean Liu, “Latch 与 Mutex”, https://oradb.me [2] Oracle Database Reference 19c