2010-09-03 49 views
0

简短的版本是我正在寻找一种方法来优先考虑SSIS 2005控制流中的某些任务。也就是说,我希望能够进行设置,以便在任务A启动之前任务B不启动,但任务B不需要等待任务A完成。目标是减少空闲线程等待任务A完成的时间,以便他们可以移动到任务C,D & E.SSIS 2005控制流优先

我正在处理的问题是将数据仓库从调用一堆SP的线性作业加载到调用相同SP的SSIS包,但并行运行多个线程。所以基本上我有一堆执行SQL任务和序列容器对象与先决条件映射出的依赖关系。到目前为止没有问题,事情运作良好,它减少了我们的加载时间一堆。

但是我注意到没有下游依赖关系的任务通常在确实具有依赖关系的任务之前进行排序。这在某些地方会导致很多闲置时间,我希望尽量减少。

例如:我有大约60个过程涉及此负载,其中约10个根本没有依赖关系,并且可以随时运行。然后我有另一个没有上游依赖关系,但工作中几乎所有其他任务都依赖于它。我希望确保具有依赖关系的任务在我执行任何没有依赖关系的任务之前运行。这只是一个例子,其他地方也有类似的情况。

任何想法?

回答

0

我不知道任何优雅的方式来做到这一点,但我的第一个镜头是这样的..

序列容器与具有先运行PROC。在同一个序列容器中,在10个独立步骤中的每一个都可以运行之前,将一个脚本任务等待5-10秒左右。然后将该序列容器下方的其余特效链接起来。

1

我迟迟没有在这里更新,但我也在MSDN论坛上提出了这个问题,并且我们能够设计出部分解决方案。请参阅here为完整的线程,或here为功能请求要求微软给我们一个方法来干净地做到这一点...

简短的版本是,您使用一系列的布尔变量来控制作为像路障并阻止流量到达较低优先级的任务,直到较高优先级的项目开始。

涉及的步骤有:

  • 声明一个布尔变量的每一个高优先级的任务和默认值设置为false。
  • 为每个高优先级任务创建一个预执行事件。
  • 在预执行事件中,创建一个脚本任务,将适当的bool设置为true。
  • 在每个阻塞点为每个循环插入一个循环,当适当的布尔值为假时将循环。 (我有每个回路中1秒的睡眠脚本,但它也可以用空循环。)

如果正确完成这给你一个工具,其中在每一节流点的包装具有高优先级任务的一些数准备好运行,并阻止循环继续执行优先级较低的分支,直到高优先级项目运行。一旦所有高优先级任务都已启动,循环清除并允许任何剩余的线程转移到较低优先级的任务。最糟糕的情况是,一个线程在循环中等待其他线程前进并选择高优先级任务。

这种方法的一个主要缺点是,如果你有太多的阻塞环同时排队,或者误读你的依赖关系并且有循环等待从未开始的任务,那么会导致程序包死锁。需要仔细分析以确定哪些项目应该具有更高的优先级以及插入块的位置。