我有一个大型文件(15GB),我用SSIS导入,这通常不是问题,但我也在将数据插入表之前使用排序和合并连接。当文件在数据流中缓冲时出现问题,我收到此错误:
错误:系统报告73%的内存负载。有3478020096 物理内存的字节数,可用911761408字节。有 2147352576字节的虚拟内存,可用288587776字节。该 分页文件有6954242048字节,可用3025256448字节。
[Flights File [999]]错误:尝试向数据流任务缓冲区添加行失败>错误代码为0x8007000E。
有没有办法将文件拆分成3个或更多的小文件,或者是另一种更有效的方法来导入数据?
答案 0 :(得分:2)
我可能会考虑像这样重组你的包。我已将所有Merge Join Transformations
转换为Lookups
Lookup Transformation最有可能完成你对这些合并连接所做的事情(给定键10,你正在从表B中检索参考数据)。您没有指定2005或2008 / 2008R2,因此屏幕会在不同版本之间更改。最重要的是要注意未找到匹配时的行为。如果找不到匹配项,默认情况下会出错。在2005年...我甚至不记得2005年,但我相信它没有“将行重定向到无匹配输出”的选项。在2008年以上,您有4种选择如何处理未找到的匹配
第二个最重要的是要注意缓存。默认情况下,缓存模式设置为完全缓存。这意味着当包启动时,SSIS将执行查询并创建所有数据的本地缓存。在SSIS中的任何地方,您只想拉回完成任务所需的列,但最重要的是查找。有一个同事一直在运行服务器内存,因为他们试图将50GB的数据(整个表)流入缓存时只需要2列。除了你的Stations and Metros,
完整缓存之外,所有人都可以。如果盒子有一些严重的内存,那么完全缓存对于那个也可能没问题。否则,您的选项是none或部分缓存。 None
将对源系统执行单个查询,以查找遇到转换的每个行。如果源系统正在快速变化,则非常有用。否则,将缓存选项切换为“部分”,然后计算分配给它的内存量。部分尝试两者兼顾。它会记住它搜索了值10并将其保存在缓存中,直到它最近使用的算法确定它已过期。
关于查找的最后一件事,既然你已经使用了合并连接,那么你已经点击了它,它是区分大小写的。
配置查找很简单。在这里我指定查找应该忽略失败。您将知道数据的适当行为。
在这里写一个查询,不要轻易选择一个表,除非确实需要该源中的每一列和每一行。即便如此,写一个SELECT * FROM myTable
因为它会表现得更好(选择一个表会产生一个openrowset查询,不需要额外的图层)
列数据类型必须匹配,您再次使用合并连接已经看到了这一点,但是对于未来的读者。如果您可以将查找数据转换为正确的类型,而不是在数据流中携带与查找类型匹配的第二列,则可以获得更好的吞吐量。
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)