快速插入; BulkCopy與關係數據

insert sql sqlbulkcopy sql-server

我有大量不斷傳入的數據(大約每分鐘10,000次,並且正在增長),我希望盡可能高效地插入到數據庫中。目前我正在使用準備好的插入語句,但我正在考慮使用SqlBulkCopy類以更大的塊來導入數據。

問題是我沒有插入單個表 - 數據項的元素被插入到許多表中,並且它們的標識列在同時插入的其他行中用作外鍵。我知道批量複製並不意味著允許更複雜的插件,但是我想知道是否值得為uniqueidentifier列交換我的標識列(在本例中為bigint)。這將允許我為每個表執行幾個批量複製,並且因為我可以在插入之前確定ID,所以我不需要檢查SCOPE_IDENTITY之類的任何東西,這阻止我使用批量複製。

這聽起來像是一個可行的解決方案,還是我可能遇到的其他潛在問題?或者,是否有另一種方法可以快速插入數據,但保留我對bigint標識列的使用?

謝謝。

一般承認的答案

聽起來你正在計劃交換“SQL分配[bigint identity()列]代理鍵”和“數據準備例程確定GUID代理鍵”方法。換句話說,密鑰不會在SQL中分配,而是從外部SQL分配。鑑於您的數量,如果數據生成過程可以分配代理鍵,我肯定會這樣做。

那麼問題就是,你必須使用GUID,還是你的數據生成過程能產生自動遞增的整數?創建這樣一個工作一致且無懈可擊的過程很難(為SQL Server支付$$$的一個原因),但是在數據庫中更小和更易於理解的密鑰的權衡可能是值得的。


熱門答案

uniqueidentifier可能會讓事情變得更糟:頁面分裂和更廣泛。看到這個

如果你的負載是/可以批處理,一個選項是:

  • 你加載一個臨時表
  • 將實際表一次加載為存儲過程
  • 在臨時表中為每個批次使用uniqueidentifier

我們處理每秒大約50k行的峰值(並且以這種方式增加)。我們實際上使用單獨的臨時數據庫來避免雙事務日誌寫入)



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow