Планировщик заданий в Oracle - Создание и использование ресурсного окошка СУБД для задания

ОГЛАВЛЕНИЕ

Создание и использование ресурсного окошка СУБД для задания

Очередной запуск внутреннего задания может прийтись на время активного использования ресурсов СУБД другими процессами. Это может замедлить выполнение планового задания, обесценить его выполнение и даже поставить его выполнение под угрозу. Справиться с этой проблемой призвано ресурсное окошко. Суть его состоит в одновременном с очередным запуском задания автоматическом переключением СУБД на работу по требуемому ресурсному плану (план поведения для распределителя ресурсов СУБД. resource manager). Сами ресурсные окошки (windows) принадлежат схеме SYS, но создавать их разрешено и другим пользователям при наличии соответствующей привилегии:

CONNECT / AS SYSDBA
GRANT MANAGE SCHEDULER TO scott;

Ресурсный план построить несложно, но чтобы не отвлекаться, воспользуемся встроенным в любую БД планом SYSTEM_PLAN (см. таблицу DBA_RSRC_PLANS). Тогда создание окошка может выглядеть так:

CONNECT scott/tiger

BEGIN
DBMS_SCHEDULER.CREATE_WINDOW (
window_name => 'my_job_window'
, resource_plan => 'SYSTEM_PLAN'
, start_date => SYSTIMESTAMP
, repeat_interval => 'FREQ=MINUTELY; INTERVAL=3'
, duration => INTERVAL '1' MINUTE
);
END;
/

EXECUTE DBMS_SCHEDULER.ENABLE ( 'sys.my_job_window' )

Теперь каждые три минуты на минуту будет включаться ресурсный план SYSTEM_PLAN. Это легко наблюдать, выдав несколько раз от имени SYS:

COL window_name FORMAT A20
COL log_date FORMAT A40
SELECT * FROM (
SELECT log_date, window_name, operation
FROM dba_scheduler_window_log
ORDER BY log_date DESC
)
WHERE ROWNUM <= 10
;

Если подгадать момент, когда значение OPERATION для окошка MY_JOB_WINDOW станет OPEN, от имени SYS можно будет удостовериться, что план включен:

SYS> SHOW PARAMETER resource

NAME                             TYPE        VALUE
-------------------------------- ----------- ------------------------------
resource_limit                   boolean     FALSE
resource_manager_plan            string      SCHEDULER[0xD5A4]:SYSTEM_PLAN

Чтобы связать с этим периодически открывающимся ресурсным окошком задание, пользователю SCOTT достаточно указать его вместо расписания:

BEGIN
DBMS_SCHEDULER.CREATE_JOB (
job_name => 'my_window_job'
, program_name => 'simple_program'
, schedule_name => 'sys.my_job_window'
, enabled => FALSE
);
END;
/

EXECUTE DBMS_SCHEDULER.ENABLE ( 'my_window_job' )

С этого момента можно наблюдать уменьшение зарплат сотрудников, осуществляемое каждые три минуты в условиях благоприятного ресурсного плана. В качестве варианта, в процедуре CREATE_WINDOW можно было сослаться и на какое-то существующее расписание.

Так как СУБД в каждый момент времени умеет работать только по одному ресурсному плану, окошки «не умеют» перекрываться, а могут только переопределять своим планом другой, ранее установленный и пришедшийся на то же время.

В качестве развития этой темы Oracle позволяет создавать именованный список существующих окошек и под маркой «группы» (window group) указывать его заданию значением параметра SCHEDULE_NAME, то есть там, где у нас было указано имя окошка.