ssis - 在 SSIS 中导入带有排序和连接的大型数据文件

标签 ssis

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

Error: The system reports 73 percent memory load. There are 3478020096 bytes of physical memory with 911761408 bytes free. There are 2147352576 bytes of virtual memory with 288587776 bytes free. The paging file has 6954242048 bytes with 3025256448 bytes free.

[Flights File [999]] Error: The attempt to add a row to the Data Flow task buffer failed >with error code 0x8007000E.



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

Screenshot of the data flow.

最佳答案

我可能会考虑像这样重构你的包。我已经转换了所有这些 Merge Join TransformationsLookups
enter image description here

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

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

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

    关于查找的最后一件事,因为您一直在使用合并连接,所以您已经遇到了它,它是区分大小写的。

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

    enter image description here

    请在此处编写查询,不要采取简单的方法来选择表,除非您确实需要该源中的每一列和每一行。即便如此,写一个 SELECT * FROM myTable因为它会表现得更好(选择一个表会导致一个 openrowset 查询,不需要额外的层)

    enter image description here

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

    enter image description here

    查找引用资料
  • Lookup Cache Modes
  • Calculating the size of your lookup cache

  • 合并加入路由

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

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

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

    关于ssis - 在 SSIS 中导入带有排序和连接的大型数据文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8992041/

    相关文章:

    c# - 填充脚本组件中的输出列

    mysql - 如何使用 SSIS 将行从 MySQL 插入/更新到 SQL Server

    sql-server - 将数据从 Azure SQL 数据库 ETL 到 Azure SQL 数据仓库的推荐工具?

    excel - 在SSIS中从Excel导入数据,空值

    sql-server - 为什么事实表中的 datekey 总是 INT?

    sql - 如何在 SSIS 包中设置变量?

    sql - 使用 SQL 身份验证执行 SSIS 包

    sql - SSIS 导出到 CSV 文件失败

    visual-studio-2010 - SSIS 无法转换 COM 对象

    excel - SSIS 2017 循环遍历 Excel 文件并从脚本任务中获取文件名