查询以在SQL Server中查找长时间运行的作业

时间:2014-06-24 06:11:01

标签: sql sql-server sql-server-2008

select
j.name as 'JobName',
run_date,
run_time,
msdb.dbo.agent_datetime(run_date, run_time) as 'RunDateTime',
h.run_duration,
((run_duration/10000*3600 + (run_duration/100)%100*60 + run_duration%100 + 31 ) / 60) 
      as 'RunDurationMinutes'
From msdb.dbo.sysjobs j 
INNER JOIN msdb.dbo.sysjobhistory h 
ON j.job_id = h.job_id 
where j.enabled = 1  
AND 
((run_duration/10000*3600 + (run_duration/100)%100*60 + run_duration%100 + 31 ) / 60) > 1 

上述SQL查询将获取需要超过一分钟的所有作业的列表。 但它给出了一个巨大的列表,我不想要这一切。 我只想要每一份工作的最后两次运行。 我尝试使用前2并按desc排序,但它没有列出列表中的所有作业。 我只想要每一份工作的最后两次运行。

有任何建议。?

2 个答案:

答案 0 :(得分:1)

查看ROW_NUMER()测距功能:

select * from (

select
j.name as 'JobName',
run_date,
run_time,
msdb.dbo.agent_datetime(run_date, run_time) as 'RunDateTime',
h.run_duration,
((run_duration/10000*3600 + (run_duration/100)%100*60 + run_duration%100 + 31 ) / 60) 
      as 'RunDurationMinutes',
      ROW_NUMBER() OVER(PARTITION BY j.name ORDER BY msdb.dbo.agent_datetime(run_date, run_time) DESC) NROW
From msdb.dbo.sysjobs j 
INNER JOIN msdb.dbo.sysjobhistory h 
ON j.job_id = h.job_id 
where j.enabled = 1  
AND 
((run_duration/10000*3600 + (run_duration/100)%100*60 + run_duration%100 + 31 ) / 60) > 1

) t where nrow < 3

为了说清楚我做了:

  • 在查询中添加新列:

    ROW_NUMBER()OVER(由j.name ORDER BY分区为msdb.dbo.agent_datetime(run_date,run_time)DESC)NROW

此列组由j.name字段的所有记录和每个组的编号按&#39; RunDateTime&#39;字段。

  • 现在我们需要获取NROW == 1或NROW == 2的所有记录。我创建了子查询(不确定它是最佳解决方案)和WHERE条件

    select * from(...)t where nrow&lt; 3

答案 1 :(得分:0)

试试这个

SELECT
r.session_id,   r.start_time,
TotalElapsedTime_ms = r.total_elapsed_time
,   r.[status]
,   r.command
,   DatabaseName = DB_Name(r.database_id)
,   r.wait_type
,   r.last_wait_type
,   r.wait_resource
,   r.cpu_time
,   r.reads
,   r.writes
,   r.logical_reads
,   t.[text] AS [executing batch]
,   SUBSTRING(
                t.[text], r.statement_start_offset / 2, 
                (   CASE WHEN r.statement_end_offset = -1 THEN DATALENGTH (t.[text]) 
                         ELSE r.statement_end_offset 
                    END - r.statement_start_offset ) / 2 
             ) AS [executing statement] 
,   p.query_plan
FROM
    sys.dm_exec_requests r
CROSS APPLY
    sys.dm_exec_sql_text(r.sql_handle) AS t
CROSS APPLY 
    sys.dm_exec_query_plan(r.plan_handle) AS p
ORDER BY 
    r.total_elapsed_time DESC;