2008-10-31 244 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組件處理數據轉換和驗證以及緩慢更改維度,並且它相對於單獨的客戶端程序相對較快地執行大量數據。