1.相关概念
latch是一种保护内存结构的轻量级锁。进程在等待当前繁忙latch时(此latch被其他进程持有),会产生此等待事件。在10g之前latch free包含了所有latch等待类型。在10g及以后,相关latch等待事件更容易分辨,比如latch: shared pool。然而还是有一些latch等待还以latch free等待事件表达。
如11.2.0.3环境
2.相关视图
v$latchname
v$latchname中的信息就是从v$latch中获取的,v$latch和v$latchname的记录一一对应。
v$latch
该视图描述了已latch name分组的更包括父子latch的信息,parent latch和child latch信息分别在 V$LATCH_PARENT 和V$LATCH_CHILDREN中。
我们通过查询一条记录来描述这个视图的字段含义
latch编号为187,name为redo allocation,也就是说这是一个关于redo分配的latch,latch address:0700000000021070,latch hash:999804931,latch等级为5(latch等级在后面做介绍),willing-to-wait 模式的latch请求次数GETS,willing-to-wait 模式且请求者需要等待的次数为misses,也就是说misses肯定小于等于gets。willing-to-wait的latch在等待latch时,请求者处于sleeping状态的请求次数。那么GETS>=MISSES>=SLEEPS。申请latch时直接获取到latch资源没有等待的次数IMMEDIATE_GETS。申请latch时直接失败IMMEDIATE_MISSES。Willing-to-wait首次申请latch失败,在spin时成功的次数为SPIN_GETS。WAIT_TIME等待latch的时间,单位微秒。WAITERS_WOKEN,WAITS_HOLDING_LATCH已在旧版本中不可用。
可以看出latch的总申请次数应该是:GETS+IMMEDIATE_GETS+IMMEDIATE_MISSES。
那么平均latch平均响应时间应是:
WAIT_TIME /( GETS+IMMEDIATE_GETS+IMMEDIATE_MISSES)。
比较奇怪的是SLEEP[1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11]这些字段,刚开始看上去令人费解,其实就是直方图。
官方文档中描述为:这些列只在oracle的较早版本有效,现在这些列已经不收集数据了,全部显示为0。可以通过V$EVENT_HISTOGRAM 视图中搜索关键字latch free或latch:%查看。
v$latch视图看上去字段很多,但是可用的并不多。
dba_hist_latch_name
先看看这个视图描述
dba_hist_latch_name没有snap_id,说明该视图其实不是一个真正的hist视图,官方文档中描述有点不太合适
其实把v$latchname和dba_hist_latch_name看成是静态视图即可,与v$statname类似。不同版本的数据库latch会有所不同,比如11.2.0.3和11.2.0.4中的latch数量就不同,11.2.0.3中为553个,11.2.0.4中未582个。
dba_hist_latch
dba_hist_latch与快照就相关了,该视图收集的是v$latch的信息,字段与v$latch类似。值得注意的是,dba_hist_latch记录了快照内的latch申请信息等,但是不是每次申请latch都会造成latch free等待。
参考文档:
WAITEVENT: "latch free" Reference Note (文档ID 34576.1)
Resolving Issues Where "Latch Free" Wait Contention Causes Performance Degradation (文档ID 1476736.1)