Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 инструмент для анализа работы джобов.  [new]
denis_viktorovich
Member

Откуда: Екб
Сообщений: 1206
Доброго времени суток!
Посоветуйте пожалуйста инструмент для анализа зоопарка Job-ов, на предмет сколько в среднем (скажем за месяц) выполняется, просмотреть потенциальные пересечения. Понятное дело можно копать историю, но если есть какаято утилита, то было бы проще.
19 ноя 19, 16:12    [22019809]     Ответить | Цитировать Сообщить модератору
 Re: инструмент для анализа работы джобов.  [new]
PsyMisha
Member

Откуда: другая столица
Сообщений: 765
denis_viktorovich,

Держите утилитку. Сиквельный скрипт, весьма удобный, возможно ответит на часть вопросов

+
IF OBJECT_ID('fn_freq_interval_desc', 'FN') IS NOT NULL
DROP FUNCTION [fn_freq_interval_desc]
GO

IF OBJECT_ID('fn_Time2Str', 'FN') IS NOT NULL
DROP FUNCTION [fn_Time2Str]
GO

IF OBJECT_ID('fn_Date2Str', 'FN') IS NOT NULL
DROP FUNCTION [fn_Date2Str]
GO

;
-- ############################################## TEMP FUNCTIONS ######################################
CREATE  FUNCTION fn_freq_interval_desc(@freq_interval INT)  
RETURNS VARCHAR(1000)  
AS  
BEGIN  
   DECLARE @result VARCHAR(1000)  

   SET @result = ''
	   
   IF (@freq_interval & 1 = 1)  
      SET @result = 'Sunday, '  
   IF (@freq_interval & 2 = 2)  
      SET @result = @result + 'Monday, '  
   IF (@freq_interval & 4 = 4)  
      SET @result = @result + 'Tuesday, '  
   IF (@freq_interval & 8 = 8)  
      SET @result = @result + 'Wednesday, '  
   IF (@freq_interval & 16 = 16)  
      SET @result = @result + 'Thursday, '  
   IF (@freq_interval & 32 = 32)  
      SET @result = @result + 'Friday, '  
   IF (@freq_interval & 64 = 64)  
      SET @result = @result + 'Saturday, '  

   RETURN(LEFT(@result,LEN(@result)-1))  
END   

GO

CREATE FUNCTION fn_Time2Str(@time INT)
RETURNS VARCHAR(10)
AS
BEGIN
   DECLARE @strtime CHAR(6)
   SET @strtime = RIGHT('000000' + CONVERT(VARCHAR,@time),6)

   RETURN LEFT(@strtime,2) + ':' + SUBSTRING(@strtime,3,2) + ':' + RIGHT(@strtime,2)
END

GO	

CREATE FUNCTION fn_Date2Str(@date INT)
RETURNS VARCHAR(10)
AS
BEGIN
   DECLARE @strdate CHAR(8)
   SET @strdate = LEFT(CONVERT(VARCHAR,@date) + '00000000', 8)

   RETURN RIGHT(@strdate,2) + '/' + SUBSTRING(@strdate,5,2) + '/' + LEFT(@strdate,4) 
END

GO

-- ############################################## END OF TEMP FUNCTIONS ######################################


/*
Usage : Change the value of variable @Filter
          'Y' --> display only enabled job
          'N' --> display only disabled job
          'A' --> display all job
          'X' --> display job which is duration already end
*/
;
DECLARE @Filter CHAR(1)
SET @Filter = 'A'

DECLARE @sql VARCHAR(8000)
DECLARE @is_sysadmin INT
DECLARE @job_owner   SYSNAME

-- #################

IF OBJECT_ID('tempdb..#xp_results') IS NOT NULL
BEGIN
    DROP TABLE #xp_results
END


CREATE TABLE #xp_results (
     job_id                UNIQUEIDENTIFIER NOT NULL,
     last_run_date         INT              NOT NULL,
     last_run_time         INT              NOT NULL,
     next_run_date         INT              NOT NULL,
     next_run_time         INT              NOT NULL,
     next_run_schedule_id  INT              NOT NULL,
     requested_to_run      INT              NOT NULL, 
     request_source        INT              NOT NULL,
     request_source_id     sysname          COLLATE database_default NULL,
     running               INT              NOT NULL, 
     current_step          INT              NOT NULL,
     current_retry_attempt INT              NOT NULL,
     job_state             INT              NOT NULL)



SELECT @is_sysadmin = ISNULL(IS_SRVROLEMEMBER(N'sysadmin'), 0)
SELECT @job_owner = SUSER_SNAME()

INSERT INTO #xp_results
    EXECUTE master.dbo.xp_sqlagent_enum_jobs @is_sysadmin, @job_owner
	
SET @sql = '
SELECT 
  j.Name AS JobName, 
  jst.command, 
  jst.step_id, 
  CASE j.enabled WHEN 1 THEN ''Yes'' else ''No'' END as Enabled,
  CASE s.enabled WHEN 1 THEN ''Yes'' else ''No'' END as Scheduled, 
  j.Description, 
  CASE s.freq_type 
     WHEN  1 THEN ''Once''
     WHEN  4 THEN ''Daily''
     WHEN  8 THEN ''Weekly''
     WHEN 16 THEN ''Monthly''
     WHEN 32 THEN ''Monthly relative''
     WHEN 64 THEN ''When SQL Server Agent starts'' 
     WHEN 128 THEN ''Start whenever the CPU(s) become idle'' END as Occurs, 
     CASE s.freq_type 
     WHEN  1 THEN ''O''
     WHEN  4 THEN ''Every '' 
        + convert(varchar,s.freq_interval) 
        + '' day(s)''
     WHEN  8 THEN ''Every '' 
        + convert(varchar,s.freq_recurrence_factor) 
        + '' weeks(s) on '' 
        + dbo.fn_freq_interval_desc(s.freq_interval)					  
     WHEN 16 THEN ''Day '' + convert(varchar,s.freq_interval) 
        + '' of every '' 
        + convert(varchar,s.freq_recurrence_factor) 
        + '' month(s)'' 
     WHEN 32 THEN ''The '' 
        + CASE s.freq_relative_interval	
            WHEN  1 THEN ''First''
            WHEN  2 THEN ''Second''
            WHEN  4 THEN ''Third''	
            WHEN  8 THEN ''Fourth''
            WHEN 16 THEN ''Last'' END 
        + CASE s.freq_interval 
            WHEN  1 THEN '' Sunday''
            WHEN  2 THEN '' Monday''
            WHEN  3 THEN '' Tuesday''
            WHEN  4 THEN '' Wednesday''
            WHEN  5 THEN '' Thursday''
            WHEN  6 THEN '' Friday''
            WHEN  7 THEN '' Saturday''
            WHEN  8 THEN '' Day''
            WHEN  9 THEN '' Weekday''
            WHEN 10 THEN '' Weekend Day'' END 
        + '' of every '' 
        + convert(varchar,s.freq_recurrence_factor) 
        + '' month(s)'' END AS Occurs_detail	
, CASE s.freq_subday_type 
     WHEN 1 THEN ''Occurs once at '' 
        + dbo.fn_Time2Str(s.active_start_time) 
     WHEN 2 THEN ''Occurs every '' 
        + convert(varchar,s.freq_subday_interval) 
        + '' Seconds(s) Starting at '' 
        + dbo.fn_Time2Str(s.active_start_time) 
        + '' ending at '' 
        + dbo.fn_Time2Str(s.active_end_time) 
     WHEN 4 THEN ''Occurs every '' 
        + convert(varchar,s.freq_subday_interval) 
        + '' Minute(s) Starting at '' 
        + dbo.fn_Time2Str(s.active_start_time) 
        + '' ending at '' 
        + dbo.fn_Time2Str(s.active_end_time) 
     WHEN 8 THEN ''Occurs every '' 
        + convert(varchar,s.freq_subday_interval) 
        + '' Hour(s) Starting at '' 
        + dbo.fn_Time2Str(s.active_start_time) 
        + '' ending at '' 
        + dbo.fn_Time2Str(s.active_end_time) END AS Frequency
, CASE WHEN s.freq_type =  1 THEN ''On date: '' 
          + dbo.fn_Date2Str(s.active_start_date) 
          + '' At time: '' 
          + dbo.fn_Time2Str(s.active_start_time)
       WHEN s.freq_type < 64 THEN ''Start date: '' 
          + dbo.fn_Date2Str(s.active_start_date) 
          + '' end date: '' 
          + dbo.fn_Date2Str(s.active_end_date) END as Duration
, dbo.fn_Date2Str(xp.next_run_date) + '' '' 
    + dbo.fn_Time2Str(xp.next_run_time) AS Next_Run_Date
FROM  msdb.dbo.sysjobs j (NOLOCK)
INNER JOIN msdb.dbo.sysjobschedules js (NOLOCK) ON j.job_id = js.job_id
INNER JOIN msdb.dbo.sysjobsteps jst (NOLOCK) ON j.job_id = jst.Job_id
INNER JOIN msdb.dbo.sysschedules s (NOLOCK) ON js.schedule_id = s.schedule_id
INNER JOIN msdb.dbo.syscategories c (NOLOCK) ON j.category_id = c.category_id
INNER JOIN #xp_results xp (NOLOCK) ON j.job_id = xp.job_id
WHERE 1 = 1 

-- ########################
--AND j.Name LIKE ''%mate%''
-- ########################


@Filter
ORDER BY j.name'

IF @Filter = 'Y'
   SET @sql = REPLACE(@sql,'@Filter',' AND j.enabled = 1 ')
ELSE
IF @Filter = 'N'
   SET @sql = REPLACE(@sql,'@Filter',' AND j.enabled = 0 ')
ELSE
IF @Filter = 'X'
   SET @sql = REPLACE(@sql,'@Filter', 
                            'AND s.active_end_date < convert(varchar(8),GetDate(),112) ')
ELSE
   SET @sql = REPLACE(@sql,'@Filter','')

EXEC(@sql)

-- ##################################################################

IF OBJECT_ID('fn_freq_interval_desc', 'FN') IS NOT NULL
DROP FUNCTION [fn_freq_interval_desc]
GO

IF OBJECT_ID('fn_Time2Str', 'FN') IS NOT NULL
DROP FUNCTION [fn_Time2Str]
GO

IF OBJECT_ID('fn_Date2Str', 'FN') IS NOT NULL
DROP FUNCTION [fn_Date2Str]
GO

Модератор: В следующий раз вашу портянку без споилера я просто сотру. Уважайте других участников.


Сообщение было отредактировано: 19 ноя 19, 17:21
19 ноя 19, 17:13    [22019876]     Ответить | Цитировать Сообщить модератору
 Re: инструмент для анализа работы джобов.  [new]
komrad
Member

Откуда: Msk -> Utrecht
Сообщений: 5233
denis_viktorovich
просмотреть потенциальные пересечения. Понятное дело можно копать историю, но если есть какаято утилита, то было бы проще.


на вскидку:

- Генерация html файла с визуализацией волнения джобов (нужен доступ к Инету)
https://www.sqlservercentral.com/articles/visualize-the-timeline-of-your-sql-jobs-using-google-graph-and-email

- Генерация html файла с визуализацией волнения джобов
https://dbatools.io/timeline/

- SSMS отчет, позволяет листать дни и видеть все выполненные джобы и их пересечения с гранулярностью до минуты; сохранить как .rdl и выполнять в контексте базы msdb (Custom report)
https://github.com/ASamykin/PerformanceReports/blob/master/Report Project1/SQLJobs_Timeline.rdl
19 ноя 19, 17:41    [22019915]     Ответить | Цитировать Сообщить модератору
 Re: инструмент для анализа работы джобов.  [new]
denis_viktorovich
Member

Откуда: Екб
Сообщений: 1206
Спасибо, буду пробовать.
20 ноя 19, 06:58    [22020219]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить