1.latch free闩锁等待事件
当进程想获取锁存器时由于该锁存器被其他进程持有,此时会产生latch free等待事件。这些由于有些数据只能被一个人持有,oracle使用闩锁来保护数据结构,一次只有一个人修改和检查数据结构,其他需要访问数据结构的进程必须等到他们获取闩锁。这跟排队不同的是,请求锁存器的进程不需要在队列中等待。如果闩锁获取失败,则会等待一小会再次请求闩锁,这一小段等待事件成为“自旋(spin)”。如果多次自旋重复(spin iterations)之后还没获取到闩锁,则进程就会休眠一段事件,然后再尝试获取。
常见的锁存器有:cache buffer chains(高速缓存缓冲区链)、library cache(高速缓存)和shared pool(共享池)
在session_wait中event=latch freee主要看的参数P1,P2,P3
p1进程等待的闩锁地址
P2闩锁号,同v$latchname.latch#
P3 尝试的次数;显示进程视图获取闩锁的次数计数器
首先查看哪个闩锁竞争激励:
select v.name,v.gets,v.misses,v.immediate_gets,v.immediate_misses,v.sleeps from v$latch v order by sleeps desc;
(1)若是shared pool锁存器或library cache锁存器的争用激烈,则说明解析有问题,估计就是硬解析较多。
select a.sid,c.username,b.name,a.value,round((sysdate-c.logon_time)* 24) hours_connected from v$sesstat a,v$statname b,v$session c
where c.sid=a.sid and a.statistic#=b.statistic# and a.value>0 and b.name=’parse count(hard)’ order by a.vallue desc;