Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Oracle Tutorial.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
401.64 Кб
Скачать

Задача. Группировка лога выполнения процессов.

Дана таблица лога начала и окончания выполнения процессов kk_log (id number, lc_date date, lc_message varchar2(200)).

В таблицу пишутся записи вида 'start <процесс>' и 'finish <процесс>'.

Написать запрос о том, какой процесс в какое время начинался, в какое время заканчивался и сколько минут работал.

Создадим таблицу и заполним ее данными посложнее:

create table kk_log (id number, lc_date date, lc_message varchar2(200));

insert into kk_log (id,lc_date,lc_message) values (1,to_date('27.06.2012 0:55:47','dd.mm.yyyy hh24:mi:ss'), 'start Pump_Pers_PercStav2');

insert into kk_log (id,lc_date,lc_message) values (2,to_date('27.06.2012 1:56:00','dd.mm.yyyy hh24:mi:ss'), 'start Fill_depfis_pays');

insert into kk_log (id,lc_date,lc_message) values (3,to_date('27.06.2012 1:56:12','dd.mm.yyyy hh24:mi:ss'), 'finish Pump_Pers_PercStav2');

insert into kk_log (id,lc_date,lc_message) values (4,to_date('27.06.2012 1:56:28','dd.mm.yyyy hh24:mi:ss'), 'finish Fill_depfis_pays');

insert into kk_log (id,lc_date,lc_message) values (5,to_date('27.06.2012 8:06:39','dd.mm.yyyy hh24:mi:ss'), 'start Failing_process_which_not_finishes');

insert into kk_log (id,lc_date,lc_message) values (6,to_date('27.06.2012 9:02:33','dd.mm.yyyy hh24:mi:ss'), 'start Pump_Prep_PersLim');

insert into kk_log (id,lc_date,lc_message) values (7,to_date('27.06.2012 9:03:44','dd.mm.yyyy hh24:mi:ss'), 'start Fill_depfis_pays');

insert into kk_log (id,lc_date,lc_message) values (8,to_date('27.06.2012 9:04:07','dd.mm.yyyy hh24:mi:ss'), 'finish Fill_depfis_pays');

insert into kk_log (id,lc_date,lc_message) values (9,to_date('27.06.2012 9:04:07','dd.mm.yyyy hh24:mi:ss'), 'start Fill_depfis_pays');

insert into kk_log (id,lc_date,lc_message) values (10,to_date('27.06.2012 9:04:07','dd.mm.yyyy hh24:mi:ss'), 'finish Fill_depfis_pays');

insert into kk_log (id,lc_date,lc_message) values (11,to_date('27.06.2012 9:04:07','dd.mm.yyyy hh24:mi:ss'), 'start Pump_Pers_PercStav2');

insert into kk_log (id,lc_date,lc_message) values (12,to_date('27.06.2012 9:06:19','dd.mm.yyyy hh24:mi:ss'), 'finish Pump_Prep_PersLim');

insert into kk_log (id,lc_date,lc_message) values (13,to_date('27.06.2012 9:56:16','dd.mm.yyyy hh24:mi:ss'), 'start Failing_process_which_not_finishes');

insert into kk_log (id,lc_date,lc_message) values (14,to_date('27.06.2012 10:11:54','dd.mm.yyyy hh24:mi:ss'), 'finish Pump_Pers_PercStav2');

insert into kk_log (id,lc_date,lc_message) values (15,to_date('27.06.2012 11:08:41','dd.mm.yyyy hh24:mi:ss'), 'start Pump_cats');

В подзапросе q1 вычленим из лога название процесса и индикатор начала или окончания процесса (0 или 1 соответственно).

В подзапросе q2 с помощью функции lead найдем для каждой записи о процессе следующую запись, сортируя данные по id. Здесь же вычисляем lead_indicator, чтобы особо учесть случаи, когда после start идет не finish, а снова start (например, потому, что процесс не завершился успешно и был запущен повторно).

Наконец, во внешнем запросе отсечем записи по условию indicator = 0 и вычислим время выполнения каждого процесса в секундах:

select proc_name,

start_date,

decode(lead_indicator, 1, finish_date, null) finish_date,

(decode(lead_indicator, 1, finish_date, null) - start_date) * 60 * 60 * 24 run_time_in_seconds

from (select id,

lc_date start_date,

lead(lc_date) over(partition by proc_name order by id) finish_date,

proc_name,

indicator,

lead(indicator) over(partition by proc_name order by id) lead_indicator

from (select id,

lc_date,

trim(substr(lc_message, 7)) proc_name,

decode(substr(lc_message, 1, 6),

'start ',

0,

'finish',

1) indicator

from kk_log) q1) q2

where indicator = 0

order by start_date, finish_date;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]