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