Часто бывает нужно посмотреть текущую активность в БД Oracle. Для этого я пользуюсь следующим запросом
(для БД, открытой несколькими экземплярами с использованием
RAC
):
select ses.inst_id,
username,
ses.sid,
client_identifier,
case when
w.state <> 'WAITING' then 'working '
else
'waiting '
end
||
case when
w.state <> 'WAITING' then 'on CPU or runqueue'
else
w.event
end
event,
w.wait_time_micro
wait_time_mc_sec,
w.time_since_last_wait_micro since_last_w_mcs,
ses.sql_id,
sa.sql_text,
sa.sql_fulltext
from gv$session
ses, gv$session_wait w, gv$sqlarea sa
where
ses.status = 'ACTIVE'
and ses.type
= 'USER'
and w.SID =
ses.sid
and w.inst_id
= ses.inst_id
and
ses.sql_id = sa.sql_id(+)
and
ses.inst_id = sa.inst_id(+)
Некоторые поля:
client_identifier – нужен мне для определения пользователя SAP R3
event – то, чем занята сессия в данный момент
wait_time_micro
– длительность ожидания в микросекундах. Если ждет сейчас – то длительность
текущего ожидания, если сейчас не ждет – длительность последнего ожидания.
time_since_last_wait_micro – если не ждет в момент запроса – время в микросекундах,
прошедшее с момента ожидания.
Запрос для одиночного экземпляра выглядит так:
select
username,
ses.sid,
client_identifier,
case when
w.state <> 'WAITING' then 'working '
else
'waiting '
end
||
case when
w.state <> 'WAITING' then 'on CPU or runqueue'
else
w.event
end
event,
w.wait_time_micro
wait_time_mc_sec,
w.time_since_last_wait_micro since_last_w_mcs,
ses.sql_id,
sa.sql_text,
sa.sql_fulltext
from v$session
ses, v$session_wait w, v$sqlarea sa
where
ses.status = 'ACTIVE'
and ses.type
= 'USER'
and w.SID =
ses.sid
and
ses.sql_id = sa.sql_id(+)
Это все в Oracle Database 11.2