Oracle 数据库内存锁 Latch 解析

导读
本文介绍Oracle数据库内存锁Latch的相关概念,帮助你更好的理解Oracle内存锁,方便日后进行问题排查和SQL优化。

1、什么是 Latch?

  • latch是一种Oracle低级别的内存保护机制,用于序列化对于非常短时间的内存结构的并发访问。

  • latch是一种简单的内存结构。

  • latch的大小通常在100-200B左右(取决于Oracle的版本和Oracle运行的平台)。

  • latch封装在一个latch 状态对象的结构中(从Oracle 8.0开始)。

  • latch可以驻留在固定的SGA(父latch)或共享池。

  • latch可以被共享(从Oracle 8.0开始),比如获取cache buffers chains latch用于检查buffer chain 。

  • latch是一个lock。

2、什么是 Latch 争用?

我想获得一个latch,但是有人已经拿到这个latch了。

要排查这种latch,需要排查如下信息:

(1)是谁,为什么要获得一个latch(等待者)

(2)是谁,为什么拿到了这个latch(阻塞者)

换句话说,是找出是谁,为什么阻塞我,就像普通的队列锁一样。

请记住,latch是一种内存锁。

3、如何排查Latch 争用?

可以查询如下视图:

v$session

v$session_wait

v$session_name

v$active_session_history

PARAMETER1 是latch的地址,地址映射到v l a t c h p a r e n t 和 v latch_parent和v latchparentvlatch_children的ADDR列。

3.1、查询v$session中的latch地址p1,p2,p3


select event,
       P1TEXT,
       P1,
       P1RAW,
       P2TEXT,
       P2,
       P2RAW,
       P3TEXT,
       P3,
       P3RAW
 from v$session 
 where event like '%latch%';


  

3.2、查询v$session_wait中的latch地址p1,p2,p3

select sid,
       seq#,
       event,
       P1TEXT,
       P1,
       P1RAW,
       P2TEXT,
       P2,
       P2RAW,
       P3TEXT,
       P3,
       P3RAW
  from v$session_wait
 where event like '%latch%';

3.3、查询v$session_name中的latch地址p1,p2,p3的定义

 select event#,
        event_id,
        name,
        parameter1,
        parameter2,
        parameter3,
        wait_class_id,
        wait_class#,
        wait_class
   from v$event_name
  where name like '%latch%';

3.4、查询v$active_session_history中的latch地址p1,p2,p3

select event, event_id, event#, seq#, p1text, p1, p2text, p2, p3text, p3
   from v$active_session_history
  where event like '%latch%';

4、确认Latch的持有者

查询视图v$latchholder

select * from v$latchholder;
       PID        SID LADDR            NAME                                                                   GETS
---------- ---------- ---------------- ---------------------------------------------------------------- ----------
       192       1919 07000013E5709FB0 simulator lru latch                                              1003192492
       678       2871 0700001322A502E0 cache buffers chains                                                4174963
       801       2881 070000135FDA05D8 gcs resource hash                                                 155350695
       818       2774 07000013A56D3D90 gc element                                                       1710224681

这里将显示进程状态对象的top latch持有者,查看latch 持有者的会话ID,即SID。

进程状态对象持有的任何latch都显示在那里。

在99.99%的情况下,足以用于实际故障排除。

v$latchholder不报告持有的其他latch(当持有top latch时)。

在0.01%的情况下,可以使用旧的latch争用故障排除方法。另外,也可以通过直接的SGA附加来遍历状态对象树

5、Latch争用排除方法

  • 确定遇到问题的会话,请记住,通过数据库会话,数据库没有问题,只有用户有问题
  • 量化该会话等待最多的latch,等待时间是否足够重要。
  • 确定争用中涉及的子latch,争论是集中在一个特定的子latch上,还是蔓延到许多子latch上?
  • 确定latch在内核代码中的位置(为什么)。查看视图V L A T C H H O L D E R , X LATCHHOLDER ,X LATCHHOLDERXKSUPRLAT ,X$KSUPR
  • 27
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值