使用SqlBulkCopy插入行

linq-to-sql sqlbulkcopy sql-server transactions

我正在將我的一些Linq切換為Sql代碼以使用SqlBulkCopy,問題是我需要在兩個表中進行兩次數千行的插入。

該服務將獲取10,000批次的鏈接(從站點地圖,反向鏈接構建器等導入),並將它們切換為每個源的X的RSS源以進行聚合。問題是,我已經有一個3200萬行的表。如果我正在執行linq到sql插入,它取決於站點流量5到10分鐘之間的任何地方加載10,000鏈接。

結構非常基礎。

提要 :Id bigint(PK),標題varchar(1000),描述varchar(1000),發布日期時間,聚合日期時間null,ShortCode varchar(8)[過時,不再插入,但用於遺留數據]

項目 :Id bigint(PK),FeedId bigint(FK),標題varchar(1000),描述varchar(1000),發布日期時間,ShortCode varchar(8)[過時,不再插入,但用於遺留數據],ShortId bigint null [插入後更新為等於Id(用於分區)]

FutureItems :Id bigint(PK),FeedId bigint(FK),Title varchar(1000),Description varchar(1000),Published datetime,ShortCode varchar(8)[已過時,不再插入,但用於遺留數據],ShortId bigint null [插入後更新為等於Id(用於分區)]

OldItems :Id bigint(PK),FeedId bigint(FK),標題varchar(1000),描述varchar(1000),發布日期時間,ShortCode varchar(8)[過時,不再插入,但用於遺留數據],ShortId bigint null [插入後更新為等於Id(用於分區)]

因此,如果您的Feed大小為20,則會在Feeds表中獲得500個插入,然後將10000個插入到Items表中,然後更新運行以將ShortId設置為Id。每晚一次,作業運行將數據分成另外兩個表,並將未來的項目轉移到Items表中。

我讀到SqlBulkCopy可以做幾千萬行,但我找不到任何好的例子,用FK約束進入多個表。

我們的SQL服務器是一個“怪物”,尤其適用於此應用程序。它是SQL 2008 R2 Web,Windows 2008 R2 Enterprise,12GB Ram,雙核4 Xeons @ 2.8ghz。

我們的Web服務器是沒有數據庫服務的克隆。

插入鏈接時CPU運行大約85%,數據庫填充RAM。

如果SqlBulkCopy不好,任何建議都是受歡迎的,我們有付費的客戶生氣,我不是DBA,只是一個普通的程序員。

一般承認的答案

SqlBulkCopy確實比普通插入更快。但速度更快,因為它可以將每秒運行1000次插入的作業轉換為10000次/秒的作業。如果您在10分鐘內只能完成10000個鏈接,則必須遇到不同的問題,批量複製不太可能解決。

您需要首先調查為什麼插入10000個鏈接所需的時間非常長。只有在您了解之後才能進行調用以確定是否轉移到SqlBulkCopy是一種解決方案。我知道你不是一名DBA,但我會指導你一本'dbaish'白皮書來解決SQL Server性能問題: 等待和隊列 。這不是一個cookie切割器配方解決方案,實際上是一種方法,將教你如何識別SQL Server中的性能瓶頸。

並解決您的問題:如果有約束,如何使用SqlBulkCopy?更通用的問題是當約束到位時如何進行批量插入操作?對於嚴重的捲,實際上會禁用約束,執行批量上載,然後啟用約束。為了在停機時間最短的情況下實現更簡化的在線操作(數據庫在禁用約束時基本上處於“關閉狀態”),可以使用不同的策略,即在臨時表中預加載數據,對其進行驗證,然後使用分區交換機操作,請參閱使用分區切換有效傳輸數據


熱門答案

我認為你使用普通批量插入的真正問題是你需要來自其他表的初始插入的feed ID。這就是我要做的。使用批量插入插入登台表。然後使用存儲過程以基於集合的方式對真實表進行插入。您可以將初始插入中的輸出子句用於提要表,以獲取表變量,其中包含插入其他表所需的提要ID。



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因