我遇到了一些性能瓶頸,我的C#客戶端將批量數據插入到SQL Server 2005數據庫中,我正在尋找方法加快這一進程。在SQL Server中批量插入大量數據的最快方法是什麼(C#客戶端)
我已經在使用SqlClient.SqlBulkCopy(基於TDS)來加速跨線的數據傳輸,這有助於很多,但我仍然在尋找更多。
我有一個簡單的表看起來像這樣:
CREATE TABLE [BulkData](
[ContainerId] [int] NOT NULL,
[BinId] [smallint] NOT NULL,
[Sequence] [smallint] NOT NULL,
[ItemId] [int] NOT NULL,
[Left] [smallint] NOT NULL,
[Top] [smallint] NOT NULL,
[Right] [smallint] NOT NULL,
[Bottom] [smallint] NOT NULL,
CONSTRAINT [PKBulkData] PRIMARY KEY CLUSTERED
(
[ContainerIdId] ASC,
[BinId] ASC,
[Sequence] ASC
))
我在平均約爲300行,其中數據筒和BinId是在每個塊和序列值恆定塊插入數據0-n的並根據主鍵對值進行預先排序。
%磁盤時間性能計數器花了很多時間在100%,所以很明顯磁盤IO是主要問題,但我得到的速度比原始文件副本低幾個數量級。
它是否幫助任何如果我:
- 刪除主鍵,而我做的插入,並重新創建後
- 執行插入到一個臨時表具有相同的架構,並定期將其轉移到主表保持插入正在發生的表的大小小
- 還有其他嗎?
- 根據我得到的答覆,讓我澄清一點:
波特曼:我使用了一個聚集索引,因爲當數據被所有進口我需要訪問數據按順序依次進行。在導入數據時,我並不特別需要索引。在執行插入操作時使用非聚集PK索引有什麼好處,而不是完全放棄導入的約束? Chopeen:數據正在許多其他機器上遠程生成(我的SQL服務器目前只能處理大約10個數據,但我希望能夠添加更多數據)。在本地機器上運行整個過程是不實際的,因爲它將不得不處理50倍的輸入數據來生成輸出。
Jason:我沒有在導入過程中對錶進行任何併發查詢,我會嘗試刪除主鍵,看看是否有幫助。
http://msdn.microsoft.com/en-us/library/ms174335.aspx – JohnB 2010-05-24 18:59:09