SSIS - 插入大量行的最佳方法
所以這裡是這樣的場景:我有一個 XML 文件,大小為 500GB,包含大約 6 億行的數據(一次在數據庫表上)。我正在使用 SSIS 進行操作,因為如果我要使用 SSIS 組件(即:),它會消耗大量記憶體
XML Source
,它可能會導致超時(如果我錯了,請糾正我,但至於我知道,使用 SSIS 上的組件會將 XML 的內容載入到記憶體中 - 文件那麼大肯定會導致錯誤)。我的做法是:
- 使用 a
Script Task
來解析 XML 數據XML Reader
(到目前為止,XML Reader 是最好的方法,因為它以向前、非記憶體的方法解析 XML)- 將數據插入到
DataTable
- 每隔 500,000 行
DataTable
,使用 將內容插入數據庫SqlBulkCopy
,然後清除DataTable
我的問題是,目前,我嘗試用它解析另一個大小為 200GB 的文件,它的執行速度約為 13.5M / 1 小時 - 我不知道它是否仍然適合該執行時間。它確實解決了我的問題 - 但它不是太優雅,我的意思是,應該有其他方法。
我正在尋找其他方法,例如:
- 將大型 XML 文件分成小塊 CSV(大約 20GB),然後使用 SSIS
Data Flow task
- 每個新行使用
INSERT
腳本你能幫我決定哪個最好嗎?或建議任何其他解決方案。
每一個答案都將不勝感激。
編輯
我忘了提 - 我的方法將是動態的。我的意思是,有許多表將填充大型 XML 文件。因此,使用腳本組件作為源可能不是那麼有用,因為我仍然需要定義輸出列。但是,還是會試一試。
您是否考慮過將數據流任務與作為源的腳本組件一起使用?您可以為從文件中消耗的每一行執行 AddRow,並讓 SSIS 處理批處理。
在您重新發明輪子之前,您是否真的嘗試過 XML 源(在數據流中)?我創建了一個 50GB 的 XML 文件(4000 萬使用者,每個使用者有 20 種技能,總共 8 億行),它執行得非常好:
這是在我的筆記型電腦上使用 SQL Server 2014 的 16GB RAM,並且沒有記憶體不足錯誤。這確實建議了 XML Source 流,但我找不到任何文件來確認它。
您使用的是哪個版本的 SQL Server?我不認為控制流中的 XML 任務在這裡是一個選項,所以在您執行任何自定義腳本之前嘗試數據流中的 XML 源並讓我們知道您的進展情況。