6

根据附件,我们在覆盖约 200 万行的数据转换中设置了平衡数据分配器。脚本任务是相同的——每个都打开到 oracle 的连接并首先执行删除然后执行插入。(这不相关,但由于 Ole DB 命令和 Oracle 的 Microsoft Ole DB 提供程序的参数问题,它是这样做的......)

在此处输入图像描述

我遇到的问题是,无论我的缓冲区有多大或我配置了多少并发执行,BDD 一次执行的并发进程都不会超过五个。

我在一个更大的缓冲区中拉回了数十万行,它只是被分成了 5 种方式。我已经在多台机器上试过这个——当前的镜头来自一个 16 核服务器,在包上配置了 -1 个并发执行——无论如何,它总是 5 个并行作业。

5 比 1 好,但有 250 万行要插入/更新,5 次并发执行时每秒 15 行并不比 1 并发执行时每秒 2-3 行好多少。

我可以强制 BDD 使用更多路径吗?如果可以,怎么做?

4

3 回答 3

5

简短的回答:

是的,BDD 可以使用五个以上的路径。你不应该做任何特别的事情来强迫它,根据定义它应该自动为你做。那为什么不使用超过 5 条路径呢?因为您的源生成数据的速度快于目标消耗的数据,从而导致背压。要解决它,您必须调整目标组件。

长答案:

从理论上讲,“BDD 获取输入数据并按照与输出相同的比例将其路由,无论有多少。” 在您的设置中,有 10 个输出。因此,输入数据应该同时平均分配到所有 10 个输出,并且您应该看到 10 个路径同时执行 - 理论上也是如此。

但是 BDD 的另一个概念是“BDD 对数据缓冲区进行操作,而不是路由单个行”。这意味着数据流引擎启动一个缓冲区,用尽可能多的行填充它,然后将该缓冲区移动到下一个组件(在您的情况下为脚本目标)。如您所见,使用了 5 个缓冲区,每个缓冲区具有相同的行数。如果启动了额外的缓冲区,您会看到更多的路径被使用。由于一种称为背压的机制,SSIS 不能使用额外的缓冲区和最终的额外路径;当源产生数据的速度快于目标消耗数据的速度时,就会发生这种情况。如果发生这种情况,所有内存都将被源数据用完,并且 SSIS 将没有任何内存可用于转换和目标组件。所以为了避免这种情况,SSIS 限制了活动缓冲区的数量。

PS:引号内的文字来自这篇文章

于 2013-10-21T04:19:02.927 回答
2

SSIS 数据流任务中有一个名为 EngineThreads 的属性,它确定可以同时运行多少个流,其默认值为 5(在 SSIS 2012 中,其默认值为 10,所以我假设您使用的是 SSIS 2008 或更早版本.) 最佳值取决于您的环境,因此可能需要进行一些测试来确定放在那里的内容。

这是Jamie Thomson更详细的文章。

于 2013-10-16T15:48:24.100 回答
1

我通过CodeProject 上的这篇文章发现了另一件有趣的事情。

[T] 他的组件使用 9,947 行的内部缓冲区(根据实验,我发现是这样)并且它是预先设置的。没有办法覆盖它。作为证明,我们将在输入文件中仅使用 9,947(90947)行而不是 10 行,并将观察行为。运行包后,我们会发现所有的行都被传输到第一个输出组件,而其他组件什么也没收到。

现在让我们将输入文件中的行数从 9,947 增加到 9,948(9948)。运行包后,我们发现第一个输出组件接收到 9,947 行,而第二个输出组件接收到 1 行。

所以我注意到在您的第一次缓冲运行中,您提取了 50,000 条记录。这些被分成 9,984 个记录桶并传递到每个输出。所以本质上,BDD 会从缓冲区获取记录,并以大约 10,000 个记录增量将它们传递到每个输出。因此,在这种情况下,您的来源可能是瓶颈。

也许您需要将原始 Source 查询分成两半,并创建两个 BDD 驱动的数据流,以从本质上使您的并行吞吐量翻倍。

于 2013-10-16T16:24:03.110 回答