【问题标题】:SSIS Parallel execute not running sequence containerSSIS并行执行不运行序列容器
【发布时间】:2021-06-21 15:05:41
【问题描述】:

我正在编写一个 SSIS 包以允许我们并行执行我们的 ssis 任务。我有一个控制系统来管理要执行的包。这些包被分组为可以同时执行的包(即不依赖于组中的任何其他包),并按这些分组排序。

我将所有包连同它们的组一起执行到我用作队列表的表中。然后,我将所有组放入一个对象中,并在 ForEach 循环中循环这些组。 在这个 FEL 中,我有 2 个序列容器。这些容器具有作用于它们的变量。我根据所需的组从队列表中获取下一个包。 Parallel Execute package

通常的行为是循环中执行的第一组运行良好,包在 SEQ0 和 SEQ1 上运行。
问题出现在下一组执行期间,其中只有一个序列容器执行,因此没有并行执行。它可以与 0 或 1 交替执行,但另一个不启动。我在“获取执行属性”存储过程中添加了一些日志记录,因为我想知道这是否在停止执行的一侧没有返回任何行,但是没有日志,所以它根本没有在该侧执行。

有人知道为什么只有一个序列容器会执行吗?

【问题讨论】:

  • 我做了一个看起来可行的更改,至少在我的测试中是这样。我在两个序列容器上将“DelayValidation”属性设置为 True。一旦我确定这可以解决问题,我会提供更新。
  • 只是为了鼓励你——我在 SSIS 2008 中做了一些非常相似的事情,效果非常好。
  • 嗯,延迟验证似乎在 VS 中运行良好,但在通过 SSIS 目录自动运行时没有任何区别。我还将第一个“SQL - 获取执行属性”更改为延迟验证,这有所帮助,但我也看到了一些没有并行化的分组。

标签: ssis


【解决方案1】:

将 SEQ-0 和 SEQ-1 放入另一个序列容器中。

【讨论】:

  • 我已经完成了序列容器,并尝试将前面的 SQL 步骤优先执行两个序列容器,但没有任何改进。
【解决方案2】:

好的,所以我发现了问题,这不是 SSIS 问题,尽管我之前的日志显示这是问题所在。

基本上,检索下一个要执行的包的存储过程导致了问题。我正在更新 CTE 以获得像这样的下一行:

with CTE AS (
SELECT 
    TOP(1) 
    SSISPackageKey
    , IsProcessed
FROM 
    QueueTable WITH (UPDLOCK, ROWLOCK, READPAST)
WHERE
    IsProcessed = 0
ORDER BY
    ExecuteOrder ASC)
UPDATE 
    CTE
SET
    IsProcessed = 1
OUTPUT
    inserted.SSISPackageKey INTO @SSISPackage;

当 2 个并行流同时执行时,这里似乎存在问题。大多数情况下,一个进程将获得一行并返回要执行的包,而另一个进程将跳过所有行并且不返回任何内容。我认为锁正在升级为页面锁,然后读取过去,这意味着线程没有工作要做。

我现在的简单解决方案是在 SQL - Parallel 1 开始之前添加一个“WAITFOR DELAY”00:00:01”,这意味着在并行执行开始时表上没有争用,导致良好的并行执行。 很郁闷!

【讨论】:

  • 我一直这样做的方式是先“保留”带有批处理 id 的队列(使用更新语句),然后只从保留的行中读取。我不相信任何手动锁定方案,因为它们可能会根据服务器的隔离级别而改变。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-07
  • 1970-01-01
  • 2013-07-01
  • 1970-01-01
相关资源
最近更新 更多