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

特性LatchMutex
大小
获取自旋自旋
等待睡眠等待
共享部分支持
队列

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. 最佳实践

  1. 绑定变量:核心
  2. 共享 SQL:减少 hard parse
  3. Shared Pool 充足:避免争用
  4. 监控 Latch:及时
  5. 热点块处理:反向索引/分区
  6. Cursor Sharing:必要时
  7. AWR/ASH:诊断
  8. 测试:验证
  9. 文档化:性能基线
  10. 定期检查:健康

16. 参考资料

[1] Oracle Database Reference 19c, “V$LATCH” https://docs.oracle.com/en/database/oracle/oracle-database/19/refrn/