Find the blocking sessions, objects and sql in Oracle

Find the blocking sessions that were blocking shows objects and SQL

SELECT S.SID, p.SPID, s.machine, s.username, CTIME/60 as minutes_locking , do.object_name as locked_object, q.sql_Text 
From v$lock l 
JOIN v$session s on l.sid=s.sid 
JOIN v$process p on p.addr=s.paddr 
JOIN v$locked_object lo on l.sid=lo.session_id 
JOIN dba_objects do on lo.object_id = do.object_id 
JOIN v$sqlarea q on s.sql_hash_value=q.hash_value and s.sql_address=q.address 
where block=1

Find the blocking session that blocks more than 15 minutes

SELECT S.SID, p.SPID, s.machine, s.username, CTIME/60 as minutes_locking , do.object_name as locked_object, q.sql_Text 
From v$lock l 
JOIN v$session s on l.sid=s.sid 
JOIN v$process p on p.addr=s.paddr 
JOIN v$locked_object lo on l.sid=lo.session_id 
JOIN dba_objects do on lo.object_id = do.object_id 
JOIN v$sqlarea q on s.sql_hash_value=q.hash_value and s.sql_address=q.address 
where block=1 and ctime/60>15

Easy way to see the blocking in the SQL session:

SELECT s1.inst_id, s2.inst_id, s1.username||'@'||s1.machine||'(SID='||s1.sid||') is blocking '||s2.username||'@'||s2.machine||'(SID='||s2.sid||')' AS blocking_status from gv$lock l1, gv$session s1, gv$lock l2, gv$session s2 
where s1.sid=l1.sid and s2.sid=l2.sid and s1.inst_id = l1.inst_id and s2.inst_id = l2.inst_id and l1.BLOCK=1 and l2.request > 0 
and l1.id1 = l2.id2 and l1.id2 = l2.id2
This entry was posted in Oracle on by .
Unknown's avatar

About SandeepSingh

Hi, I am working in IT industry with having more than 15 year of experience, worked as an Oracle DBA with a Company and handling different databases like Oracle, SQL Server , DB2 etc Worked as a Development and Database Administrator.

Leave a Reply