Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ssis 如何使用for each循环来帮助加载大型数据集_Ssis_Large Data Volumes_Foreach Loop Container - Fatal编程技术网

Ssis 如何使用for each循环来帮助加载大型数据集

Ssis 如何使用for each循环来帮助加载大型数据集,ssis,large-data-volumes,foreach-loop-container,Ssis,Large Data Volumes,Foreach Loop Container,我正在尝试从SSIS中的SQL Server 2008加载一个大型数据集。但是,对于VisualStudio来说,一次加载所有内容太慢了。然后我决定对每个循环使用,每次只加载表的一部分 例如,如果有1000万条记录,我希望每次只加载100万条,并运行10次以完成处理 这只是我的“大脑设计”,我不知道如何使用Foreach循环组件。有没有其他方法来处理大型数据集?要涵盖这么多变量,我5分钟后要开会 你说它慢。什么东西慢?不知道这一点,你可能永远在追逐错误的兔子 SSIS在2008年为该项目夺冠。当

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

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


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

要涵盖这么多变量,我5分钟后要开会

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

SSIS在2008年为该项目夺冠。当然,他们调整了系统中的每一个步骤,让它这样做,但他们详细列出了他们采取的步骤

<10m行,虽然听起来大,但我不认为对SSIS征税。首先,查看目标对象(假设为OLEDB)。如果没有选中“快速加载”选项,则会发出10M个单插入语句。这将淹没您的事务日志。还要查看提交大小中的行数。0表示“全部”或“无”,这可能是基于可恢复性的正确决策,也可能不是,但一定要意识到事务日志的含义(这将占用相当多的空间)

您正在对管道中的数据应用什么转换?有些转换会降低吞吐量(排序、聚合等)

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

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


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

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

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

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

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

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

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

"SELECT * FROM transactions WHERE YEAR(OrderDate) = " + @[User::ForLoopCurrentYear]
现在,您可以在数据流源中使用此变量来检索分区数据

编辑:

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

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

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

是否需要同时将整个数据集加载到内存中?或者你可以让它成批地通过数据流吗?如果批处理设置正确的话,SSIS在后一个方面非常好。请回答thx!每次我都需要将所选数据与其他一些表合并,这就是为什么我必须对每个循环使用。否则,处理过程将更加缓慢。