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');