【问题标题】:Importing a large data file with sorts and joins in SSIS在 SSIS 中导入带有排序和连接的大型数据文件
【发布时间】:2012-01-24 18:28:19
【问题描述】:

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

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

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

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

【问题讨论】:

  • SSIS 中的排序和连接效率非常低,您有没有机会消除它们?如果文件中的数据支持拆分成更小的物理文件,那也没什么坏处。 Unix 有一个方便的split 程序。最坏的情况是你可以编写自己的版本,尽管你会为读取和写入 15GB 数据付出磁盘代价。
  • 您可以发布数据流的屏幕截图吗?
  • @billinkc:目前,我们在 DTS 中运行相同的操作,将 15GB 文件整体导入临时表,然后以 50,000 行增量插入到最终表中,同时加入相应的数据表。目前,这个 DTS 包需要 24-36 小时才能完成。我是 SSIS 的新手,但我希望使用这个新软件包可以提高 25% 以上的效率。这是数据流的截图:i.imgur.com/nVjgP.png
  • 每个排序操作都会使您的数据流执行从存储桶 1 到存储桶 2 的数据的物理内存复制。我数了其中的 10 个。对于来自数据库/查询的 5 个(运营商、连接运营商),您可以通过连接条件向它们添加显式 ORDER BY,将其标记为按相同键在数据流中排序,然后它应该挂接到合并连接。
  • 虽然大图,数据库查询是否都在同一台服务器上?哪些数据量正在沿着这些小路下降?查找转换不够用有什么原因吗?

标签: ssis


【解决方案1】:

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

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

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

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

关于查找的最后一件事,由于您一直在使用合并连接,您已经成功了,它是区分大小写的。

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

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

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

查找参考资料

合并加入路由

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 2017-11-14
    • 1970-01-01
    • 2012-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多