如何使用每个循环来帮助加载大型数据集

时间:2012-05-16 14:38:43

标签: ssis large-data-volumes foreach-loop-container

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

SSIS在2008年为ETL processing speed by loading 1TB in 30 minutes夺冠。当然,他们将每一个爱好的bejesus调出系统来实现它,但是他们详细列出了他们采取的步骤。

1000万行,虽然听起来很大,但我不认为对SSIS征税。首先,查看目标对象(假设OLEDB)。如果未选中“快速加载”选项,则发出10M单个插入语句。这会破坏你的交易日志。另请查看提交大小中的行数。 0表示基于您的可恢复性可能会或可能不是正确决策的全部或全部,但确实意识到了对您的事务日志的影响(它将占用相当多的空间)。

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

创建基准包,它所做的就是从源位置读取N行数据并执行行计数。这对于理解硬件可以获得的最佳理论吞吐量至关重要。

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

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

答案 1 :(得分:0)

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

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

使用for loop container代替每个循环容器。

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

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

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

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

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

修改:

对每个循环容器使用a的另一个解决方案是使用执行SQL任务检索分区键,并将该结果集保存在Object类型的SSIS变量中:

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

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