SQL SERVER 查询Job基本信息和执行情况

本文提供了一系列SQL查询语句,用于获取SQL Server中作业的基本信息、执行情况、步骤详情及执行状态等关键数据。
查询作业基本信息和作业执行情况
SELECT
    [jop].[job_id] AS '作业唯一标识符'
   ,[jop].[ name ] AS '作业名称'
   ,[dp].[ name ] AS '作业创建者'
   ,[cat].[ name ] AS '作业类别'
   ,[jop].[description] AS '作业描述'
   , CASE [jop].[enabled]
        WHEN 1 THEN '是'
        WHEN 0 THEN '否'
      END AS '是否启用'
   ,[jop].[date_created] AS '作业创建日期'
   ,[jop].[date_modified] AS '作业最后修改日期'
   ,[sv].[ name ] AS '作业运行服务器名称'
   ,[step].[step_id] AS '作业起始步骤'
   ,[step].[step_name] AS '步骤名称'
   , CASE
        WHEN [sch].[schedule_uid] IS NULL THEN '否'
          ELSE '是'
      END AS '是否分布式作业'
   ,[sch].[schedule_uid] AS '作业计划的唯一标识符'
   ,[sch].[ name ] AS '作业计划的用户定义名称'
   , CASE [jop].[delete_level]
        WHEN 0 THEN '不删除'
        WHEN 1 THEN '成功后删除'
        WHEN 2 THEN '失败后删除'
        WHEN 3 THEN '完成后删除'
      END AS '作业完成删除选项'
FROM [msdb].[dbo].[sysjobs] AS [jop]
LEFT JOIN [msdb].[sys].[servers] AS [sv]
         ON [jop].[originating_server_id] = [sv].[server_id]
LEFT JOIN [msdb].[dbo].[syscategories] AS [cat]
         ON [jop].[category_id] = [cat].[category_id]
LEFT JOIN [msdb].[dbo].[sysjobsteps] AS [step]
         ON [jop].[job_id] = [step].[job_id]
            AND [jop].[start_step_id] = [step].[step_id]
LEFT JOIN [msdb].[sys].[database_principals] AS [dp]
         ON [jop].[owner_sid] = [dp].[sid]
LEFT JOIN [msdb].[dbo].[sysjobschedules] AS [jsch]
         ON [jop].[job_id] = [jsch].[job_id]
LEFT JOIN [msdb].[dbo].[sysschedules] AS [sch]
         ON [jsch].[schedule_id] = [sch].[schedule_id]
ORDER BY [jop].[ name ]

作业最后执行情况
SELECT
    [job].[job_id] AS '作业唯一标示符'
   ,[job].[ name ] AS '作业名称'
   , CASE WHEN [jobh].[run_date] IS NULL
               OR [jobh].[run_time] IS NULL THEN NULL
          ELSE CAST ( CAST ([jobh].[run_date] AS CHAR ( 8 )) + ' '
               + STUFF(STUFF( RIGHT ( '000000'
                                   + CAST ([jobh].[run_time] AS VARCHAR ( 6 )), 6 ),
                             3 , 0 , ':' ), 6 , 0 , ':' ) AS DATETIME)
     END AS '最后执行时间'
   , CASE [jobh].[run_status]
      WHEN 0 THEN '失败'
      WHEN 1 THEN '成功'
      WHEN 2 THEN '重试'
      WHEN 3 THEN '取消'
      WHEN 4 THEN '正在运行'
     END AS '最后执行状态'
   ,STUFF(STUFF( RIGHT ( '000000' + CAST ([jobh].[run_duration] AS VARCHAR ( 6 )), 6 ),
                 3 , 0 , ':' ), 6 , 0 , ':' ) AS '最后运行持续时间'
   ,[jobh].[message] AS '最后运行状态信息'
   , CASE [jsch].[NextRunDate]
      WHEN 0 THEN NULL
       ELSE CAST ( CAST ([jsch].[NextRunDate] AS CHAR ( 8 )) + ' '
            + STUFF(STUFF( RIGHT ( '000000'
                                + CAST ([jsch].[NextRunTime] AS VARCHAR ( 6 )),
                                6 ), 3 , 0 , ':' ), 6 , 0 , ':' ) AS DATETIME)
     END AS '下次运行时间'
FROM [msdb].[dbo].[sysjobs] AS [job]
LEFT JOIN (
             SELECT
                [job_id]
               , MIN ([next_run_date]) AS [NextRunDate]
               , MIN ([next_run_time]) AS [NextRunTime]
             FROM [msdb].[dbo].[sysjobschedules]
             GROUP BY [job_id]
          ) AS [jsch]
         ON [job].[job_id] = [jsch].[job_id]
LEFT JOIN (
             SELECT
                [job_id]
               ,[run_date]
               ,[run_time]
               ,[run_status]
               ,[run_duration]
               ,[message]
               ,ROW_NUMBER() OVER ( PARTITION BY [job_id] ORDER BY [run_date] DESC , [run_time] DESC ) AS RowNumber
             FROM [msdb].[dbo].[sysjobhistory]
             WHERE [step_id] = 0
          ) AS [jobh]
     ON [job].[job_id] = [jobh].[job_id]
        AND [jobh].[RowNumber] = 1
ORDER BY [job].[ name ]

查看每个作业步骤基本信息

SELECT
    [job].[job_id] AS '作业唯一标识符'
   ,[job].[name] AS '作业名称'
   ,[jstep].[step_uid] AS '步骤唯一标识符'
   ,[jstep].[step_id] AS '步骤编号'
   ,[jstep].[step_name] AS '步骤名称'
   ,CASE [jstep].[subsystem]
      WHEN 'ActiveScripting' THEN 'ActiveX Script'
      WHEN 'CmdExec' THEN 'Operating system (CmdExec)'
      WHEN 'PowerShell' THEN 'PowerShell'
      WHEN 'Distribution' THEN 'Replication Distributor'
      WHEN 'Merge' THEN 'Replication Merge'
      WHEN 'QueueReader' THEN 'Replication Queue Reader'
      WHEN 'Snapshot' THEN 'Replication Snapshot'
      WHEN 'LogReader' THEN 'Replication Transaction-Log Reader'
      WHEN 'ANALYSISCOMMAND' THEN 'SQL Server Analysis Services Command'
      WHEN 'ANALYSISQUERY' THEN 'SQL Server Analysis Services Query'
      WHEN 'SSIS' THEN 'SQL Server Integration Services Package'
      WHEN 'TSQL' THEN 'Transact-SQL script (T-SQL)'
      ELSE [jstep].[subsystem]
    END AS '作业步骤类型'
   ,CASE
        WHEN [px].[name] IS NULL THEN 'SQL SERVER代理服务账户'
        ELSE [px].[name]
    END AS '步骤运行账户'
   ,[jstep].[database_name] AS '执行数据库名'
   ,[jstep].[command] AS '执行命令'
   ,CASE [jstep].[on_success_action]
      WHEN 1 THEN '退出报表成功的作业'
      WHEN 2 THEN '退出报告失败的作业'
      WHEN 3 THEN '转到下一步'
      WHEN 4
      THEN '转到步骤: '
           + QUOTENAME(CAST([jstep].[on_success_step_id] AS VARCHAR(3))) + ' '
           + [sOSSTP].[step_name]
    END AS '执行成功后操作'
   ,[jstep].[retry_attempts] AS '失败时的重试次数'
   ,[jstep].[retry_interval] AS '重试间的等待时间(分钟)'
   ,CASE [jstep].[on_fail_action]
      WHEN 1 THEN '退出报告成功的作业'
      WHEN 2 THEN '退出报告失败的作业'
      WHEN 3 THEN '转到下一步'
      WHEN 4
      THEN '转到步骤: '
           + QUOTENAME(CAST([jstep].[on_fail_step_id] AS VARCHAR(3))) + ' '
           + [sOFSTP].[step_name]
    END AS '执行失败后操作'
FROM [msdb].[dbo].[sysjobsteps] AS [jstep]
INNER JOIN [msdb].[dbo].[sysjobs] AS [job]
        ON [jstep].[job_id] = [job].[job_id]
LEFT JOIN [msdb].[dbo].[sysjobsteps] AS [sOSSTP]
        ON [jstep].[job_id] = [sOSSTP].[job_id]
           AND [jstep].[on_success_step_id] = [sOSSTP].[step_id]
LEFT JOIN [msdb].[dbo].[sysjobsteps] AS [sOFSTP]
        ON [jstep].[job_id] = [sOFSTP].[job_id]
           AND [jstep].[on_fail_step_id] = [sOFSTP].[step_id]
LEFT JOIN [msdb].[dbo].[sysproxies] AS [px]--代理账户信息
        ON [jstep].[proxy_id] = [px].[proxy_id]
ORDER BY [job].[name], [jstep].[step_id]

查看每个作业步骤执行情况
SELECT
    [job].[job_id] AS '作业唯一标识符'
   ,[job].[name] AS '作业名称'
   ,[jstep].[step_uid] AS '作业步骤唯一标识符'
   ,[jstep].[step_id] AS '步骤编号'
   ,[jstep].[step_name] AS '步骤名称'
   ,CASE [jstep].[last_run_outcome]
      WHEN 0 THEN '失败'
      WHEN 1 THEN '成功'
      WHEN 2 THEN '重试'
      WHEN 3 THEN '取消'
      WHEN 5 THEN '未知'
    END AS '上次运行状态'
   ,STUFF(STUFF(RIGHT('000000'
                      + CAST([jstep].[last_run_duration] AS VARCHAR(6)), 6), 3,
                0, ':'), 6, 0, ':') AS [LastRunDuration (HH:MM:SS)]
   ,[jstep].[last_run_retries] AS '上次运行重复执行次数'
   ,CASE [jstep].[last_run_date]
      WHEN 0 THEN NULL
      ELSE CAST(CAST([jstep].[last_run_date] AS CHAR(8)) + ' '
           + STUFF(STUFF(RIGHT('000000'
                               + CAST([jstep].[last_run_time] AS VARCHAR(6)),
                               6), 3, 0, ':'), 6, 0, ':') AS DATETIME)
    END AS '上次运行时间'
FROM [msdb].[dbo].[sysjobsteps] AS [jstep]
INNER JOIN [msdb].[dbo].[sysjobs] AS [job]
        ON [jstep].[job_id] = [job].[job_id]
ORDER BY [job].[name], [jstep].[step_id]


### 查看 SQL Server 数据库中 Job 运行时的内存占用情况SQL Server 中,可以通过系统视图动态管理视图(DMV)来监控 Job 的内存使用情况。以下是具体的查询方法: #### 1. 查看当前运行的所有进程及其资源使用情况 通过查询 `sys.dm_exec_requests` `sys.dm_exec_sessions`,可以获取当前运行Job 或任务的 CPU、I/O 内存使用情况[^1]。 ```sql SELECT r.session_id, r.command, r.cpu_time, r.total_elapsed_time, r.memory_grant_used, t.text AS sql_text FROM sys.dm_exec_requests r CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) t ORDER BY r.cpu_time DESC, r.total_elapsed_time DESC; ``` - `memory_grant_used`:表示当前请求使用的内存授予量(以 KB 为单位)。 - `cpu_time` `total_elapsed_time`:分别表示 CPU 使用时间执行时间。 #### 2. 查看缓存中的 SQL 计划及其内存占用情况 通过查询 `sys.dm_exec_cached_plans`,可以找到缓存中的 SQL 执行计划及其内存占用情况[^1]。 ```sql SELECT TOP 100 usecounts, size_in_bytes, objtype, text FROM sys.dm_exec_cached_plans p CROSS APPLY sys.dm_exec_sql_text(p.plan_handle) ORDER BY usecounts DESC, size_in_bytes DESC; ``` - `usecounts`:表示该计划被重用的次数。 - `size_in_bytes`:表示该计划占用的内存大小。 #### 3. 查看特定 Job 的内存使用情况 如果需要查看某个特定 Job 的内存使用情况,可以通过 `msdb.dbo.sysjobs` `msdb.dbo.sysjobhistory` 表结合动态管理视图进行分析[^3]。 ```sql SELECT j.name AS job_name, h.step_name, h.sql_severity, h.message, r.session_id, r.cpu_time, r.memory_grant_used FROM msdb.dbo.sysjobs j JOIN msdb.dbo.sysjobhistory h ON j.job_id = h.job_id LEFT JOIN sys.dm_exec_requests r ON h.run_date = CONVERT(DATE, GETDATE()) WHERE j.name = 'YourJobName'; ``` - 替换 `'YourJobName'` 为实际的 Job 名称。 - 该查询将返回指定 Job 的历史记录以及其当前运行时的资源使用情况。 #### 4. 监控 SQL Server 的整体内存使用情况 为了全面了解 SQL Server 的内存使用情况,可以查询以下 DMV: - **sys.dm_os_memory_clerks**:显示 SQL Server 内部组件的内存分配情况[^2]。 ```sql SELECT type, SUM(single_page_allocations_kb + multi_page_allocations_kb) AS total_kb FROM sys.dm_os_memory_clerks GROUP BY type ORDER BY total_kb DESC; ``` - **sys.dm_os_performance_counters**:显示性能计数器,包括缓冲池命中率等指标[^2]。 ```sql SELECT counter_name, cntr_value FROM sys.dm_os_performance_counters WHERE counter_name LIKE '%Buffer cache hit ratio%'; ``` #### 5. 清理不必要的内存占用 如果发现某些 JobSQL 计划占用了过多内存,可以考虑清理缓存以释放内存。 ```sql -- 清理计划缓存 DBCC FREEPROCCACHE; -- 清理缓冲池 DBCC DROPCLEANBUFFERS; ``` > 注意:清理缓存可能会影响性能,请谨慎操作。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值