我有一个 CSV 文件,我必须将其插入 SQL Server 数据库。有没有办法加快 LINQ 插入速度?
我创建了一个简单的存储库方法来保存记录:
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 用于选择(如果存在)、新的 SqlCommand 用于更新/插入)插入数据要慢得多。
对于 100k csv 行,大约需要一个小时,而 ADO.net 方式则需要 1 分钟左右。对于 2M csv 行,ADO.net 花费了大约 20 分钟。 LINQ 在 25 分钟内添加了大约 30k 的 2M 行。我的数据库有 3 个表,在 dbml 中链接,但其他两个表是空的。测试是在所有桌子都是空的的情况下进行的。
附:我尝试过使用 SqlBulkCopy,但在将 Offer 插入数据库之前我需要对 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.hookedonlinq.com/LINQToSQLFAQ.ashx
它链接到这篇文章:http://www.aneyfamily.com/terryandann/post/2008/04/Batch-Updates-and-Deletes-with-LINQ-to-SQL.aspx http://www.aneyfamily.com/terryandann/post/2008/04/Batch-Updates-and-Deletes-with-LINQ-to-SQL.aspx使用扩展方法来修复 linq 无法批量插入和更新等问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)