SSIS 2005控制流程优先级

时间:2010-09-03 15:09:57

标签: sql-server-2005 ssis

简短版本是我正在寻找一种方法来确定SSIS 2005控制流中某些任务的优先级。这是我希望能够设置它,以便任务B在任务A启动之前不会启动,但任务B不需要等待任务A完成。我的目标是减少空闲线程等待任务A完成的时间,以便他们可以转到任务C,D&即

我正在处理的问题是将数据仓库负载从调用一堆SP的线性作业转换为调用相同SP但并行运行多个线程的SSIS包。所以基本上我有一堆Execute SQL Task和Sequence Container对象,Precedent Constraints映射出依赖关系。到目前为止没有问题,事情工作得很好,它减少了我们的加载时间。

但是我注意到没有下游依赖项的任务通常在具有依赖项的任务之前进行排序。这导致我想要最小化的某些位置的大量空闲时间。

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

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

我在这里更新时间较晚,但我也在MSDN论坛上提出了这个问题,我们能够设计出部分工作。请参阅here获取完整主题,或here获取功能请求,要求microsoft为我们提供干净利落的方法...

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

所涉及的步骤是:

  • 为每个高优先级任务声明一个bool变量,并将值默认为false。
  • 为每个高优先级任务创建一个预执行事件。
  • 在预执行事件中创建一个脚本任务,将适当的bool设置为true。
  • 在每个阻塞点插入一个循环,每个循环将循环,而相应的bool是假的。 (我有一个脚本,每个循环内部有1秒钟的睡眠,但它也适用于空循环。)

如果操作正确,这将为您提供一个工具,在每个阻塞点,程序包具有一些准备运行的高优先级任务和一个阻止循环,使其无法继续执行较低优先级分支,直到所述高优先级项目正在运行。一旦启动了所有高优先级任务,循环就会清除,并允许任何剩余的线程继续执行较低优先级的任务。最糟糕的情况是一个线程在循环中等待其他线程出现并获取高优先级任务。

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

答案 1 :(得分:0)

我不知道有什么优雅的方法可以做到这一点,但我的第一枪就是这样......

具有必须首先运行的p​​roc的Sequence Container。在同一个序列容器中放置一个脚本任务,在10个独立步骤中的每个步骤可以运行之前等待5-10秒左右。然后将其余的procs链接到该序列容器下面。