2008-10-31 248 views
2

我正在使用SSIS在两个数据库之间同步数据。我过去使用过SSIS和DTS,但我通常会为这种性质的应用程序编写一个应用程序(我是编码器,它对我来说更简单)。如何克服SSIS调试性能差的问题?

在我的软件包中,我使用返回大约15,000行的SQL Task。我已经把它和一个Foreach容器连接起来了,在这个容器中,我将结果集列的值赋给变量,然后将这些变量映射到提供给另一个SQL任务的参数。

我遇到的问题是调试,而不仅仅是更复杂的调试,如断点和运行时评估值。我的意思是,如果我在调试而不是没有调试的情况下运行,需要几个小时才能完成。 我结束了重写的过程在Delphi中,下面就是我想出了:

完整的数据推送:
这拉15000行,更新的目标表的每一行,然后再换11000行并更新每行的目标表。

调试:
Delphi应用程序:139S
SSIS 4小时46分

不调试:
Delphi应用程序:132S
SSIS:384s

的更新数据:
这拉3,000行,但没有更新对目的地表格是必需的或是做出的。然后它将拉出11,000行,但是,不需要更新,也不需要对目标表进行更新。

调试:
Delphi应用程序:42s中
SSIS 1小时10分

不调试:
Delphi应用程序:34S
SSIS:205S

奇怪的是的,我感觉大部分时间花费在调试上只是更新Visual Studio中的UI元素。如果我观察进度选项卡,每次迭代都会将一个节点添加到树中(总计数千),随着进程的继续,这个节点变得越来越慢。试图停止调试通常不起作用,因为Visual Studio似乎陷入了更新UI的循环中。如果我检查SQL Server的分析器,则没有正在进行的实际工作。我不确定机器是否重要,但它应该超过这个工作(四核,4个ram,512 mb视频卡)。

这种行为是否正常?正如我所说的,我是一个交易编码人员,所以我没有任何问题为这类事情编写应用程序(实际上,编写应用程序比在SSIS中“绘制”应用程序花费的时间少得多,但我认为在SSIS中完成更多工作时边距会缩小),但我试图找出像SSIS和DTS这样的东西适合我的工具箱。到目前为止,没有任何关于它给我留下了深刻印象也许我以某种方式滥用或滥用SSIS?

任何帮助将不胜感激,在此先感谢!

回答

3

SSIS控制流和循环的性能并不是很高,并且不是为处理这些数据量而设计的。特别是在调试过程中 - 每次执行任务之前和之后,调试器会向设计器进程发送通知,以更新形状的颜色,这可能会很慢。

使用数据流可以获得更好的性能。数据流不能用单行操作,它可以与行的缓冲区一起工作 - 速度要快得多,调试器只会通知缓冲区的开始/结束 - 所以其影响不太明显。

0

我注意到这是行为,我有一个移动的SSIS包,做了300万条附近的某个地方,它不可能调试,因为它会运行大约3-4天。

SSIS仍然是我的工作方式,我只是不使用SSIS“调试”,我在处理完整数据集时运行它们。如果我必须调试,我使用非常小的数据集。

3

SSIS的目的不是为了做这样的foreach。如果您正在为每一行进行一些操作,您可能希望将这些读入数据流,然后使用查找或合并连接,确定是否执行INSERT(批量发生)或用于多个SQL UPDATE的数据库命令对象命令(一个更好的执行选项是将它们批处理到暂存表中并执行一次更新)。

在另一个典型的同步情况下,您将所有数据读入临时表,并对新行(LEFT JOIN,rhs IS NULL)上的现有行(INNER JOIN)和INSERT执行SQL Server UPDATE。也有使用链接服务器的可能性,但由于所有(或许多)数据可能都必须通过网络,所以加入可能会很慢。

我有SSIS包,定期导入2400万行,包括使用TableDifference组件处理数据转换和验证以及缓慢更改维度,并且它相对于单独的客户端程序相对较快地执行大量数据。