如何解决SSIS调试性能差的问题?

3
我正在使用SSIS在两个数据库之间同步数据。我以前使用过SSIS和DTS,但通常会为这类事情编写应用程序(我是一名程序员,这对我来说更容易)。
在我的包中,我使用一个SQL任务返回约15,000行。我将其连接到ForEach容器中,在其中将结果集列值分配给变量,然后将这些变量映射到传递给另一个SQL任务的参数。
我遇到的问题是调试,不仅仅是更复杂的断点和运行时评估等调试。我的意思只是,如果我带着调试运行它,而不是没有调试,它需要几个小时才能完成。 最终我用Delphi重写了这个过程,以下是我想出的内容:
完全推送数据: 这将提取15,000行,更新每一行的目标表,然后提取11,000行并更新每一行的目标表。
调试: Delphi应用:139秒 SSIS:4小时46分钟
无调试: Delphi应用:132秒 SSIS:384秒
更新数据: 这将提取3,000行,但不需要或进行任何更新到目标表。然后它再次提取11,000行,但是也不需要或进行任何更新到目标表。
调试: Delphi应用:42秒 SSIS:1小时10分钟
无调试: Delphi应用:34秒 SSIS:205秒
奇怪的是,我觉得大部分时间都用于在Visual Studio中更新UI元素。如果我观察进度选项卡,每个迭代会添加一个节点到树中(总共数千个),随着过程的进行,这变得越来越慢。试图停止调试通常不起作用,因为Visual Studio似乎陷入了更新UI的循环中。如果我检查SQL Server的分析器,实际上没有进行任何工作。我不确定机器是否重要,但应该完全可以胜任(四核,4GB RAM,512MB显卡)。
这种行为正常吗?正如我所说,我是一名程序员,所以编写此类事情的应用程序对我来说没有问题(实际上,编写应用程序比在SSIS中“绘制”它要快得多,但我想随着在SSIS中完成更多的工作,这种差距将缩小),但我正在尝试弄清楚像SSIS和DTS这样的东西在我的工具箱中适合哪些任务。到目前为止,它的所有内容都没有给我留下深刻的印象。也许我在某种方式上误用或滥用了SSIS?
非常感谢您的帮助!
3个回答

3

SSIS控制流程和循环不是非常高效,也不适用于处理这些数据量。特别是在调试期间 - 在每个任务执行之前和之后,调试器会发送通知到设计师进程,更新形状的颜色,这可能会很慢。

您可以使用数据流获得更好的性能。数据流不使用单行操作,而是使用行缓冲区 - 更快,并且调试器仅在缓冲区的开始/结束时被通知 - 因此其影响较小。


3

SSIS不是设计用来做像这样的foreach循环。如果你想针对每一行数据进行操作,你可能需要将它们读入到一个数据流中,然后使用查找或合并连接来确定是否执行INSERT(这些操作是批量执行的),或者使用数据库命令对象执行多个SQL UPDATE命令(更好的性能选项是将它们分批处理到暂存表中,并执行单个UPDATE)。

在另一种典型的同步情况下,您可以将所有数据读入到一个暂存表中,在现有行上执行SQL Server UPDATE(INNER JOIN),并在新行上执行INSERT(LEFT JOIN,rhs IS NULL)。还有使用链接服务器的可能性,但是在其上执行连接可能会很慢,因为所有(或大部分)数据都可能需要通过网络传输。

我有一些SSIS包定期导入2400万行数据,包括处理数据转换和验证以及使用TableDifference组件处理缓慢变化的维度,相对于单独的客户端程序,它的性能表现得相对较快。


0

我注意到这种行为,我有一个用于移动的SSIS包,大约处理了300万条记录,它无法进行调试,因为运行时间需要3-4天。

我仍然使用SSIS来完成任务,但我不会使用SSIS进行“调试”,而是在处理完整数据集时运行它们。如果必须进行调试,我会使用非常小的数据集。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接