Sql-Server

優化 BLOB 數據的 BCP 性能

  • March 4, 2021

我正在計劃將 2TB 數據庫實時遷移到分區表。該系統從廣義上講是一個文件儲存,大部分空間分配給 50kb 到 500kb 之間的 LOB,一小部分在 500kb 到 1MB 範圍內。部分遷移將涉及從舊數據庫到新數據庫的 BCPing 數據。

BCP 是首選方法,因為數據中的目前/歷史劃分允許在最終切換之前分階段(在較安靜的時期)提取較舊的數據,從而最大限度地減少對實時系統的影響。數據量和儲存的可用性排除了對分區方案的就地重建

由於 BLOB 內容,我懷疑通過嘗試 KILOBYTES_PER_BATCH 而不是 ROWS_PER_BATCH 可能會獲得一些性能提升。BCP 文件中建議SQL 可以基於此值優化操作。

我找不到關於這些優化的性質或從哪裡開始測試的任何指導。在沒有建議的情況下,我將在 4/8/16/32/64mb 邊界處嘗試短跑開始。

更改數據包大小(BCP -a 參數,而不是伺服器級別設置)可能會帶來一些好處,但除非有人有更公式化的方法,否則我傾向於將其提高到最大值 65535。

這不是對您的問題的直接回答,但有些文章您會從閱讀它們中受益(以防您沒有先找到它們:-))。它們是關於使用 bcp/批量複製載入大量數據。我已經閱讀了所有內容,但沒有找到任何關於 KILOBYTES_PER_BATCH 的詳細資訊,它們都在使用 ROWS_PER_BATCH,但我相信您會找到其他有用的資訊。

  • 在不到 1 小時內載入 1TB(來自 SQL CAT 團隊) - 來自此處的建議列表(引用):
  • 執行與可用 CPU 一樣多的載入程序。如果您有 32 個 CPU,請執行 32 個並行載入。如果您有 8 個 CPU,請執行 8 個並行載入。
  • 如果您可以控制輸入文件的創建,請將它們的大小設置為可以被您要並行執行的載入執行緒數整除。如果要使用切換分區策略,還要確保所有記錄都屬於一個分區。
  • 如果您在 SQL Server 電腦上執行程序,請使用 BULK insert 而不是 BCP。
  • 使用表分區可以再增加 8-10%,但前提是您的輸入文件必須保證與您的分區功能相匹配,這意味著一個文件中的所有記錄必須位於同一個分區中。
  • 使用 TABLOCK 避免一次鎖定行。
  • 如果要將多個流導入一個表,請使用 ROWS PER BATCH = 2500 或接近此值的值。
  • 建構大型關係數據倉庫的 10 大最佳實踐(來自 SQL CAT 團隊)- 建議(引用):
  • 在初始數據載入期間使用 SIMPLE 或 BULK LOGGED 恢復模式。
  • 使用聚集索引創建分區事實表。
  • 為每個分區創建非索引臨時表,並為填充每個分區單獨的源數據文件。
  • 並行填充臨時表(使用多個 BULK INSERT、BCP 或 SSIS 任務)
  • 在每個臨時表上建構一個聚集索引,然後創建適當的 CHECK 約束。
  • 將所有分區 SWITCH 到分區表中。
  • 在分區表上建構非聚集索引。
  • 數據載入性能指南(來自 SQL CAT 團隊)
  • 將批量數據載入到分區表中 - SQL Server 最佳實踐文章(Technet 文章)
  • SQL Server 2000 增量批量載入案例研究(Technet 文章)
  • 大型快速通道 POC 的經驗教訓和發現(來自 SQL CAT 團隊)
  • SQL Server BCP 的性能調整技巧(作者 Brad McGehee)
  • 性能影響:尋找最佳批量大小(作者:Linchi Shea)

以及明顯的 MSDN 參考資料:

以我個人的經驗,我成功地使用並行載入和幾個批量大小的測試來實現快速數據載入。我想只有個人測試適合你。希望您能在參考資料中找到一些好的建議。

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