Oracle Latch 与 Mutex 深度解析
Oracle Latch 与 Mutex 深度解析
适用版本:Oracle Database 10g / 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07
1. 概述
Latch 与 Mutex 是 Oracle 内部并发控制[1]:
作用:
- 内存结构保护
- 短期同步
- 性能关键
详细见:Oracle 闩锁与 Mutex。
2. Latch
2.1 概念
- 轻量锁
- 内存结构
- 短期
- 自旋 + 睡眠
2.2 类型
- 共享(Read)
- 排他(Write)
2.3 获取
1. 自旋(spin)
2. 失败睡眠
3. 重试
4. 超时
3. 常见 Latch
3.1 shared pool latch
- Shared Pool 分配
- 大对象
- 严重
3.2 library cache latch
- Library Cache 操作
- SQL 解析
- 严重
3.3 cache buffers chains latch
- Buffer Cache 哈希链
- 块访问
- 常见
3.4 cache buffers lru chain latch
- LRU 链
- 替换
3.5 redo writing / copy latch
- Redo Log Buffer
- LGWR
4. Mutex
4.1 概念
- Mutual Exclusion
- 比 Latch 轻量
- 10g+ 替代部分 Latch
4.2 优势
- 更小(28 字节 vs 100+)
- 共享/排他
- 等待队列
- 减少 Latch 争用
4.3 应用
- Library Cache Mutex
- Cursor Pin
- Hash Table
5. Latch vs Mutex
| 特性 | Latch | Mutex |
|---|---|---|
| 大小 | 大 | 小 |
| 获取 | 自旋 | 自旋 |
| 等待 | 睡眠 | 等待 |
| 共享 | 部分 | 支持 |
| 队列 | 无 | 有 |
6. Latch 争用
6.1 原因
- 大量 hard parse
- 绑定变量缺失
- 高并发
- SQL 共享差
6.2 等待事件
- latch: shared pool
- latch: library cache
- latch: cache buffers chains
- latch free
6.3 解决
- 绑定变量
- 共享 SQL
- 减少 hard parse
- 调整 Shared Pool
7. Latch 诊断
7.1 v$latch
SELECT
name,
gets, misses,
spin_gets,
sleep1, sleep2, sleep3,
wait_time
FROM v$latch
WHERE misses > 0
ORDER BY misses DESC;
7.2 v$latchholder
SELECT
pid, sid, name, laddr
FROM v$latchholder;
7.3 v$latchname
SELECT * FROM v$latchname WHERE name LIKE 'library%';
7.4 v$latch_children
SELECT
child#, name, gets, misses,
spin_gets, sleep1
FROM v$latch_children
WHERE name = 'cache buffers chains'
ORDER BY misses DESC;
8. Mutex 诊断
8.1 v$mutex_sleep_history
SELECT
mutex_type,
location,
sleeps,
wait_time
FROM v$mutex_sleep_history
ORDER BY sleeps DESC;
8.2 v$mutex_sleep
SELECT
mutex_type,
location,
sleeps
FROM v$mutex_sleep
ORDER BY sleeps DESC;
9. 等待事件
9.1 Latch
- latch: shared pool
- latch: library cache
- latch: cache buffers chains
- latch: cache buffers lru chain
- latch: redo copy
- latch: redo writing
- latch free
9.2 Mutex
- cursor: pin S
- cursor: pin X
- cursor: pin S wait on X
- library cache: mutex X
- library cache: mutex S
10. 常见问题
10.1 shared pool latch
- 原:大量 hard parse
- 解:绑定变量
10.2 library cache latch
- 原:SQL 解析多
- 解:共享 SQL
10.3 cache buffers chains latch
- 原:热点块
- 解:
- 减少 hot block
- 反向索引
- 分区
10.4 cursor: pin S
- 原:游标争用
- 解:共享游标
11. 性能影响
11.1 Latch 争用
- CPU 高(自旋)
- 响应慢
- 吞吐低
11.2 Mutex 争用
- 类似 Latch
- 较少
- 现代优化
12. 监控
12.1 AWR
@?/rdbms/admin/awrrpt.sql
-- Top 5 Timed Events
-- Latch Activity
12.2 ASH
@?/rdbms/admin/ashrpt.sql
-- 实时
12.3 长期
SELECT
snap_id,
begin_time,
end_time,
latch_name,
gets, misses
FROM dba_hist_latch
ORDER BY snap_id DESC;
13. 调优
13.1 绑定变量
-- 推荐
EXECUTE IMMEDIATE 'SELECT * FROM t WHERE id = :1' USING v_id;
-- 不推荐
EXECUTE IMMEDIATE 'SELECT * FROM t WHERE id = ' || v_id;
13.2 Shared Pool 大小
ALTER SYSTEM SET shared_pool_size = 4G;
13.3 减少 hard parse
- 共享 SQL
- 绑定变量
- CURSOR_SHARING
13.4 热点块
-- 反向索引
CREATE INDEX idx ON t(id) REVERSE;
-- 分区
ALTER TABLE t PARTITION BY HASH(id) PARTITIONS 8;
14. 常见坑与排错
14.1 Latch 争用严重
- 绑定变量
- Shared Pool
- SQL 调优
14.2 cursor: pin S wait on X
- 长时间解析
- 优化 SQL
- 共享游标
14.3 library cache lock
- DDL 阻塞
- 长事务
- 检查依赖
15. 最佳实践
- 绑定变量:核心
- 共享 SQL:减少 hard parse
- Shared Pool 充足:避免争用
- 监控 Latch:及时
- 热点块处理:反向索引/分区
- Cursor Sharing:必要时
- AWR/ASH:诊断
- 测试:验证
- 文档化:性能基线
- 定期检查:健康
16. 参考资料
[1] Oracle Database Reference 19c, “V$LATCH” https://docs.oracle.com/en/database/oracle/oracle-database/19/refrn/