【问题标题】:SSIS skip dataflow task if it takes too much time如果需要太多时间,SSIS 会跳过数据流任务
【发布时间】:2017-03-10 00:59:47
【问题描述】:

我正在创建一个 ssis 包,它应该将数据从一个数据库传输到另一个数据库。但是,如果数据流任务需要太多时间来执行,我希望它停止并继续执行其他任务。

我已经尝试将CommandTimeout 属性设置为数据流源,但数据流任务并没有停止运行。

【问题讨论】:

  • 我们可能想出一个复杂的解决方案——将数据流放在一个包中,从脚本任务中调用包,在脚本任务中添加超时条件以终止进程。但是,您对优化加载过程持开放态度吗?
  • 好吧,如果没有其他解决方案,我想我将不得不和你一起去。顺便说一句,加载过程已经优化,它是源数据库设计不佳:具有数百万条记录的表根本没有索引。所以,由于它不是重要的数据,我决定如果花费太多时间,我会丢弃它继续前进
  • 你也可以调用一个bat文件来执行这个包。这可以在自己的进程中异步运行 - 所以只需启动它并让它在包的其余部分执行时运行。
  • 再次感谢,但真正的问题是:如果我设置了 commandtimeout 属性,为什么任务不会停止?在尝试您建议的这些解决方法之前,我想知道我的设置有什么问题..
  • 因为 commandtimeout 只控制包等待源命令返回结果的时间。它没有说明通过其余数据流处理这些结果需要多长时间。

标签: ssis


【解决方案1】:

如果我设置了 commandtimeout 属性,为什么任务不会停止?

我猜测 SSIS 每次写入源组件的缓冲区时都会调用 READ 方法。每次调用 read 方法都会重置命令超时。这里有一些相关信息:

https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.commandtimeout%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396

因此,源代码需要足够慢,以便在命令超时期间不返回任何行。这听起来不适用于您的方案。

建议的替代方案是:

  • 将数据流放入另一个包中
    • 从脚本任务调用包
    • 导致进程在脚本中设置的一段时间后超时
  • 或者,将数据流放在另一个包中
    • 从 bat 文件中调用包,让它在自己的进程中运行,直到完成为止。

我了解源系统没有正确的索引,这使得阅读过程缓慢。听起来好像有多个表,您可以考虑单独阅读它们并将它们暂存到目标服务器上。这可以避免可能由 JOIN 导致的错误查询计划。此外,请确保您正在写入的表不是瓶颈 - 删除索引、约束、添加表块。

【讨论】:

    猜你喜欢
    • 2019-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-28
    • 2018-11-28
    • 2018-03-07
    • 2023-03-10
    • 2019-01-28
    相关资源
    最近更新 更多