Mar*_*ius 16 c# linq ado.net linq-to-sql
我有一个CSV文件,我必须将其插入SQL Server数据库.有没有办法加快LINQ插入?
我创建了一个简单的Repository方法来保存记录:
public void SaveOffer(Offer offer)
{
Offer dbOffer = this.db.Offers.SingleOrDefault (
o => o.offer_id == offer.offer_id);
// add new offer
if (dbOffer == null)
{
this.db.Offers.InsertOnSubmit(offer);
}
//update existing offer
else
{
dbOffer = offer;
}
this.db.SubmitChanges();
}
Run Code Online (Sandbox Code Playgroud)
但是使用这种方法,程序比使用ADO.net SQL插入插入数据要慢得多(新的SqlConnection,新的SqlCommand用于选择是否存在,新的SqlCommand用于更新/插入).
在100k csv行上,ADO.net方式需要大约一个小时,而大约需要1分钟左右.对于2M csv行,ADO.net花了大约20分钟.LINQ在25分钟内增加了大约30,000的2M行.我的数据库有3个表,在dbml中链接,但其他两个表都是空的.测试是在所有表空的情况下进行的.
PS我曾尝试使用SqlBulkCopy,但我需要在将其插入数据库之前对Offer进行一些转换,我认为这违背了SqlBulkCopy的目的.
更新/编辑:18小时后,LINQ版本增加了大约200K行.
我也使用LINQ插件测试了导入,与ADO.net相比也非常慢.我没有看到插入/提交更改和选择/更新/插入/提交更改之间的巨大差异.
我仍然需要尝试批量提交,手动连接到db和编译的查询.
Ale*_*ack 19
SubmitChanges不会批量更改,它会为每个对象执行一次插入语句.如果你想快速插入,我认为你需要停止使用LINQ.
在SubmitChanges正在执行时,启动SQL事件探查器并观察正在执行的SQL.
请参阅问题"LINQ to SQL可以执行批量更新和删除吗?或者它是否总是一次更新一行?" 这里:http://www.hookedonlinq.com/LINQToSQLFAQ.ashx
它链接到这篇文章:http://www.aneyfamily.com/terryandann/post/2008/04/Batch-Updates-and-Deletes-with-LINQ-to-SQL.aspx,它使用扩展方法来修复linq的无法批量插入和更新等
您是否尝试在事务中包装插入和/或延迟db.SubmitChanges以便批量插入几个?
事务通过减少fsync()的需求来帮助吞吐量,并且延迟db.SubmitChanges将减少.NET < - > db往返的数量.
编辑:请参阅http://www.sidarok.com/web/blog/content/2008/05/02/10-tips-to-improve-your-linq-to-sql-application-performance.html以获得更多优化原则.
查看下面的页面,了解如何更改代码以使用批量插入而不是使用LINQ的InsertOnSubmit()函数.
您只需要将(提供的)BulkInsert类添加到代码中,对代码进行一些细微的更改,您就会看到性能的巨大提升.
Mikes知识库 - 使用LINQ进行BulkInserts
祝好运 !