2011-03-02 33 views
2

我已經得到了我加載到使用這種方法使用LINQ到SQL中的SQL Server 2005數據庫(僞代碼)一些文本數據:我可以用Linq-to-SQL做一個非常大的插入嗎?

Create a DataContext 

While (new data exists) 
{ 
    Read a record from the text file 

    Create a new Record 

    Populate the record 

    dataContext.InsertOnSubmit(record); 
} 

dataContext.SubmitChanges(); 

的代碼是一個小C#控制檯應用程序。到目前爲止,這工作正常,但我即將導入真實數據(而不是測試子集),並且這包含大約200萬行而不是我測試過的1000行。我將不得不做一些聰明的批處理或類似的東西,以避免代碼崩潰或表現悲慘,或者Linq-to-SQL應該如何妥善處理?

+2

您知道.net具有BCP功能。 – 2011-03-02 10:47:44

+0

@Ash。不,謝謝你的高舉!我最初嘗試使用SSIS,但它破壞了數據,所以我手動完成。我會看看BCP。 – 2011-03-02 10:52:00

回答

7

它看起來像這樣會工作,但DataContext保留的更改(以及內存)將隨每個InsertOnSubmit一起增長。也許建議每100條記錄執行一次SubmitChanges?

我還會看看SqlBulkCopy,看看它是否更適合您的用例。

3

你會想要調用SubmitChanges()每1000條記錄左右刷新更改,否則你會用完內存。

如果您需要性能,您可能需要繞過Linq-To-SQL並轉而使用System.Data.SqlClient.SqlBulkCopy。

5

如果你需要做批量插入,你應該檢查出SqlBulkCopy

LINQ到SQL是不是真的適合做大規模的批量插入。

1

只是爲了記錄我做了marc_s和彼得建議並分塊的數據。它並不是特別快(調試配置需要大約一個半小時,附帶調試器和相當多的控制檯進度輸出),但它完全適合我們的需求:

Create a DataContext 

numRows = 0; 
While (new data exists) 
{ 
    Read a record from the text file 

    Create a new Record 

    Populate the record 

    dataContext.InsertOnSubmit(record) 

    // Submit the changes in thousand row batches 
    if (numRows % 1000 == 999) 
     dataContext.SubmitChanges() 

    numRows++ 
} 

dataContext.SubmitChanges() 
+1

再一次只是爲了記錄:用SqlBulkCopy你可以在短短几分鐘內做到這一點......我在不到一個小時的時間內完成了8000萬條記錄,並且在不到一小時的時間內(在開發中,在筆記本上......) – Pleun 2011-03-03 09:11:35

+0

@ Pleun,感謝您的信息。我已經使用Linq-to-SQL編寫了加載器,所以我非常希望不必將其重寫,因爲速度是可以接受的。下次我會用SqlBulkCopy來做,因爲這顯然是更好的方法。 – 2011-03-03 09:34:54

相關問題