gpt4 book ai didi

c# - 加速 LINQ 插入

转载 作者:可可西里 更新时间:2023-11-01 03:03:50 27 4
gpt4 key购买 nike

我有一个 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com