加快LINQ插入
我有一个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();
}
但是使用这种方法,使用ADO.net SQL插入(新的SqlConnection,新的SqlCommand用于选择if存在,新的SqlCommand用于更新/插入),插入数据的速度要慢得多。
对于ADO.net,100k csv行大约需要1个小时,而1分钟左右。 对于2M csv行,ADO.net花了大约20分钟。 LINQ在25分钟内为这2M行添加了约30K。 我的数据库有3个表,链接在dbml中,但其他两个表都是空的。 所有的表都是空的。
PS我尝试过使用SqlBulkCopy,但是我需要在Offer中进行一些转换,然后将其插入到数据库中,并且我认为这打破了SqlBulkCopy的目的。
更新/编辑:18小时后,LINQ版本增加了约20万行。
我已经使用LINQ插入测试了导入,并且与ADO.net相比也非常慢。 我没有看到插入/提交更改和选择/更新/插入/提交更改之间的巨大差异。
我仍然必须尝试批量提交,手动连接到数据库和编译查询。
SubmitChanges不批量更改,它为每个对象执行单个插入语句。 如果你想快速插入,我认为你需要停止使用LINQ。
在SubmitChanges正在执行时,启动SQL Profiler并观察正在执行的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知识库 - BulkInserts与LINQ
祝你好运 !
链接地址: http://www.djcxy.com/p/60277.html下一篇: Trigger that inserts into linked table causing an error