当涉及在 ARRAY 对象中插入大量数据(例如 100.000 行)时,您认为哪一个会更快?
- 通过实体框架?(
SaveChanges()
当你插入 100.000 行时调用) INSERT
使用存储过程循环每一行(100.000 次) ?
如果您还可以提供参考,那将是非常棒的。
谢谢
当涉及在 ARRAY 对象中插入大量数据(例如 100.000 行)时,您认为哪一个会更快?
SaveChanges()
当你插入 100.000 行时调用)INSERT
使用存储过程循环每一行(100.000 次) ?如果您还可以提供参考,那将是非常棒的。
谢谢
循环 100K 次调用存储过程将至少创建 100K 跨进程和/或跨网络调用会很慢。
如果您使用的是 SQL 服务器,另一种选择是使用 TVP(表值参数)来避免在 C# 代码的循环中调用 insert。它允许您在一次调用中将数据表传递给存储过程。
从上面的链接中,他们建议一次 1000 行(但始终为您的应用测量和试验):
使用表值参数与使用基于集合的变量的其他方式相当;但是,对于大型数据集,经常使用表值参数会更快。与启动成本高于表值参数的批量操作相比,表值参数在插入少于 1000 行时表现良好。
所以,也许尝试循环 100 次,一次通过 1000 行(而不是越过边界 100K 次)。
您可能还想重新评估为什么 asp.net 在您的应用程序中一次有 10 万个项目。是否会因为可能存在内存问题而立即传递到服务器并保存在内存中?那能拆吗?您是否在 asp.net 正在读取和处理 100K 行的情况下进行数据处理,而 sql server 代理作业可能更合适?如果您提供有关应用程序数据流及其功能的更多详细信息,人们可能会提供更多选择。
实际上最快的方法是使用 SqlBulkCopy 对象,该对象正是为这种情况而设计的
存储过程会更快。实体框架没有批处理,因此除了访问数据库 10 万次之外,您还要承受 EF 的性能开销。对于这类东西,Raw ado 将比 ORM 更快。
这是一些比较的链接http://blog.staticvoid.co.nz/2012/03/entity-framework-comparative.html 它在比较中没有原始的 ado.net,但 dapper 是您将看到的最接近的速度。