从本质上来讲,Oracle所有资源都是串行化操作的,即Oracle不允许多个进程同时对同一对象进行修改。为了在串行化上实现并行化,Oracle推出了LOCK、LATCH、MUTEX三种不同的机制来保护不同的对象,所以快速定位资源持有者是DBA处理性能问题时的一个必备技能。
下面是获取LOCK相关的资源持有者信息的SQL:
select * from gv$lock where block=1;
select * from dba_waiters;
下面是获取LATCH相关的持有者信息的SQL:
select * from v$latchholder;
在获取MUTEX相关的持有者信息时,假如当前系统正在发生cursor: pin S wait on X争用,可以用以下SQL查出MUTEX的持有者信息:
select to_number(substr(to_char(rawtohex(p2raw)),1,8),'XXXXXXXX') sid
from v$session
where event = 'cursor: pin S wait on X';
在高并发的环境中,争用往往发生在Library Cache Handle(以下简称Handle)和Library Cache Object(以下简称LCO)中。Handle上的LATCH争用主要表现为Library Cache Lock等待事件,可以用以下SQL查出Handle上的持有者信息:
select b.sid,a.user_name,a.kglnaobj
from x$kgllk a , v$session b
where a.kgllkhdl in
(select p1raw from v$session_wait
where wait_time=0 and event = 'library cache lock')
and a.kgllkmod <> 0
and b.saddr=a.kgllkuse;
LCO上的争用主要表现为Library Cache Pin等待事件,可以用以下SQL查出Handle上的持有者信息:
select sid from x$kglpn , v$session
where KGLPNHDL in
(select p1raw from v$session_wait
where wait_time=0 and event like 'library cache pin%')
and KGLPNMOD <> 0
and v$session.saddr=x$kglpn.kglpnuse;
下面是用于获取 Row Cache相关的持有者信息的SQL:
select * from v$rowcache_parent where lock_mode<>0;
提示 从Oracle 10g开始,V$SESSION视图增加了BLOCKING_SESSION字段,很多资源阻塞者会话都可以通过该字段查到。