【问题标题】:How to improve the Update operation performance in Entity Framework 6如何提高 Entity Framework 6 中的更新操作性能
【发布时间】:2018-10-15 10:21:46
【问题描述】:

我们正在尝试在单次提交中更新 20000 条记录,这需要 30 多分钟。我们正在考虑减少记录数并实施将提交 1000 条记录的批处理过程。任何人都可以提供提高性能的建议吗?

【问题讨论】:

  • 你的代码是什么?我认为原来的 Ef 6 不支持批量插入或更新。他们有扩展来做批量更新。
  • @isaeid ,我们有'for each'循环来更新记录。我们将设置要更新的最大记录数。
  • 其实他们没有。有扩展,但它们没有 - 它们是第三方。
  • 如果我禁用 'AutoDetectChangesEnabled = false;'选项,它会帮助我吗? @TomTom
  • 它会使内部处理更快。它不会避免“一件件插入,与所有其他物品分开,完全等待退货”。错误的工具。 EF6 从未用于批量插入 - 将其用于那些插入就像试图只用刀子做一个平均数。专门的工具!=“将它用于一切”。

标签: c# performance entity-framework c#-4.0 entity-framework-6


【解决方案1】:

默认情况下,EF 为单个更新执行 1 次查询。您可以编写接受表值参数的存储过程,从而使用单个查询更新多行,从而减少往返开销。 同样对于批量插入,您可以使用 SqlBulkCopy 类。

更新:或者您可以使用 3rd 方库来执行此操作。 https://entityframework-plus.net/?z=ef-extended 和 https://entityframework-extensions.net/ 之类的东西,我还使用 simple wrapper 而不是 SqlBulkCopy 进行批量插入。

Update2:来自 Microsoft 如何使用表值参数的示例:https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/table-valued-parameters 适用于 ADO.Net,但使用 EF 也可以使用类似的方法。

【讨论】:

  • 我们不能使用第三方库
  • 那么你应该编写存储过程来一次更新所有值。该过程将在单个表值参数处接受多行并在 T-SQL 中执行批量更新代码
  • @vanapandiNarayanan 更新了 Microsoft 示例的链接
【解决方案2】:

您可以使用存储过程或使用 Ef 扩展,例如请参阅https://entityframework-plus.net/batch-update。

【讨论】:

  • 我认为这是 SP 有史以来最糟糕的用例之一。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-07
  • 1970-01-01
  • 1970-01-01
  • 2014-11-11
  • 2017-07-06
  • 2015-03-23
相关资源
最近更新 更多