1

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

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

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

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

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

到目前为止采取的步骤:

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

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

继续存在的问题:

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

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

完整的错误描述: 1) SSIS 调试主机已停止工作(弹出窗口)。

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.

系统详情:

视窗服务器 2012

安装内存(RAM):64.0 GB

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

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

4

3 回答 3

0

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

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

这个评论线程提示我检查这个,有人遇到类似问题,并被建议调整它。相关报价如下:

该组件不监视可用的 RAM 级别并像排序组件那样采取替代操作(将缓存发送到磁盘)。因此,如果 RAM 用尽,它将引发错误。”

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

一旦我在包中配置了排序(这个人在这里有一个很好的总结),性能急剧提高,我已经能够无错误地运行包。我将对这个人开发的所有软件包进行此更改,并希望这能解决我的问题。

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

于 2014-05-21T17:25:33.280 回答
0

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

另一种选择(如果您反对临时表)是在 SQL 服务器中的数据进入任务工厂 SCD 组件之前插入排序组件。确保根据您用于 SCD 的键执行排序。这会减慢来自 SQL Server 的数据,还可以使 TF 组件更快地执行 SCD,因为行已经排序。

于 2014-05-21T16:03:22.357 回答
0

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

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

于 2015-02-27T11:50:49.113 回答