SSIS - 循环内的连接管理

时间:2010-05-19 17:02:30

标签: optimization ssis

我有以下SSIS包:

alt text http://www.freeimagehosting.net/uploads/5161bb571d.jpg

问题是在Foreach循环中,每次迭代都会打开和关闭连接。

在运行SQL事件探查器时,我看到一系列:

  • 审核登录
  • RPC:已完成
  • 审核退出

登录的持续时间和实际完成工作的RPC是最小的。但是,注销的持续时间很长,每次都会持续几秒钟。这导致JOB运行非常缓慢 - 需要花费数小时。在测试服务器或独立笔记本电脑上运行时,我遇到同样的问题。

有人可以建议我如何更改套餐以提高性能吗?

另外,我注意到从Visual Studio运行包时,它看起来好像继续运行,组件块变为琥珀色然后是绿色但实际上所有处理都已完成且SQL事件探查器已经静默了?

谢谢,

罗布。

3 个答案:

答案 0 :(得分:1)

您是否尝试过并行运行数据流任务?您很可能会分解for循环以使您能够并行运行每个'set',因此虽然登录/退出可能仍然很昂贵,但您将同时执行N次。

答案 1 :(得分:1)

在单个查询中运行批处理操作时,SQL Server的性能最佳。是否有可能重新设计您的软件包,以便在一次调用中批量更新,而不是像在此处拥有for循环的过程工作流程一样?

如果您的应用程序和RPC的设计允许(或可以重构以允许它),这可能是性能的最佳解决方案。

例如,而不是像:

for each Facility
 for each Stock
  update Qty

查看是否可以创建结构(使用SQL或使用单个连接的批量更新RPC),如:

 update Qty
 from Qty join Stock join Facility
 ...

如果您控制RPC的实现,RPC可以通过委托给执行批处理操作的另一个API来维护相同的API(如果需要),但是指定单记录限制(其中record = someRecord)。

答案 2 :(得分:0)

您是否尝试过以下操作?

在循环中使用的连接的连接管理器中,右键单击并选择属性。在连接的属性中,找到“RetainSameConnection”并将其从默认值False更改为True。这将使您的包在整个包运行期间保持连接。您的探查器可能看起来像:

  • 审核登录
  • RPC:已完成
  • RPC:已完成
  • RPC:已完成
  • RPC:已完成
  • RPC:已完成
  • RPC:已完成
  • ...
  • 审核退出

在程序包执行结束时发生最终的审核注销。