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 对比

方面LatchMutex
内存
速度
持有短期更短
数量有限
替代-部分 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. 最佳实践

  1. 绑定变量:必用
  2. 共享池:足够
  3. 热点块:消除
  4. 反向索引:评估
  5. 分区:分散
  6. 隐含参数:慎用
  7. 监控:Latch/Mutex
  8. ASH:定位
  9. 测试:验证
  10. 原理:理解

16. 参考资料

[1] Maclean Liu, “Latch 与 Mutex”, https://oradb.me [2] Oracle Database Reference 19c