Optimization SSIS-循环内的连接管理

Optimization SSIS-循环内的连接管理,optimization,ssis,Optimization,Ssis,我有以下SSIS包: 问题是在Foreach循环中,每次迭代都会打开和关闭一个连接 在运行SQL Profiler时,我看到了一系列: 审核登录 RPC:已完成 审核注销 登录和实际执行工作的RPC的持续时间最短。但是,注销的持续时间很长,每次都会持续几秒钟。这会导致作业运行非常缓慢,需要花费许多小时。在测试服务器或独立笔记本电脑上运行时,我也会遇到同样的问题 有人能建议我如何更改软件包以提高性能吗 另外,我注意到,当从VisualStudio运行包时,它看起来好像继续运行,组件块变为琥珀

我有以下SSIS包:

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

在运行SQL Profiler时,我看到了一系列:

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

有人能建议我如何更改软件包以提高性能吗

另外,我注意到,当从VisualStudio运行包时,它看起来好像继续运行,组件块变为琥珀色,然后变为绿色,但实际上所有的处理都已完成,SQL profiler已停止沉默

谢谢


罗伯。

你试过做以下事情吗

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

  • 审核登录
  • RPC:已完成
  • RPC:已完成
  • RPC:已完成
  • RPC:已完成
  • RPC:已完成
  • RPC:已完成
  • 审核注销

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

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

在单个查询中运行一批操作时,SQL Server的性能最好。是否可以重新设计您的包,使其在一次调用中批量更新,而不是像您在这里使用的那样使用for循环的过程工作流

如果应用程序和RPC的设计允许(或者可以进行重构以允许),这可能是提高性能的最佳解决方案

例如,与以下内容不同:

for each Facility
 for each Stock
  update Qty
查看是否可以创建一个结构(使用SQL或具有单个连接的批量更新RPC),如:


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

我已经尝试为外循环和内循环中的控件设置唯一的连接管理器。第一次迭代工作正常,然后出现错误:[Container[40]]错误:无法获取外部列的属性。您输入的表名可能不存在,或者您对该表对象没有选择权限,并且尝试通过连接获取列属性的另一种方法失败。详细的错误消息如下:提供程序返回了一个空的架构表。通过查询System.Data.SqlClient.SqlConnection,未找到表“dbo”“CONTAINER”的列信息。
 update Qty
 from Qty join Stock join Facility
 ...