大规模插入的LINQ-to-SQL性能问题

时间:2010-06-30 10:44:15

标签: c# linq-to-sql c#-4.0 datacontext

我在申请中发现了一个问题;基本上,一个子例程准备(批量)数据,这些数据稍后通过LINQ-to-SQL数据上下文插入到我的本地数据库中。但是,在调用SubmitChanges()时,即使是相对适度数量的新数据(100,000-ish)也需要花费大量时间保存到数据库中。但是,大多数情况下,应用程序更有可能节省大约200,000到300,000行。

根据SQL Server的分析器,所有生成的查询都如下所示,并且应用程序插入的每个项目都有一个查询。

exec sp_executesql N'INSERT INTO [dbo].[AdjectivesExpanded]([Adjective], [Genus], [Casus], [SingularOrPlural], [Kind], [Form])
VALUES (@p0, @p1, @p2, @p3, @p4, @p5)

SELECT CONVERT(BigInt,SCOPE_IDENTITY()) AS [value]',N'@p0 bigint,@p1 char(1),@p2 tinyint,@p3 bit,@p4 tinyint,@p5 nvarchar(4000)',@p0=2777,@p1='n',@p2=4,@p3=0,@p4=3,@p5=N'neugeborener'

有没有人知道如何使用LINQ-to-SQL数据上下文提高大量插入的性能,理想情况下没有去除stronlgy类型的DataContext并回退到手写查询本身?此外,调整底层数据库的机会或空间很小。如果有的话,我可以禁用完整性约束,如果有帮助的话。

3 个答案:

答案 0 :(得分:3)

有关如何更改代码以使用批量插入的简单演练,请查看以下页面。

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

Mikes Knowledge Base - BulkInserts with LINQ

答案 1 :(得分:2)

你在做这样的事情:

foreach (var adjective in adjectives) {
    dataContext.AdjectivesExpanding.InsertOnSubmit(adjective)
    dataContext.SubmitChanges();
}

或者:

foreach (var adjective in adjectives) {
    dataContext.AdjectivesExpanding.InsertOnSubmit(adjective);
}
dataContext.SubmitChanges();

如果它与第一个类似,我建议将其改为第二个。每次调用SubmitChanges都会查看所有跟踪的对象,以查看更改的内容。

无论哪种方式,我都不相信插入那些项目是Linq-to-Sql的好主意,因为它每次都必须生成和评估SQL。

您可以编写存储过程的脚本并为设计器添加DataContext方法吗?

答案 2 :(得分:2)

对于大规模运营来说,ORM通常不是一个好主意。我建议使用旧式散装插件以获得最佳性能。