2016-12-22 46 views
1

我按照此博客文章創建ssis包以便在2個表之間傳輸數據。 http://radacad.com/insert-update-and-delete-destination-table-with-ssisSSIS合併連接來更新或刪除永久鎖定的行

  • 插入行:不ISNULL(SOURCE_ID)和ISNULL(DEST_ID)
  • 刪除行:ISNULL(SOURCE_ID),而不是ISNULL(DEST_ID)
  • 更新行:SOURCE_ID = DEST_ID和source_row_version <> dest_row_version enter image description here

它可以很好的記錄下來。但是,當檢測到更新和刪除行數很多時(一千或幾十萬行)。它運行速度很慢,目標表被鎖定,工作從未完成。另一件事,這種方法逐行刪除和更新。

請您幫我克服這種情況下的表鎖。有沒有什麼辦法可以讓我們更新或刪除一批行而不是逐行進行?

回答

3

使用暫存區域,並使用執行SQL任務運行SQL或執行存儲過程,以根據將暫存區域與目標進行比較來執行批量操作。

我知道這不是一個非常令人滿意的答案,如果您希望在SSIS中做所有事情,但使用阻塞轉換(MERGE JOIN is semi-blocking),並且逐行OLE命令轉換通常不會很好地擴展到大量數據的。

+2

同意。不要使用這種模式。兩個問題。首先,OLE DB命令每行進行一次數據庫往返。非常慢。其次,我們有兩個OLE DB命令雙向轉換同一張表。 Lock Central。如Jo建議的那樣,用OLE DB目標替換這些OLE DB命令。綁定這些目標以刪除和更新登臺表。然後,在控制流上,在此數據流之後,添加兩個EXECUTE SQL命令。一個是UPDATE FROM階段,另一個是DELETE FROM階段。這會更快。還在數據流之前添加TRUNCATE階段表命令以保持舞臺精益。祝你好運! –