26.01.2010 г.
Иногда возникает необходимость просмотреть длительные запросы, выполняемые в данный момент в определённой сессии. Нижеприведённый код выводит информацию о действии, выполненном объёме, общем объёме, проценте выполнения, единицах, времени, прошедшем с момента старта, и об оставшемся времени выполнения.
SELECT decode(
target_desc
,NULL
,decode(target,NULL,opname, concat(opname, concat (' - ',target)))
,decode(target,NULL,concat(opname, concat (' : ',target_desc))
,concat(opname, concat (' : ',concat(target_desc,concat (' - ',target)))))) action
,sofar
,totalwork
,round(sofar*100/totalwork,2) percent
,units
,TO_CHAR (TRUNC (SYSDATE) + NUMTODSINTERVAL (elapsed_seconds, 'second'),'hh24:mi:ss') elapsed_time
,TO_CHAR (TRUNC (SYSDATE) + NUMTODSINTERVAL (time_remaining, 'second'),'hh24:mi:ss') time_remaining
FROM v$session_longops
WHERE sid = 492 AND serial# = 2611;
В этом случае нужно предварительно получить sid и serial#, например, так:
select sid,serial# from v$session where username='SCOTT' and machine like 'myhost%';
то же, что и в первом случае, но для всех активных сессий:
SELECT decode(
target_desc
,NULL
,decode(target,NULL,opname, concat(opname, concat (' - ',target)))
,decode(target,NULL,concat(opname, concat (' : ',target_desc))
,concat(opname, concat (' : ',concat(target_desc,concat (' - ',target)))))) action
,sofar
,totalwork
,round(sofar*100/totalwork,2) percent
,units
,TO_CHAR (TRUNC (SYSDATE) + NUMTODSINTERVAL (elapsed_seconds, 'second'),'hh24:mi:ss') elapsed_time
,TO_CHAR (TRUNC (SYSDATE) + NUMTODSINTERVAL (time_remaining, 'second'),'hh24:mi:ss') time_remaining
FROM v$session_longops
WHERE sid||'.'||serial# in (select sid||'.'||serial# from v$session where status='ACTIVE');