Sql-Server

SSIS - 插入大量行的最佳方法

  • July 29, 2015

所以這裡是這樣的場景:我有一個 XML 文件,大小為 500GB,包含大約​​ 6 億行的數據(一次在數據庫表上)。我正在使用 SSIS 進行操作,因為如果我要使用 SSIS 組件(即:),它會消耗大量記憶體XML Source,它可能會導致超時(如果我錯了,請糾正我,但至於我知道,使用 SSIS 上的組件會將 XML 的內容載入到記憶體中 - 文件那麼大肯定會導致錯誤)。我的做法是:

  • 使用 aScript Task來解析 XML 數據XML Reader(到目前為止,XML Reader 是最好的方法,因為它以向前、非記憶體的方法解析 XML)
  • 將數據插入到DataTable
  • 每隔 500,000 行DataTable,使用 將內容插入數據庫SqlBulkCopy,然後清除DataTable

我的問題是,目前,我嘗試用它解析另一個大小為 200GB 的文件,它的執行速度約為 13.5M / 1 小時 - 我不知道它是否仍然適合該執行時間。它確實解決了我的問題 - 但它不是太優雅,我的意思是,應該有其他方法。

我正在尋找其他方法,例如:

  • 將大型 XML 文件分成小塊 CSV(大約 20GB),然後使用 SSISData Flow task
  • 每個新行使用INSERT腳本

你能幫我決定哪個最好嗎?或建議任何其他解決方案。

每一個答案都將不勝感激。

編輯

我忘了提 - 我的方法將是動態的。我的意思是,有許多表將填充大型 XML 文件。因此,使用腳本組件作為源可能不是那麼有用,因為我仍然需要定義輸出列。但是,還是會試一試。

您是否考慮過將數據流任務與作為源的腳本組件一起使用?您可以為從文件中消耗的每一行執行 AddRow,並讓 SSIS 處理批處理。

在您重新發明輪子之前,您是否真的嘗試過 XML 源(在數據流中)?我創建了一個 50GB 的 XML 文件(4000 萬使用者,每個使用者有 20 種技能,總共 8 億行),它執行得非常好:

在此處輸入圖像描述

這是在我的筆記型電腦上使用 SQL Server 2014 的 16GB RAM,並且沒有記憶體不足錯誤。這確實建議了 XML Source 流,但我找不到任何文件來確認它。

您使用的是哪個版本的 SQL Server?我不認為控制流中的 XML 任務在這裡是一個選項,所以在您執行任何自定義腳本之前嘗試數據流中的 XML 源並讓我們知道您的進展情況。

引用自:https://dba.stackexchange.com/questions/108088