根据附件,我们在数据转换中设置了一个平衡数据分配器,覆盖约200万行。脚本任务是相同的 - 每个脚本都打开一个与oracle的连接,然后首先执行删除操作然后执行插入操作。 (这是不相关的,但是由于Ole DB命令和Oracle的Microsoft Ole DB提供程序的参数问题,它已经这样做了。)
我遇到的问题是无论我的缓冲区有多大或我配置了多少并发执行,BDD一次不会执行超过五个并发进程。
我已经在更大的缓冲区中撤回了数十万行,它只是分为5种方式。我在多台机器上尝试了这一点 - 当前镜头来自一个16核心服务器,在程序包上配置了-1个并发执行 - 无论如何,它始终是5个并行作业。
5优于1,但插入/更新有250万行,5次并发执行时每秒15行并不比每秒2-3行(1次并发执行)好很多。
我可以强制BDD使用更多路径,如果是这样,怎么办?
答案 0 :(得分:5)
简短回答:
是BDD可以使用五种以上的路径。你不应该做任何特别强迫它,根据定义它应该自动为你做。那为什么它不使用超过5个路径?因为您的源生成的数据比目标可以消耗的速度快,导致背压。要解决此问题,您需要调整目标组件。
答案很长:
从理论上讲,“BDD采用输入数据并将其与其输出的比例相等,无论多少都有。”在您的设置中,有10个输出。因此,输入数据应该同时平均分配给所有10个输出,你应该看到10个路径同时执行 - 理论上也是如此。
但BDD的另一个概念是“不是路由单个行,而是BDD对数据上的缓冲区进行操作。”这意味着数据流引擎启动一个缓冲区,用尽可能多的行填充它,并将该缓冲区移动到下一个组件(在您的情况下为脚本目标)。如您所见,每个缓冲区使用的行数相同。如果启动了其他缓冲区,您将看到更多路径被使用。由于称为背压的机制,SSIS无法使用额外的缓冲区和最终的额外路径;当源生成数据的速度快于目标可以使用数据时,就会发生这种情况。如果发生这种情况,源数据将耗尽所有内存,并且SSIS将没有任何内存用于转换和目标组件。因此,为了避免它,SSIS限制了活动缓冲区的数量。它被设置为5(无法更改),这正是您所看到的线程数。
PS:引号内的文字来自this article
答案 1 :(得分:2)
SSIS数据流任务中有一个名为EngineThreads的属性,它确定可以同时运行多少个流,其默认值为5(在SSIS 2012中,它的默认值为10,所以我假设你正在使用SSIS 2008年或更早。)最佳值取决于您的环境,因此可能需要进行一些测试以确定放在那里的内容。
这是Jamie Thomson article,其中包含更多细节。
答案 2 :(得分:1)
我通过this article on CodeProject发现了另一个有趣的事情。
[T]他的组件使用9,947行的内部缓冲区(按照 实验,我发现了)并且它是预设的。没有办法覆盖 这个。作为证明,我们将只使用9,947(九个 在我们的输入文件中的行和将观察的一千九百四十七行 行为。运行包后,我们会发现所有的 行被传输到第一个输出组件和另一个 组件什么也没收到。
现在让我们将输入文件中的行数从9,947增加到 9,948(九千九百四十八)。运行包后,我们 发现第一个输出组件收到了9,947行 第二个输出组件收到1行。
所以我在你的第一次缓冲运行中注意到你提取了50,000条记录。那些被分成9,984个记录桶并传递给每个输出。因此,基本上BDD从缓冲区获取记录,并以〜10,000记录增量将它们传递给每个输出。所以在这种情况下,你的来源可能就是瓶颈。
也许您需要将原始的Source查询分成两半并创建两个BDD驱动的数据流,实质上是您的并行吞吐量的两倍。