微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何确保在并行处理期间首先启动一个 SSIS 任务?

如何解决如何确保在并行处理期间首先启动一个 SSIS 任务?

我有一个 SSIS 主程序包,可以启动多个从属任务。有很多程序包都可以并行运行,而且在大多数情况下,运行哪些程序包并不重要。有 N 个工作线程可用,并且要运行大约 Nx3 个包,因此 SSIS 将一次启动 N 个。

不过,其中一个的运行时间比其他的要长得多。

enter image description here

所以我总是希望该程序包成为第一个启动的程序包之一,而不是等待可用线程运行的程序包。

我可以将它分解到它自己的并行序列容器中,并且似乎可以工作,但我不知道它会总是工作。

有没有办法确定运行时间最长的作业将始终占用第一个可用线程?

解决方法

事实上,据我所知,没有一种方法可以为它应该首先选择哪个线程提供权重。

但是,您可以肯定地更改设计以使其如此。在您的序列容器中,其中的 N 个任务中的任何一个都可以开始点头。但是,如果您将一个序列容器放入现有容器中并将低级任务移入其中,它们将全部并行运行,因此您只需要确保长时间运行的任务在并行化容器触发之前有足够的时间启动离开。因此,向内部容器添加一个 Script Task 前驱体,使其休眠 3、5、8 秒,无论您认为可能有足够的延迟,以便为长任务提供足够的启动时间。

int delayInSeconds = 3;
int delayInMillSeconds = delayInSeconds*1000;
System.Threading.Thread.Sleep(delayInMillSeconds);

显然,将延迟设为 SSIS 变量,这样您就可以在不更改脚本的情况下调整延迟。

假设这是维度加载,我有一个表来驱动这种行为,但有点不同。我的序列容器看起来像

Execute SQL Task (Get outstanding tasks)
Foreach Recordset (Take a task)
    Execute Package Task (do work,final step records task is complete)

我有 N 个并行处理序列容器。如果我将某件事标记为一项大工作,它将成为未完成任务列表中唯一的事情

PackageName|ContainerName|Task Name|Priority
P1         |C0           |Long job | 1
P1         |C1           |Long job2| 1
P1         |C2           |Lil job1 | 10
P1         |C2           |Lil job2 | 20
P1         |C2           |Lil job3 | 30

按顺序运行较小的作业允许我为服务器留出一些喘息的空间,但在长时间运行的线程完成之前,这堆作业仍将完成很久。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。