【问题标题】:How can I measure the duration of a package execution?如何测量包执行的持续时间?
【发布时间】:2017-06-08 06:40:42
【问题描述】:

我有一个 SSIS 作业,我想从一个过程运行,然后使用作业开始和作业结束日期执行一个选择语句。

获取作业开始时间很容易 - 只需在调用作业之前保存当前时间即可。

我怎样才能得到结束时间?我可以使用@endTime = GETDATE() 吗?开始工作会等待它结束吗?

对于 SQL 过程中的调用,一般情况下是这样吗?

编辑: 正如人们所问的那样,我想使用此代码调用 SSIS 作业,我找到了 here

 declare @execution_id bigint
 exec ssisdb.catalog.create_execution 
 @folder_name = 'mssqltips'
 ,@project_name = 'exec-ssis-stored-proc-ssis-sample'
 ,@package_name = 'Sample.dtsx'
 ,@execution_id = @execution_id output
 exec ssisdb.catalog.start_execution @execution_id

【问题讨论】:

  • 所以这个问题与存储过程无关,它与工作有关。没有job run 存储过程,有一个工作start 过程sp_start_job。它开始工作,但不等待它完成
  • 也许他的意思是调用xp_cmdshell,里面有dtsx.exe?
  • 代理提供作业状态、运行历史和统计信息。没有理由使用GETDATE() 来查找工作需要多长时间。使用sp_job_history 或查询sysjobhistory
  • @Xyzk,你能准确地说你想如何“从程序运行”吗?
  • @PanagiotisKanavos 我明白你的意思,我会调查这些选项。话虽如此,我仍然很想知道我是否可以使用这个解决方案(即使它不是一个很好的解决方案)

标签: sql-server stored-procedures ssis


【解决方案1】:

SSIS 已经记录了包执行持续时间和事件,包括步骤持续时间。你不需要使用GETDATE()

您可以通过查询SSISDB数据库的catalog.executions视图来获取执行状态、开始时间和结束时间,例如:

select status, start_time, end_time,datediff(s,start_time,end_time) as duration
from catalog.executions
where execution_id = @execution_id

或者

select status, start_time, end_time, datediff(s,start_time,end_time) duration
from catalog.executions
where project_name = 'exec-ssis-stored-proc-ssis-sample'
      and  package_name = 'Sample.dtsx'
order by execution_id

历史数据

【讨论】:

  • 我觉得这个答案应该和我的答案结合起来。 OP 想要运行 SSIS 并从同一个 SP 获取执行详细信息。如果它是一个 sql 代理作业,那么 SP 应该有一些带有延迟的 while 循环,条件是在作业停止时完成。如果是包,那么看我的回答,OP只需要使用GETDATE()和同步包执行
  • @Anton GETDATE() 在实际持续时间已经可用时不需要。一般来说,当您可以访问历史执行数据时,您不再需要等待执行完成,您只需在需要时读取历史视图。如果 OP 想在执行后发送电子邮件,等待会很有用。
  • @PanagiotisKanavos 我没有提到这个问题,因为我想避免添加不必要的信息,但我确实想在 SSIS 完成后执行一些基本操作。
  • @PanagiotisKanavos,由于包已启动但尚未完成,因此运行时可能无法获得历史数据。因此,如果 SP 需要在 SSIS 执行后立即执行某些操作,则 SP 需要等待 SSIS 完成。等待机制取决于执行方法(我在答案中提到过)。打包完成后,GETDATE() 比从执行历史中获取统计信息更快更简单,但如果您需要精确的时间,执行历史会更好。
【解决方案2】:

这取决于您如何通过 SP 运行 SSIS。是 sql 代理作业还是包执行(目录)?

如果作为包运行,可以同步运行,也可以异步运行。

如果是异步模式,SP只是启动SSIS包,不等待。

如果它处于同步模式,它将等待。

模式取决于 SYNCHRONIZED 参数。该参数应在执行开始前设置,设置方法见下方链接。

https://docs.microsoft.com/en-us/sql/integration-services/system-stored-procedures/catalog-set-execution-parameter-value-ssisdb-database

如果您从 SP 运行 SQL 作业并且该作业执行 SSIS 包,则 SP 不会等待,它只会激活 SQL 代理作业。

【讨论】:

  • 我知道,但是 Xyzk 在示例中提到了 Package,而不是 job
  • OP 正在询问如何衡量执行的持续时间。无论包如何启动,都可以从执行历史中获得。
  • 实际上 OP 有多个问题,其中之一是“开始工作是否等待它结束?”然后是包执行示例。这真的令人困惑......我明白:)
猜你喜欢
  • 1970-01-01
  • 2013-09-03
  • 2016-04-05
  • 1970-01-01
  • 1970-01-01
  • 2019-04-24
  • 2020-03-07
  • 1970-01-01
  • 2020-10-24
相关资源
最近更新 更多