加速LINQ插入

Mar*_*ius 16 c# linq ado.net linq-to-sql

我有一个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();
    }
Run Code Online (Sandbox Code Playgroud)

但是使用这种方法,程序比使用ADO.net SQL插入插入数据要慢得多(新的SqlConnection,新的SqlCommand用于选择是否存在,新的SqlCommand用于更新/插入).

在100k csv行上,ADO.net方式需要大约一个小时,而大约需要1分钟左右.对于2M csv行,ADO.net花了大约20分钟.LINQ在25分钟内增加了大约30,000的2M行.我的数据库有3个表,在dbml中链接,但其他两个表都是空的.测试是在所有表空的情况下进行的.

PS我曾尝试使用SqlBulkCopy,但我需要在将其插入数据库之前对Offer进行一些转换,我认为这违背了SqlBulkCopy的目的.

更新/编辑:18小时后,LINQ版本增加了大约200K行.

我也使用LINQ插件测试了导入,与ADO.net相比也非常慢.我没有看到插入/提交更改和选择/更新/插入/提交更改之间的巨大差异.

我仍然需要尝试批量提交,手动连接到db和编译的查询.

Ale*_*ack 19

SubmitChanges不会批量更改,它会为每个对象执行一次插入语句.如果你想快速插入,我认为你需要停止使用LINQ.

在SubmitChanges正在执行时,启动SQL事件探查器并观察正在执行的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的无法批量插入和更新等

  • @ Alex,@ Kirk和@Marius,我找不到任何修复第二篇文章批量插入的实现(批量更新和删除...).你可以请点亮一下吗?它做批量更新和删除,但我迫切需要批量插入.使用SqlBulkCopy非常棒,但是在我的链接表中使用插入后我的自动身份字段(PK)的手动同步/跟踪对于大量表来说是非常痛苦的.任何建议将不胜感激 (4认同)
  • @DiogoCid 8年前我写这条消息的链接确实有效. (2认同)

Eam*_*nne 7

您是否尝试在事务中包装插入和/或延迟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以获得更多优化原则.


Mik*_*ill 6

查看下面的页面,了解如何更改代码以使用批量插入而不是使用LINQ的InsertOnSubmit()函数.

您只需要将(提供的)BulkInsert类添加到代码中,对代码进行一些细微的更改,您就会看到性能的巨大提升.

Mikes知识库 - 使用LINQ进行BulkInserts

祝好运 !