Для более удобного анализа истории выполнения джобов, например для анализа времени выполнения, стандартный лог не очень подходит. Но все данные, которые видны в истории выполнения джоба хранятся в таблице msdb..sysjobhistory. Вот ее структура:
job_id определяется по таблице msdb..sysjobs, например вот так:
Для преобразования этого формата в секунды я написал функцию:
CREATE TABLE dbo.sysjobhistory(Тут есть описание этой таблицы.
instance_id int IDENTITY(1,1) NOT NULL,
job_id uniqueidentifier NOT NULL,
step_id int NOT NULL,
step_name sysname NOT NULL,
sql_message_id int NOT NULL,
sql_severity int NOT NULL,
message nvarchar(4000) NULL,
run_status int NOT NULL,
run_date int NOT NULL,
run_time int NOT NULL,
run_duration int NOT NULL,
operator_id_emailed int NOT NULL,
operator_id_netsent int NOT NULL,
operator_id_paged int NOT NULL,
retries_attempted int NOT NULL,
server sysname NOT NULL
)
job_id определяется по таблице msdb..sysjobs, например вот так:
SELECT * FROM msdb..sysjobs WHERE name like '%job%'Детально со всеми полями не разбирался, назначение большинства понятно из названий. Меня интересовало поле run_duration. Поле имеет тип int, там хранится время выполнения шага (строки, в которых step_id = 0, относятся ко всему джобу, т.е. в такой строке в поле run_duration будет время выполнения всего джоба). Формат: hhmmss, поскольку тип int, нули слева не отображаются. Т.е. значение 709 - это 7 минут 9 сек, 34508 - 3 часа 45 минут 8 секунд.
Для преобразования этого формата в секунды я написал функцию:
-- Конвертация времени из формата HHMMSS типа int в секунды
create function fn_convert_intdt_to_sec ( @ts int )В принципе если в передаваемом значении часы будут содержать более 2-х знаков, то тоже отработает.
returns int
as
begin
if (@ts < 60) return @ts
declare @sec int = @ts - (@ts/100)*100
declare @min int = (@ts - (@ts/10000)*10000)/100
declare @hr int = @ts/10000
return @hr*3600 + @min*60 + @sec
end
Комментариев нет :
Отправить комментарий