Sql-Server

插入大量行的最快方法是什麼?

  • May 5, 2019

我有一個數據庫,我將文件載入到臨時表中,從這個臨時表中我有 1-2 個連接來解析一些外鍵,然後將這些行插入到最終表中(每月有一個分區)。我有大約 34 億行三個月的數據。

將這些行從暫存到最終表中的最快方法是什麼?SSIS 數據流任務(使用視圖作為源並具有快速載入活動)或 Insert INTO SELECT …. 命令?我嘗試了數據流任務,可以在大約 5 小時內獲得大約 10 億行(伺服器上的 8 個核心 / 192 GB RAM),這對我來說感覺很慢。

一種常見的方法:

  1. 禁用/刪除目標表上的索引/約束。
  2. INSERT dbo.[Target] WITH (TABLOCKX) SELECT ...
  3. 當然,感謝 JNK,您可以分批執行上述操作n,這可以減少事務日誌的壓力,當然這意味著如果某個批處理失敗,您只需從該批處理開始。我在這裡寫了這篇部落格(雖然提到刪除,但同樣的基本概念適用):http ://www.sqlperformance.com/2013/03/io-subsystem/chunk-deletes
  4. 在目標表上重新啟用/重新創建索引/約束(如果不是所有操作都需要這些索引/約束,也許您可以推遲其中的一些,並且快速獲取基本數據線上更為重要)。

如果您的分區是物理的而不僅僅是邏輯的,您可以通過讓不同的程序同時填充不同的分區來獲得一些時間(當然這意味著您不能使用TABLOCK/ TABLOCKX)。這假設源也適用於多個程序選擇而沒有重疊/鎖定等,並使操作的那一側變得更慢(提示:在源上創建適合目標分區方案的聚集索引)。

你也可以考慮一些更原始的東西,比如BCP OUT/BCP IN

我不知道我會跳到 SSIS 來幫助解決這個問題。那裡可能有一些效率,但我不知道努力證明節省是合理的。

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