SSIS 組播性能問題
我想知道多播實際上是如何工作的。所以這是我的設置。我有一個大約 100k 行的源平面文件(csv),可能大約 250-300 列,我將該文件多播到 7 個一對一的表中。這些表中只有主鍵列重複。此設置似乎工作正常,但現在看來我們可能遇到了記憶體問題。我想知道將數據多播到 7 個目的地是否太多。關於記憶體使用的任何想法?我真的不在乎它的執行速度有多快,只是想減少記憶體使用量。
我正在考慮的一種替代方法可能只是為同一個文件創建 7 個不同的連接管理器,然後按順序執行所有內容。那會更好嗎?謝謝!
SSIS 通過成為記憶體中的轉換引擎來獲得它的力量。數據流任務中的基本工作單元是緩衝區。如果您想知道為什麼 SSIS 對數據類型如此挑剔,那是因為它會計算一行的成本,然後為 N 行分配記憶體。*所有下游組件都使用相同的記憶體地址來完成它們的 ETL 部分,這允許並行化。這意味著具有 1 個輸出的多播的成本與具有 10 個輸出的多播的成本相同。它只是允許多個組件使用數據。
我不能 100% 確定預多播的情況,我有一個名為 SSN 的專欄。在 MC 的輸出 1 中,我將數字 rot-5到位並寫入目標並使用未更改的版本輸出 2,必須有與之相關的額外記憶體成本,但我認為這只是列所需的空間被複製。
在您引入非同步組件(排序、聚合等)之前,所有下游組件都使用相同的記憶體地址。當那些命中數據流時,*緩衝區結束,數據從記憶體空間 1 複製到記憶體空間 2。從“我只是將列數從 100 減少到 10”的角度來看,這聽起來不錯,但你已經破裂了“非同步組件之前”和“非同步之後”之間的總記憶體空間。您不能一次執行 100 個緩衝區,而是在 30 個之前和 70 個之後,並且中間的記憶體複製是一項昂貴的操作。
如果您想減少記憶體使用量,請建構您的包以減少使用;)
- 您可以通過避免非同步轉換來使用更少。
- 僅拉入您需要的列。
- 如果您有查找,請編寫一個明確列舉所需列的查詢,而不是點擊下拉列表中的表。
- 如果您有查找,請查看限制返回的行的深度。如果您只需要查找目前值,在上面的查詢中,使其
WHERE ISCurrent = CAST(1 AS bit);
- 注意您的數據類型。從文件導入,不要偷懶,從字元串開始,以後再轉換為數據類型(除非你的數據清潔度有問題)
- 還要注意您的數據類型!您不太可能處理來自平面文件的二進制/LOB 數據類型,但這些數據類型無法確定地適合記憶體,因此 SSIS 將在記憶體中攜帶指向磁碟地址的指針。雖然這不會佔用您所有的記憶體,但它確實會減慢處理速度,因為在操作過程中會創建和銷毀許多小文件