带有Foreach循环容器的SSIS包通过对象变量循环

时间:2017-09-21 17:17:55

标签: sql-server performance ssis foreach-loop-container

上下文: 在SQL服务器(2014)中,我有一个表,其中包含数百个商店编号的唯一列表。我有一个DB2 LUW服务器,我需要根据这些存储号从中提取数据,并将这些数据转储到不同的SQL服务器(2014)。由于限制,我必须将商店号码分成25个组,并多次运行查询。

要在SSIS中执行此操作,我使用执行SQL任务一次提取25个商店编号,并将它们STUFF为单引号对齐,逗号分隔的字符串(' 12345',&#39 ; 03884'等我存储到对象变量中。然后我使用Foreach循环容器将字符串拉出对象变量并将其存储到字符串变量中。接下来,我有一个包含DB2查询的字符串变量,它将商店列表字符串变量作为参数。

"select x, y, z from DB2SERVERTABLE where store_number in " + @[User::Store_List]

接下来,我使用另一个Execute SQL Task在变量中执行该查询。完整结果集存储在另一个对象变量中。为了从对象变量中获取结果并将它们插入到我的其他SQL服务器中,我使用另一个FELC来迭代结果集,使用变量映射屏幕将每个字段存储在字符串变量中。在FELC内部,我有一个最终的Execute SQL Task,它是一个简单的insert语句,用于将变量插入SQL服务器。

insert into table values (?,?,?);

所有这些,不知何故,确实有效。

硬(软)器皿

  1. VMWare Windows 2012 R2服务器64位
  2. Intel Xeon E5-4650 CPU 4核@ 2.69GHz
  3. 32GB RAM(SQL Server提交27GB,所以真的只有5GB ......)
  4. Visual Studio 2015
  5. SSDT 2015
  6. DB2 LUW(不确定是什么版本)
  7. SQL Server 2014
  8. 问题:最终的FELC和插入运行速度非常慢。在我的上一次测试中,我从DB2(~95K行)中提取了1个商店号的数据。 20分钟后,我的SQL服务器中只插入了40K行,并且在进度选项卡中查看行数时,它变得越来越慢,直到它刚刚冻结,我不得​​不杀死进程。此时,Visual Studio在平均上使用~3GB RAM和50%CPU。 我一直在谷歌上搜索暴风雨,我无法找到与我有类似情况的人。我认为通过脚本任务在C#中完成大量工作可能会更好。在我开始重新使用代码之前,我希望有人能够认出这个问题。谢谢!

1 个答案:

答案 0 :(得分:0)

这一步:

“完整结果集存储在另一个对象变量中。要从对象变量中获取结果并将它们插入到我的其他SQL服务器中,我使用另一个FELC迭代结果集,将每个字段存储在字符串变量中使用变量映射屏幕。在FELC内部,我有一个最终的执行SQL任务,它是一个简单的插入语句,用于将变量插入SQL服务器。“

尝试将数据插入本地SQL表,而不是使用最终的FELC - 使用Lookup过滤数据。