C# 为大量插入调用DataContext.SubmitChanges()的频率?

C# 为大量插入调用DataContext.SubmitChanges()的频率?,c#,.net,linq-to-sql,submitchanges,C#,.net,Linq To Sql,Submitchanges,在调用SubmitChanges之前,我应该调用多少InsertOnSubmit?我正在添加一个web服务中的数据,该服务一次可以返回数万条记录。web服务周围的包装器类将记录公开为一个IEnumberable集合,以隐藏一个复杂的分块机制 在提交之前,有没有关于我应该积累多少插入内容的指导原则?没有任何“指导原则”。我会说为了效率,你想收集一堆,也许不是10公里,而是100公里?这将大大减少您的DB查询,并且在您构建事务时,不应该消耗太多本地缓存它们的ram 您可能应该使用几个不同的值进行测试

在调用
SubmitChanges
之前,我应该调用多少
InsertOnSubmit
?我正在添加一个web服务中的数据,该服务一次可以返回数万条记录。web服务周围的包装器类将记录公开为一个
IEnumberable
集合,以隐藏一个复杂的分块机制

在提交之前,有没有关于我应该积累多少插入内容的指导原则?

没有任何“指导原则”。我会说为了效率,你想收集一堆,也许不是10公里,而是100公里?这将大大减少您的DB查询,并且在您构建事务时,不应该消耗太多本地缓存它们的ram

您可能应该使用几个不同的值进行测试,并分析性能(内存和速度),以找到适合您的硬件的最佳解决方案。

实际上没有任何“指导原则”。我会说为了效率,你想收集一堆,也许不是10公里,而是100公里?这将大大减少您的DB查询,并且在您构建事务时,不应该消耗太多本地缓存它们的ram


您可能应该使用两个不同的值进行测试,并分析性能(内存和速度),以便为您的硬件找到最佳解决方案。

好吧,我已经使用多个表中的数十万条记录一次性完成了测试。事实上,在这种情况下,为每个InsertOnSubmit()调用SubmitChanges()需要几个小时,而在末尾调用SubmitChanges()将把插入那么多记录所需的时间缩短到几分钟


在我上面描述的例子中,我所做的安排是报告带有标题表、详细信息表(链接到标题)和atom表(链接到详细信息)的表。对于每个标题记录,我都有多个细节表,这些细节表将再次由多个atom记录链接。在某些情况下,我最终会插入数以百万计的记录,它们在最后的一个SubmitChanges()调用中都不会出现问题,而且执行得非常好。

好吧,我在一次操作中使用了跨多个表的数十万条记录,没有问题。事实上,在这种情况下,为每个InsertOnSubmit()调用SubmitChanges()需要几个小时,而在末尾调用SubmitChanges()将把插入那么多记录所需的时间缩短到几分钟


在我上面描述的例子中,我所做的安排是报告带有标题表、详细信息表(链接到标题)和atom表(链接到详细信息)的表。对于每个标题记录,我都有多个细节表,这些细节表将再次由多个atom记录链接。在某些情况下,我最终会插入数以百万计的记录,它们在最后的单个SubmitChanges()调用中都不会出现问题,而且执行得非常好。

这还取决于需要插入的数据类型。有时我需要插入许多记录,其中我还需要的ID,以便在另一个表中插入更多记录

因为ID是在向数据库提交更改时分配的,所以我需要在特定时间调用SubmitChanges

如果不需要这样做,我只需一次提交1000条左右(取决于需要插入的记录总数)


也许你可以做一些速度测试,这对你来说是最好的。取决于硬件、记录数量的期望值等。

它还取决于需要插入的数据类型。有时我需要插入许多记录,其中我还需要的ID,以便在另一个表中插入更多记录

因为ID是在向数据库提交更改时分配的,所以我需要在特定时间调用SubmitChanges

如果不需要这样做,我只需一次提交1000条左右(取决于需要插入的记录总数)


也许你可以做一些速度测试,这对你来说是最好的。根据硬件、记录数量等的预期。

对一批1000条记录的一个字段进行更改与一次更改:一次更改一条记录需要0.1989秒/记录,而批更改一条记录需要0.0711秒/记录。所以在我的测试中,批处理速度大约是3倍。请注意,批量大小在效率上有所不同

submitchanges()一次一条记录
记录秒/记录
1000 198.95 0.1989

批量提交更改()
记录秒/记录百分比变化
100 12.20 0.1220 133%
200 18.33 0.0916 122%
500 37.59 0.0752 106%
1000 71.07 0.0711 103%
2000 138.64 0.0693 102%

10000 680.36 0.0680

对一批1000条记录的一个字段进行更改,而不是一次更改一条记录:一次更改一条记录需要0.1989秒/记录,而批更改一条记录需要0.0711秒/记录。所以在我的测试中,批处理速度大约是3倍。请注意,批量大小在效率上有所不同

submitchanges()一次一条记录
记录秒/记录
1000 198.95 0.1989

批量提交更改()
记录秒/记录百分比变化
100 12.20 0.1220 133%
200 18.33 0.0916 122%
500 37.59 0.0752 106%
1000 71.07 0.0711 103%
2000 138.64 0.0693 102%

10000 680.36 0.0680

关于找回身份证,这是一个很好的观点。我很担心内存占用,因为可能会有一些大的记录,但每次1000条是一个很好的开始。是的,这是我非常讨厌的一件事。有时,每个记录都需要一个新ID,这使您可以通过提交记录来获得良好的性能。这是您需要在代码中弄清楚的,只是为了看看在哪里