from v$locked_object v , dba_objects d , v$lock l , v$session s
where v.object_id = d.object_id
and v.object_id = l.id1
and v.session_id = s.sid
order by oracle_username , session_id ;
Display database locks and latches (with tables names, etc)
select s.sid, s.serial#, decode(s.process, null,decode(substr(p.username,1,1), '?',upper(s.osuser), p.username),decode(p.username, 'ORACUSR ', upper(s.osuser), s.process)) process,
nvl(s.username, 'SYS ('||substr(p.username,1,4)||')') username, decode(s.terminal, null, rtrim(p.terminal, chr(0)), upper(s.terminal)) terminal,decode(l.type,
'TM', 'DML/DATA ENQ', 'TX', 'TRANSAC ENQ', 'UL', 'PLS USR LOCK', 'BL', 'BUF HASH TBL', 'CF', 'CONTROL FILE', 'CI', 'CROSS INST F', 'DF', 'DATA FILE ',
'CU', 'CURSOR BIND ', 'DL', 'DIRECT LOAD ', 'DM', 'MOUNT/STRTUP', 'DR', 'RECO LOCK ', 'DX', 'DISTRIB TRAN', 'FS', 'FILE SET ', 'IN', 'INSTANCE NUM',
'FI', 'SGA OPN FILE', 'IR', 'INSTCE RECVR', 'IS', 'GET STATE ', 'IV', 'LIBCACHE INV', 'KK', 'LOG SW KICK ', 'LS', 'LOG SWITCH ',
'MM', 'MOUNT DEF ', 'MR', 'MEDIA RECVRY', 'PF', 'PWFILE ENQ ', 'PR', 'PROCESS STRT', 'RT', 'REDO THREAD ', 'SC', 'SCN ENQ ',
'RW', 'ROW WAIT ', 'SM', 'SMON LOCK ', 'SN', 'SEQNO INSTCE', 'SQ', 'SEQNO ENQ ', 'ST', 'SPACE TRANSC',
'SV', 'SEQNO VALUE ', 'TA', 'GENERIC ENQ ', 'TD', 'DLL ENQ ', 'TE', 'EXTEND SEG ', 'TS', 'TEMP SEGMENT', 'TT', 'TEMP TABLE ',
'UN', 'USER NAME ', 'WL', 'WRITE REDO ', 'TYPE='||l.type) type, decode(l.lmode, 0, 'NONE', 1, 'NULL', 2, 'RS', 3, 'RX',
4, 'S', 5, 'RSX', 6, 'X', to_char(l.lmode) ) lmode, decode(l.request, 0, 'NONE', 1, 'NULL', 2, 'RS', 3, 'RX', 4, 'S', 5, 'RSX', 6, 'X',
to_char(l.request) ) lrequest, decode(l.type, 'MR', decode(u.name, null,'DICTIONARY OBJECT', u.name||'.'||o.name),
'TD', u.name||'.'||o.name, 'TM', u.name||'.'||o.name, 'RW', 'FILE#='||substr(l.id1,1,3)|| ' BLOCK#='||substr(l.id1,4,5)||' ROW='||l.id2,
'TX', 'RS+SLOT#'||l.id1||' WRP#'||l.id2, 'WL', 'REDO LOG FILE#='||l.id1, 'RT', 'THREAD='||l.id1,
'TS', decode(l.id2, 0, 'ENQUEUE', 'NEW BLOCK ALLOCATION'), 'ID1='||l.id1||' ID2='||l.id2) object
from sys.v_$lock l, sys.v_$session s, sys.obj$ o, sys.user$ u,sys.v_$process p
where s.paddr = p.addr(+)
and l.sid = s.sid
and l.id1 = o.obj#(+)
and o.owner# = u.user#(+)
and l.type <> 'MR'
UNION ALL /*** LATCH HOLDERS ***/
select s.sid, s.serial#, s.process, s.username, s.terminal,
'LATCH', 'X', 'NONE', h.name||' ADDR='||rawtohex(laddr)
from sys.v_$process p, sys.v_$session s, sys.v_$latchholder h
where h.pid = p.pid
and p.addr = s.paddr
UNION ALL /*** LATCH WAITERS ***/
select s.sid, s.serial#, s.process, s.username, s.terminal,
'LATCH', 'NONE', 'X', name||' LATCH='||p.latchwait
from sys.v_$session s, sys.v_$process p, sys.v_$latch l
where latchwait is not null
and p.addr = s.paddr
and p.latchwait = l.addr
SQL*Plus script to display total time spent waiting info (from V$SESSION_EVENT) along with total time spent processing info (from V$SESSTAT for "CPU used by this session" statistic), along with a calculation of the percentage of time each session spends doing each thing. break on report on username on sid skip 1 set pagesize 100 lines 130 trimspool on trimout on verify off recsep off set trimspool on trimout on undef usr col type format a5 heading "Svc,|Wait" col username format a12 col sid format a30 col name format a42 col tot_secs_spent format 999,999,999,990.00 col pct_total format 990.00 heading "%|Total" select type, username, sid, name, tot_secs_spent, (tot_secs_spent / (sum(tot_secs_spent) over (partition by sid)))*100 pct_total from (select 'Wait' type, nvl(s.username, 'SYS') username, s.sid || ' (' || ltrim(s.program) || ')' sid, e.event name, e.time_waited/100 tot_secs_spent from v$session_event e, v$session s where e.sid = s.sid and nvl(s.username, 'SYS') = decode(upper('&&usr'), '', nvl(s.username, 'SYS'), upper('&&usr')) and e.time_waited > 0 union all select 'Svc' type, nvl(s.username, 'SYS') username, s.sid || ' (' || ltrim(s.program) || ')' sid, sn.name, ss.value/100 tot_secs_spent from v$sesstat ss, v$statname sn, v$session s where ss.sid = s.sid and ss.value > 0 and sn.statistic# = ss.statistic# and sn.name = 'parse time cpu' and nvl(s.username, 'SYS') = decode(upper('&&usr'), '', nvl(s.username, 'SYS'), upper('&&usr')) union all select 'Svc' type, nvl(s.username, 'SYS') username, s.sid || ' (' || ltrim(s.program) || ')' sid, sn.name, ss.value/100 tot_secs_spent from v$sesstat ss, v$statname sn, v$session s where ss.sid = s.sid and ss.value > 0 and sn.statistic# = ss.statistic# and sn.name = 'recursive cpu usage' and nvl(s.username, 'SYS') = decode(upper('&&usr'), '', nvl(s.username, 'SYS'), upper('&&usr')) union all select 'Svc' type, nvl(s.username, 'SYS') username, s.sid || ' (' || ltrim(s.program) || ')' sid, 'other cpu usage' name, (sst.value - (ssp.value + ssr.value))/100 tot_secs_spent from v$sesstat sst, v$statname snt, v$sesstat ssp, v$statname snp, v$sesstat ssr, v$statname snr, v$session s where sst.sid = s.sid and snt.statistic# = sst.statistic# and snt.name = 'CPU used by this session' and ssp.sid = s.sid and snp.statistic# = ssp.statistic# and snp.name = 'parse time cpu' and ssr.sid = s.sid and snr.statistic# = ssr.statistic# and snr.name = 'recursive cpu usage' and nvl(s.username, 'SYS') = decode(upper('&&usr'), '', nvl(s.username, 'SYS'), upper('&&usr'))) order by 2, 3, 6 desc, 5 desc, 4 spool sesstime / spool off