Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Finding query from oracle which is blocking session

I want to find out the query for which any operation is blocked. From DBA I'm getting input that particular session is blocked but I cannot proceed with investigation further without knowing which query is causing issue. is there any way to find out exact query causing issue?

like image 375
akki2346 Avatar asked Oct 23 '17 09:10

akki2346


People also ask

How do you check what session is doing in Oracle?

Viewing Sessions To view sessions: In SQL Developer, click Tools, then Monitor Sessions. A Sessions tab is displayed.

How do I find blocked transactions in SQL Server?

In SQL Server Management Studio (SSMS) Object Explorer, right-click the top-level server object, expand Reports, expand Standard Reports, and then select Activity - All Blocking Transactions. This report shows current transactions at the head of a blocking chain.

How do I check if an object is locked in SQL Developer?

The v$locked_object view can also be joined into the v$session view in order to gather session level information (SID, PID, status, machine) , and also joined into the dba_objects view in order to get the owner, the object name, and the type of objects that is currently being locked within the database. a.


Video Answer


3 Answers

Oracle Blocking session is very common. Please check the below query it will help you to get the detailed information.

select l1.inst_id,l1.sid, ' IS BLOCKING ', l2.sid,l1.type,l2.type,l1.lmode,l2.lmode,l2.inst_id
from gv$lock l1, gv$lock l2
where l1.block =1 and l2.request > 0and l1.id1=l2.id1
and l1.id2=l2.id2;
like image 93
Olivea Avatar answered Oct 16 '22 05:10

Olivea


First get the SQL_ID of the BLOCKING session from this script:

SELECT /*+ RULE */
s.sid,
s.serial#,
p.spid "OS SID",
s.sql_hash_value "HASH VALUE",
s.username "ORA USER",
s.status,
s.osuser "OS USER",
s.machine,
s.terminal,
s.type,
s.program,
s.logon_time,
s.last_call_et,
s.sql_id,
l.id1,
l.id2,
decode(l.block,0,'WAITING',1,'BLOCKING') block,
decode(
l.LMODE,1,'No Lock',
2,'Row Share',
3,'Row Exclusive',
4,'Share',
5,'Share Row Exclusive',
6,'Exclusive',null) lmode,
decode(
l.REQUEST,1,'No Lock',
2,'Row Share',
3,'Row Exclusive',
4,'Share',
5,'Share Row Exclusive',
6,'Exclusive',null) request ,
round(l.ctime/60,2) "MIN WAITING",
l.type
FROM v$process p, v$session s, v$Lock l
where p.addr = s.paddr
and s.sid=l.sid
and
(l.id1,l.id2,l.type) in
(SELECT l2.id1, l2.id2, l2.type
  FROM V$LOCK l2
  WHERE l2.request<>0)
order by l.id1,l.id2,l.block desc;

Then pass this SQL_ID into this script:

select sql_text from v$sqltext
where sql_id=<SQL_ID>;
like image 28
sandman Avatar answered Oct 16 '22 04:10

sandman


You can use the following query to find out whichs sessions are bloking and what they do:

select s.module,
       s.program,
       s.machine,
       s.osuser,
       sql.sql_text
from v$session s,
     v$sqlarea sql
where s.sql_id = sql.sql_id
and s.sid in (select blocking_session from v$session)
like image 41
Cyrille MODIANO Avatar answered Oct 16 '22 03:10

Cyrille MODIANO