2010-07-14 66 views
3

我需要將大量數據插入到SqlServer 2008中。我的項目基於linq-to-sql。是否可以使用linq-to-sql插入大量數據?

我用100.000行處理csv文件。每行都映射到Order對象。 Order還包含CategoryCode對象的集合。我需要將每一行映射到對象以驗證它。

然後我需要將所有這些對象插入到數據庫中。

List<Order> orders = Import("test.csv"); 
db.Orders.InsertAllOnSubmit(orders); 
db.SubmitChanges(); 

OR 

foreach(Order order in orders) 
db.Orders.InsertOnSubmit(order); 
db.SubmitChanges(); 

兩種方式都很慢。有什麼解決方法嗎?我可以使用其他方法而不是l2sql來完成這項任務。

我讀了關於SqlBulkCopy類 - 它會處理插入子實體以及?

回答

2

嘗試使用較小的交易。

foreach(List<Order> orderbatch in orders.Batch(100)) 
{ 
    db.Orders.InsertOnSubmit(orderbatch); 
    db.SubmitChanges(); 
} 


public static IEnumerable<List<T>> Batch<T>(this IEnumerable<T> source, int batchAmount) 
{ 
    List<T> result = new List<T>(); 
    foreach(T t in source) 
    { 
    result.Add(t); 
    if (result.Count == batchSize) 
    { 
     yield return result; 
     result = new List<T>(); 
    } 
    } 
    if (result.Any()) 
    { 
    yield return result; 
    } 
} 
+0

如果你打算使用這種解決方案,你可以試着按聚集索引進行排序。如果您沒有插入每批可能會重新排序所有以前的行。或者它可能不是,但這是你需要注意的事情。 – 2010-07-14 15:00:39

+0

@Mike兩頁分裂與熱點...一如既往 - 衡量,衡量,衡量。 – 2010-07-14 16:43:42

+0

我接受了這個答案。然而EntityFramework的速度要快幾倍。另一方面,我應該使用SqlBulkCopy,但它不處理子實體。 – jlp 2010-08-04 08:48:44

0

這個CSV閱讀器是真的快給我:http://www.codeproject.com/KB/database/CsvReader.aspx

但是,是的,如果你可以選擇只使用SQL Server的批量複製操作會更快。

LINQ to SQL沒有批量更新功能,我知道...你必須迭代。

HTH。

+0

我使用CsvReader來讀取csv文件並映射到對象。主要問題是如何快速將100.000個對象插入數據庫。 – jlp 2010-07-14 14:24:31

+0

用於批量插入的sql工具是最好的,使用sqlbulkcopy或使用SSIS導入,也有批量工具。工作非常快。 – 2010-07-14 16:39:20

2

As @Brian指出,LINQ to SQL不會執行批量插入,但this blog談到了離開它來工作。

作者似乎自從我第一次閱讀它(自2008年)以來添加了代碼。

+0

我試過了,它工作的很快,但它不插入子實體。 – jlp 2010-07-15 09:43:58

0

我認爲最好是按組插入對象,例如1000個對象,然後處理會話。

此處的性能在兩個邊緣之間保持平衡:一邊保存所有100,000個對象在內存中導致的內存過度使用,以及在另一邊創建會話和重新連接數據庫的時間。

順便說一下,session.InsertAllOnSubmit(data)和foreach(var i在數據中)session.Insert(i)之間沒有顯着差異。

相關問題