2017-02-17 70 views
0

我有一個簡單的SSIS包,可以將源和目標之間的數據從一臺服務器傳輸到另一臺服務器。爲什麼添加另一個LOOKUP轉換會顯着降低性能SSIS

如果它的新記錄 - 它插入,否則它會檢查HashByteValue列,並且它是否與它的更新記錄不同。

表包含大約150萬行,並更新大約50列。

當我開始調試包時,大約2分鐘沒有任何反應,我甚至看不到綠色的複選標記。之後,我可以看到數據開始流經,但有時會停止,然後再次流動,然後再次停止,等等。

整個包裝看起來是這樣的:

enter image description here

但如果我這樣做只是INSERT部分(不包括更新),那麼它完美的作品,1分鐘,所有150萬條記錄的目標表。

enter image description here

那麼,爲什麼增加另一個LOOKUP改造包,更新記錄會降低性能,從而顯著。 這是與內存有關嗎?我在lookups中使用FULL CACHE選項。

什麼是提高性能的方法?

的原因可能是在自動增長文件大小:

enter image description here

+0

有疑問時,跟蹤! – ajeh

+0

增加數據和日誌的自動增長到100MB,看看是否有幫助。1MB太小了。您很少應該使用默認的10%用於Autogrowth。 –

+0

我編輯了我的帖子。您可以看到數據庫的自動增長。謝謝 – Oleg

回答

2

除了將AutoGrowth大小更改爲100MB,您的數據庫日誌文件爲29GB。這意味着你很可能不會在執行事務日誌備份。

如果您不是,並且只能每晚或定期進行完整備份。將數據庫的恢復模式從完全更改爲簡單。

數據庫屬性>選項>恢復模式

然後收縮你的日誌文件中使用到100MB:

DBCC SHRINKFILE(Catalytic_Log, 100) 
+0

你是對的。我們只是在另一臺服務器上創建了這個新實例,我們都不知道如何正確設置所有內容。謝謝 – Oleg

+0

我在上面編輯過,向您展示如何在設置爲簡單後縮減日誌文件。 –

+0

許多好多了!!!! 在開始流動數據之前仍然等待一小段時間,但所有事情都在不到2分鐘的時間內完成! 非常感謝! – Oleg

2

我不認爲你的問題是在查找。 OLE DB命令在SSIS上顯然很慢,我不認爲這是對行的大量更新。在MSDN中查看此答案:https://social.msdn.microsoft.com/Forums/sqlserver/en-US/4f1a62e2-50c7-4d22-9ce9-a9b3d12fd7ce/improve-data-load-perfomance-in-oledb-command?forum=sqlintegrationservices

要驗證錯誤不是查找,請嘗試禁用「OLE DB命令」並重新運行該進程並查看需要多長時間。

根據我個人的經驗,當您必須根據特定條件進行更新或插入時,最好創建一個存儲過程來完成整個「數據流」。爲此,您需要一個Staging表和一個Destination表(您將在其中加載轉換後的數據)。

希望它有幫助。

+1

**我不知道爲什麼這個答案得到了低票 - 它實際上回答了這個問題。** Gordon Bell的備份響應(雖然完全正確)在切線上。 OLEDB cmd執行逐行插入,oledb目標,設置爲快速加載執行相對較快的「批量」加載。您應該按照asemprini87的建議操作,並將更新行導向臨時表,然後調用proc來運行更新。 –

+0

如果我錯了,你能糾正我嗎?所以我有源表和目標表。你說的是我應該將符合ID的行重定向到第三個(分段)表。然後用SP來更新它們? – Oleg

+1

通常,ETL過程使用標準將查詢引入數據源,並將結果放入臨時表中。一旦在Stage中獲得了數據,就可以運行Transformation進程將其放入DataWarehouse。在這一步中,你應該有SP來做這個插入和更新。我們特別爲大流程使用登臺表格:https://en.wikipedia.org/wiki/Staging_(data) – asemprini87

相關問題