1

当涉及在 ARRAY 对象中插入大量数据(例如 100.000 行)时,您认为哪一个会更快?

  1. 通过实体框架?(SaveChanges()当你插入 100.000 行时调用)
  2. INSERT使用存储过程循环每一行(100.000 次) ?

如果您还可以提供参考,那将是非常棒的。

谢谢

4

3 回答 3

3

循环 100K 次调用存储过程将至少创建 100K 跨进程和/或跨网络调用会很慢。

如果您使用的是 SQL 服务器,另一种选择是使用 TVP(表值参数)来避免在 C# 代码的循环中调用 insert。它允许您在一次调用中将数据表传递给存储过程。

从上面的链接中,他们建议一次 1000 行(但始终为您的应用测量和试验):

使用表值参数与使用基于集合的变量的其他方式相当;但是,对于大型数据集,经常使用表值参数会更快。与启动成本高于表值参数的批量操作相比,表值参数在插入少于 1000 行时表现良好。

所以,也许尝试循环 100 次,一次通过 1000 行(而不是越过边界 100K 次)。

您可能还想重新评估为什么 asp.net 在您的应用程序中一次有 10 万个项目。是否会因为可能存在内存问题而立即传递到服务器并保存在内存中?那能拆吗?您是否在 asp.net 正在读取和处理 100K 行的情况下进行数据处理,而 sql server 代理作业可能更合适?如果您提供有关应用程序数据流及其功能的更多详细信息,人们可能会提供更多选择。

于 2012-12-04T12:35:23.790 回答
2

实际上最快的方法是使用 SqlBulkCopy 对象,该对象正是为这种情况而设计的

于 2013-09-06T12:59:36.810 回答
1

存储过程会更快。实体框架没有批处理,因此除了访问数据库 10 万次之外,您还要承受 EF 的性能开销。对于这类东西,Raw ado 将比 ORM 更快。

这是一些比较的链接http://blog.staticvoid.co.nz/2012/03/entity-framework-comparative.html 它在比较中没有原始的 ado.net,但 dapper 是您将看到的最接近的速度。

于 2012-12-04T13:12:13.287 回答