我有一个 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 用于选择(如果存在)、新的 SqlCommand 用于更新/插入)插入数据要慢得多。
在 100k csv 行上大约需要一个小时,而对于 ADO.net 方式则需要 1 分钟左右。对于 2M csv 行,ADO.net 花费了大约 20 分钟。 LINQ 在 25 分钟内添加了 200 万行中的大约 30k。我的数据库有 3 个表,链接在 dbml 中,但其他两个表是空的。测试是在所有表都是空的情况下进行的。
附言我曾尝试使用 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 无法批量插入和更新等问题。
关于c# - 加速 LINQ 插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1328683/