在SSIS中导入包含排序和连接的大型数据文件

时间:2012-01-24 18:28:19

标签: ssis

我有一个大型文件(15GB),我用SSIS导入,这通常不是问题,但我也在将数据插入表之前使用排序和合并连接。当文件在数据流中缓冲时出现问题,我收到此错误:

  

错误:系统报告73%的内存负载。有3478020096   物理内存的字节数,可用911761408字节。有   2147352576字节的虚拟内存,可用288587776字节。该   分页文件有6954242048字节,可用3025256448字节。

     

[Flights File [999]]错误:尝试向数据流任务缓冲区添加行失败>错误代码为0x8007000E。

有没有办法将文件拆分成3个或更多的小文件,或者是另一种更有效的方法来导入数据?

Screenshot of the data flow.

1 个答案:

答案 0 :(得分:2)

我可能会考虑像这样重组你的包。我已将所有Merge Join Transformations转换为Lookups

enter image description here

Lookup Transformation最有可能完成你对这些合并连接所做的事情(给定键10,你正在从表B中检索参考数据)。您没有指定2005或2008 / 2008R2,因此屏幕会在不同版本之间更改。最重要的是要注意未找到匹配时的行为。如果找不到匹配项,默认情况下会出错。在2005年...我甚至不记得2005年,但我相信它没有“将行重定向到无匹配输出”的选项。在2008年以上,您有4种选择如何处理未找到的匹配

  • 忽略失败 - 没有伤害,没有任何犯规行继续沿着管道继续下去,价值被淘汰
  • 将行重定向到错误输出 - 不匹配的数据会降低错误输出。不会导致数据流失败。
  • 失败组件 - 组件失败
  • 将行重定向到无匹配输出 - 与错误输出结果相同,但使用绿线连接器而不是红色。

第二个最重要的是要注意缓存。默认情况下,缓存模式设置为完全缓存。这意味着当包启动时,SSIS将执行查询并创建所有数据的本地缓存。在SSIS中的任何地方,您只想拉回完成任务所需的列,但最重要的是查找。有一个同事一直在运行服务器内存,因为他们试图将50GB的数据(整个表)流入缓存时只需要2列。除了你的Stations and Metros,完整缓存之外,所有人都可以。如果盒子有一些严重的内存,那么完全缓存对于那个也可能没问题。否则,您的选项是none或部分缓存。 None将对源系统执行单个查询,以查找遇到转换的每个行。如果源系统正在快速变化,则非常有用。否则,将缓存选项切换为“部分”,然后计算分配给它的内存量。部分尝试两者兼顾。它会记住它搜索了值10并将其保存在缓存中,直到它最近使用的算法确定它已过期。

关于查找的最后一件事,既然你已经使用了合并连接,那么你已经点击了它,它是区分大小写的。

配置查找很简单。在这里我指定查找应该忽略失败。您将知道数据的适当行为。

enter image description here

在这里写一个查询,不要轻易选择一个表,除非确实需要该源中的每一列和每一行。即便如此,写一个SELECT * FROM myTable因为它会表现得更好(选择一个表会产生一个openrowset查询,不需要额外的图层)

enter image description here

列数据类型必须匹配,您再次使用合并连接已经看到了这一点,但是对于未来的读者。如果您可以将查找数据转换为正确的类型,而不是在数据流中携带与查找类型匹配的第二列,则可以获得更好的吞吐量。

enter image description here

Lookups上的参考资料

合并加入路线

如果您坚持使用合并连接,您将再次希望通过SQL命令访问您的数据,并且只需拉回所需的列,并在适当的时候,在查询中转换为正确的数据类型。添加明确的ORDER BY MyKeyColumn如果您已完成此操作,则可以右键单击OLE DB源,选择高级编辑器,输入和输出属性。

OLE DB Source Output上,将IsSorted从False切换为True。

展开OLE DB Source Output,然后展开Output Columns查找MyKeyColumn并将SortKeyPosition从0更改为1(原始查询中提供的每种排序顺序增加1)