0

我正在尝试从 SSIS 中的 SQL Server 2008 加载大型数据集。但是,Visual Studio 一次加载所有内容太慢了。然后我决定使用 for-each 循环每次只加载表的一部分。

例如,如果有 1000 万条记录,我希望每次只加载 100 万条并运行 10 次以完成处理。

这只是我的“大脑设计”,我不知道如何使用 Foreach 循环组件来制作它。有没有其他方法来处理大型数据集?

4

2 回答 2

1

要涵盖的变量太多了,我将在 5 分钟内开会。

你说它很慢。什么是慢?在不知道这一点的情况下,您可能会永远追逐错误的兔子。

SSIS 在 2008 年凭借在 30 分钟内加载 1TB 的 ETL 处理速度夺得桂冠。当然,他们从系统中调整了每一个有爱心的bejesus来让它这样做,但他们详细列出了他们采取的步骤。

1000 万行,虽然听起来很大,但我不会考虑对 SSIS 征税。首先,查看您的目标对象(假设为 OLEDB)。如果它没有选中 Fast Load 选项,您将发出 10M 单插入语句。这将淹没您的事务日志。还要查看提交大小中的行数。0 表示全有或全无,根据您的可恢复性可能是也可能不是正确的决定,但确实意识到对您的事务日志的影响(它会占用相当多的空间)。

您对管道中的数据应用了哪些转换?有些转换会扼杀您的吞吐量(排序、聚合等)

创建一个基线包,它所做的只是从源位置读取 N 行数据并执行行计数。这对于理解给定硬件的最佳理论吞吐量至关重要。

在 Visual Studio/BIDS/SSDT 中运行包的速度较慢,有时比通过 SQL 代理/dtexec 调用所获得的体验要慢一个数量级,因为它不会将执行包装在调试器中。

我有时间会修改这个答案,但这些是一些初步的想法。会议结束后,我将发布关于使用 foreach 循环任务处理离散数据块的文章。

于 2012-05-16T15:33:08.150 回答
0

我认为最好的方法是对数据进行功能分区。在大多数情况下,日期列适合执行此操作。让我们以订单日期为例。

对于该列,找到最佳分母,例如,您的订单日期的每一年都会产生大约一百万行。

代替 for each 循环容器,使用for 循环容器

要使此循环正常工作,您必须在源数据中找到所有订单日期的最小和最大年份。这些可以通过将标量结果保存到 SSIS 变量中的 SQL 语句来检索。

接下来,将您的 for 循环容器设置为在您之前存储在变量中的最小和最大年份之间循环,每次迭代增加一年。

最后,要实际检索数据,您必须将源 SQL 语句保存为变量中的表达式,其中包含指定 for 循环容器生成的当前年份的 where 子句:

"SELECT * FROM transactions WHERE YEAR(OrderDate) = " + @[User::ForLoopCurrentYear]

现在,您可以在数据流源中使用此变量来检索分区数据。

编辑:

使用 for each 循环容器的不同解决方案是使用 Execute SQL Task 检索分区键并将结果集保存在类型为 SSIS 的变量中Object

SELECT YEAR(OrderDate) FROM transaction GROUP BY YEAR(OrderDate)

使用 for each 循环容器,您可以使用 ADO 枚举器遍历对象,并使用与上述相同的方法将当前年份注入源 SQL 语句。

于 2012-05-16T15:37:28.780 回答