SSIS并行执行未运行序列容器

时间:2018-09-03 09:24:08

标签: ssis

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

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

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

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

好的,所以我找到了问题,尽管我以前的日志显示这是问题,但这不是SSIS问题。

基本上,检索下一个要执行的程序包的存储proc引起了问题。我正在更新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;

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

我目前的简单解决方案是在SQL开始-并行1之前添加“ WAITFOR DELAY“ 00:00:01””,这意味着在并行执行开始时,表上没有争用,结果并行执行。 非常令人沮丧!