Как узнать, сколько еще будет выполняться запущенная процедура?
Как узнать, сколько ещё будет выполняться запущенная процедура? И нет ли блокировок при её выполнении?
Насколько понял, эта информация должна отображаться в системном представлении v$session_longops. Но не совсем понимаю, как эту информацию можно получить, так как процедура запущена, но ничего не выводится:
SELECT *
FROM v$session_longops
WHERE sid = 123
no rows selected
Ответы (1 шт):
TL;DR Как долго еще будет выполняться процедура узнать невозможно.
Сколько луна сделает оборотов вокруг земли, пока не упадёт на неё?.
Только реализовав в самой процедуре дополнительные функциональные возможности, можно приблизительно оценить оставшееся время выполнения:
С функцией DBMS_APPLICATION_INFO.SET_SESSION_LONGOPS (подр. в этом ответе). Без вызова этой функции, представление
v$session_longopsничего выводить не будет.Логгировние отдельных шагов выполнения (как? сам ТС задавал этот вопрос).
Если выполнение процедуры блокируется (находится в состоянии ожидания) в результате выполнения SQL запросов или вызова других процедур запрашивающих блокировку, то посмотреть это можно таким простым запросом:
select
nvl (s.username, 'oracle') username, s.sid, s.serial#, blocking_session,
w.event, w.wait_class, w.wait_time, w.seconds_in_wait, w.state
from v$session s
join v$session_wait w on w.sid = s.sid
where username = 'ME'
order by w.seconds_in_wait desc
/
Сколько продлится ожидание, можно посмотреть в блокирующей сессии, например, как в этой теме: Как узнать оставшееся время работы запроса в Oracle?. Но будут ли при дальнейшем выполнении еще блокировки, узнать невозможно.
Практика - путь к совершенству (ц).
В текушей сессии (29) посылаем блокирующий запрос:
select dummy from dual for update
В другой сессии запускаем следующую процедуру:
create or replace procedure proc as
rc sys_refcursor;
begin
open rc for select dummy from dual for update;
dbms_session.sleep (10);
close rc; commit;
end;
/
exec proc
Выполнение будет в ожидании, т.к. сессия 29 блокирует его:
USERNAME SID BLOCKER EVENT WAIT_CLASS WAIT_TIME WAIT_SEC STATE
-------- ---------- ---------- --------------- ------------ ---------- ---------- -------
ME 45 29 enq: TX - row Application 0 326 WAITING
lock
contention