当我们在执行某个update,或delete的时候,发布自己的SQL等在那里,如何更快速地定位到问题源?
[@more@]--------查看哪些对象被锁了!
select t2.username,
t2.sid,
t2.serial#,
t3.object_name,
t2.OSUSER,
t2.MACHINE,
t2.PROGRAM
from v$locked_object t1, v$session t2, dba_objects t3
where t1.session_id = t2.sid
and t1.object_id = t3.object_id
order by t2.logon_time;
--------察看表锁(可以查看什么类型的锁)
select /*+ rule */
s.sid sid,s.username username,s.machine machine,
l.type type,o.object_name object_name,
DECODE(l.lmode,
0,'None',
1,'Null',
2,'Row Share',
3,'Row Exlusive',
4,'Share',
5,'Sh/Row Exlusive',
6,'Exclusive') lmode,
DECODE(l.request,
0,'None',
1,'Null',
2,'Row Share',
3,'Row Exlusive',
4,'Share',
5,'Sh/Row Exlusive',
6,'Exclusive') request, l.block block
from v$lock l,v$session s, dba_objects o
where l.sid = s.sid and username != 'SYSTEM' and o.object_id(+) = l.id1;
------由于上面的语句很多,又比较难记。
其实当有等等的情况发生的时候,我们可以用以上视图来查看:
有谁在等待?
在等等哪个SESSION?
select * from dba_blockers;
--HOLDING_SESSION就是SESSION_ID
select * from dba_waiters;
--HOLDING_SESSION就是被等待的SESSION_ID
--WAITING_SESSION就是等待的SESSION_ID
从上面两种方法,其实我们已经能基本定位哪个SESSION锁了表。
下面来看一下,那个SESSION到底在执行哪些SQL?
SELECT /*+ ORDERED */
sql_text
FROM v$sqltext a
WHERE (a.hash_value, a.address) IN
(SELECT DECODE(sql_hash_value, 0, prev_hash_value, sql_hash_value),
DECODE(sql_hash_value, 0, prev_sql_addr, sql_address)
FROM v$session b
WHERE b.sid = &SID_ID)
ORDER BY piece ASC
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/703656/viewspace-1004462/ ,如需转载,请注明出处,否则将追究法律责任。