【问题标题】:SSIS Data Flow Task: Out-of-memory exceptionSSIS 数据流任务:内存不足异常
【发布时间】:2014-05-21 15:02:48
【问题描述】:

这是我的情况:我尽可能详细地提供了信息,但如果您需要更多信息,请告诉我。我已经在网上搜索了一个小时左右,但没有找到任何可以解决我的特定问题的帖子,所以任何帮助(甚至是链接)都将不胜感激。

我正在编写一个数据流任务来对我的数据源执行 SCD 操作(使用 Task Factory's SCD Component)。我正在通过极慢的连接从一个网络中的 Oracle 源加载到我的新服务器上的 SQL 源。

SCD 操作要求我从源和目标中提取数据,并比较两者。但是,这两个连接的相对速度给我带来了问题:SQL 源快了将近 10 倍,所以当旧服务器传输 1 时,数据流将从我的新服务器中提取 800 万条记录百万。

由于两个源汇集在一起​​并流经同一个 SCD 组件,当我达到 8m/1m 标记时,仍有 7m 行等待来自 SQL 源。据我了解,这 7m 行正在内存中等待通过 SCD 进行处理。

我收到 SSIS 调试主机已停止工作的错误消息,并且系统无法向缓冲区写入更多新行。这些消息位于不同的组件和步骤上(我有大约 30 个表具有相同的情况),所以我非常有信心这是我可用内存的一般问题,而不是我包中代码的特定问题。此外,如果我运行单个表甚至表组,该包将始终成功 - 它仅在尝试并行加载某些表时失败。

目前采取的步骤:

1) 将正在加载的表拆分到多个顺序容器/子包中,以减轻内存压力:这主要是有效的,但会将整体执行速度减慢到极长的时间。另外,有些表在达到一定限制时仍然会抛出 SSIS Debug Host 错误(下)。

2) 添加一个脚本组件来计算源上的哈希值(如this post),然后我可以使用它来确定记录是否已更改,而不是比较每一列。这也意味着我不需要从目标表中提取所有列,我认为这将有助于解决内存短缺问题。

问题继续存在:

一旦行数不平衡达到极端水平,即使只从源和目标中提取几个(6 个日期时间、3 个整数、2 个数字(38,0))列,我仍然会崩溃。这发生在没有上述哈希值的表上。故障点的数据流屏幕截图如下:注意行数。

关于下一步做什么的想法: 我想知道是否有办法减慢 SQL 源的速度,使其以与另一个相同的速度提取记录?有什么想法可以实现吗?

完整的错误描述: 1) SSIS Debug Host 已停止工作(弹出窗口)。

Problem signature:
  Problem Event Name:   APPCRASH
  Application Name: DtsDebugHost.exe
  Application Version:  2011.110.2100.60
  Application Timestamp:    4f35e2b2
      Fault Module Name:    clr.dll
  Fault Module Version: 4.0.30319.18449
  Fault Module Timestamp:   528fdc93
  Exception Code:   c0000005
      Exception Offset: 0010d0aa
      OS Version:   6.2.9200.2.0.0.272.7
  Locale ID:    1033
  Additional Information 1: 9336
  Additional Information 2: 9336482019c99e3f312ddc2ccd6c9a04
  Additional Information 3: b33b
  Additional Information 4: b33bc67c4e950cb436b9dbebdd26abc8

2) SSIS 错误消息:

[TF Dimension Merge Slowly Changing Dimension] Error: Internal error (Exception adding key to cache) in ProcessInput sending row to cache.
[TF Dimension Merge Slowly Changing Dimension] Error: Internal error (Exception adding key to cache) in ProcessInput adding rows to the cache.
[TF Dimension Merge Slowly Changing Dimension] Error: Internal error (Exception adding key to cache) in ProcessInput.
[TF Dimension Merge Slowly Changing Dimension] Error: Internal error (Unexpected exception in OrderedHashList.Remove removing entry from internal structures: Exception of type 'System.OutOfMemoryException' was thrown.) in ProcessKey thread dequeueing a key (03720200).
[TF Dimension Merge Slowly Changing Dimension] Error: Internal error (Unexpected exception in OrderedHashList.Remove removing entry from internal structures: Exception of type 'System.OutOfMemoryException' was thrown.) in ProcessKey thread dequeueing a key (28740100).
[TF Dimension Merge Slowly Changing Dimension] Error: Internal error (Internal error (Unexpected exception in OrderedHashList.Remove removing entry from internal structures: Exception of type 'System.OutOfMemoryException' was thrown.) in ProcessKey thread dequeueing a key (03720200).) in ProcessCache_Thread_ProcessKey.
[TF Dimension Merge Slowly Changing Dimension] Error: Internal error (Internal exceptions encountered.) in ProcessInput.
[TF Dimension Merge Slowly Changing Dimension] Error: Internal error (Internal error (Unexpected exception in OrderedHashList.Remove removing entry from internal structures: Exception of type 'System.OutOfMemoryException' was thrown.) in ProcessKey thread dequeueing a key (28740100).) in ProcessCache_Thread_ProcessKey.
[TF Dimension Merge Slowly Changing Dimension] Error: Internal error (Internal exceptions encountered.) in ProcessInput.

系统详情:

Windows 服务器 2012

安装内存 (RAM):64.0 GB

系统类型:64 位操作系统,基于 x64 的处理器

SSIS 2012 从 Visual Studio 环境执行(通过 SQL Server 代理按计划作业运行时也会出现问题

【问题讨论】:

  • 你能弹出你的数据流的截图吗?
  • 按要求添加,@billinkc。您可以看到的行数显示了包因 OutOfMemory 异常而失败的点。
  • 我不熟悉 PW 的组件,但您可以通过消除那里的数据转换组件来减少您的包的内存占用。我猜这是使 Oracle 数据类型与 SQL Server 一致?如果是这样,是否可以在 Oracle 源中显式转换为目标数据类型?
  • 7 到 8M 行对于 SSIS 包来说并不算多,除非机器只是缺乏资源。从 Visual Studio 运行包会给进程增加额外的负担,因为它将可执行文件与主机调试进程一起包装。通常,我会说尝试在不调试的情况下执行包(Ctrl-F5),但通过 SQL 代理运行它可以完成相同的任务。如果此数据流是系统上唯一的当前操作,那么您要么内存不足,要么 PW 组件不适用于此数据量。至少,这是我的初步结论。
  • 我同意你@billinkc - SSIS 包应该有很多,我已经确认 64GB 可用。我还检查了 Oracle 数据类型,至少在我正在查看的单个表上,它们已经被转换为兼容的格式。我正在尝试在 PW 论坛上查看该组件是否存在类似问题:那里有问题。也许这个包的原始开发者配置错误,我应该尝试从头开始重新创建一个?

标签: ssis out-of-memory ssis-2012


【解决方案1】:

我建议使用临时表首先从 Oracle 源加载数据 - 这将只是一个截断并且每次都加载。使用暂存表作为 SCD 的源,而不是与 Oracle 的连接。

另一个选项(如果您反对临时表)是在 SQL Server 中的数据到达 Task Factory SCD 组件之前插入 Sort 组件。确保根据您用于 SCD 的键执行排序。这会减慢来自 SQL Server 的数据,还可以使 TF 组件更快地执行 SCD,因为行已经排序。

【讨论】:

  • 感谢您的建议。 SORT 组件(或对源组件进行排序)实际上是由发明任务工厂 SCD 的人推荐的,我没有检查以确认是否进行了排序。如果内存使用仍然是一个问题,我还将保留 trunc/load Staging 表的想法:匹配源输入的速度,如 TF 建议中所述,将在该领域有很大帮助.
【解决方案2】:

与往常一样,答案对于这个问题来说太简单了(**headdesk** 此处)。

请求我帮助改进包性能的原始开发人员没有对 TaskFactory SCD 的输入进行排序。这导致所有数据都缓存在内存中,直到最后都不允许任何行通过 SCD。

this comment thread 提示我检查此问题,有人遇到类似问题,并建议我对其进行调整。相关报价如下:

"该组件的行为与 SCD 向导不同之处在于:它具有 多个输入而不是一个,它匹配输入上的行 很像 Merge Join 组件而不是 Lookup 组件。 该架构的最终效果是它必须存储传入的 来自所有输入的行,直到它们与来自其他输入的行匹配 输入,或者已知从这些输入中找不到匹配项 其他输入。 SCD 向导可以处理它的单输入一行 一次不需要缓存任何东西,因为它处理 一次输入一行,向现有维度发出“查找” 一次表一行以做出 SCD 处理决策。自从 这个组件缓存行,它需要更多的 RAM 来存储不匹配的 输入行。不幸的是,此组件不监视可用 RAM 级别并采取诸如排序组件之类的替代操作 (将缓存发送到磁盘)。因此,如果 RAM 累死了。”

在我自己的包中,我遵循在源组件中排序的做法(即使用ORDER BY)。我没有检查这个包是否已经有它,而且我很少使用 SSIS 排序组件,所以没有看到它并不惊慌。

一旦我在包中配置了排序(this guy has a good summary here),性能显着提高,我已经能够无错误地运行包。我将对这个人开发的所有包进行此更改,并期待这个解决我的问题。

感谢@billinkc 对 PW 组件的观察。它们并非旨在处理大量未排序的输入(或速度不平衡的输入),但一旦正确配置,看起来会好得多。

【讨论】:

    【解决方案3】:

    1) 您可以通过在将 Oracle 数据用于 SCD 转换之前将其拉入临时表来使用 HashBytes 模式。

    2) 否则,您也可以使用 T-SQL MERGE 语句来避免使用 SCD 转换。这里有一些详细解释的链接-MergeMerge2

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-05
      • 1970-01-01
      相关资源
      最近更新 更多