加快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

上一篇: Speed up LINQ inserts

下一篇: Trigger that inserts into linked table causing an error