【问题标题】:Stored Procedures Using Entity Framework for large inserts/updates使用实体框架进行大型插入/更新的存储过程
【发布时间】:2016-01-14 18:31:39
【问题描述】:

我正在使用实体框架来调用存储过程。我有一个场景,这个过程被调用了 3000 次,然后对于这 3000 个存储过程调用中的每一个,另一个存储过程将被调用 1 到 100 次。总共需要大约20分钟。我想把时间减半。我可以做些什么来优化它吗?

基本上是这样的:

foreach (var parentObject in parents) //parents.count = 3000
{
   int id = _efContext.prInsertParent(parentObject.Name, parentObject.values, etc..);

   // Have to get SCOPE_IDENTITY() id to be able to add children
   foreach (var child in parentObject.Children) //children count up to 100 items
   {
       _efContext.prInsertChild(id, etc..othervalues);
   }
}

【问题讨论】:

  • 就个人而言,我会重新考虑架构。 3000 次存储过程调用不应该是可接受的,而且在受到额外 100 次调用的指数影响时更是如此。那么,最坏的情况是 300,000 次调用?

标签: c# entity-framework stored-procedures bulkinsert


【解决方案1】:

正如我在评论中所说,我会重新考虑您的架构。

  1. 考虑利用数据库的力量。将数据插入到临时表中,然后处理它。例如,为父子关系使用临时 GUID。
  2. 使用一些大容量复制机制,例如 NuGet 提供的 EntityFramework.BulkInsert,甚至是 .Net 框架中的标准 SqlBulkCopy 类型。

【讨论】:

    【解决方案2】:

    当您插入数据时......数据必须以一种或另一种方式获取...... 我会尝试在插入之前将这些设置为 false.. 看看你得到了什么。

      Configuration.AutoDetectChangesEnabled = false;
      Configuration.ValidateOnSaveEnabled = false;
    

    【讨论】:

    • 这些配置不只适用于实际实体(POCO)吗?我只是调用存储过程
    • 你是对的.. 我想知道在插入上花费的时间最多的地方。假设您必须通过网络驱动它?它是短暂的时间吗..您可以尝试将所有数据猛击成某种字节数组并压缩它并将其作为参数发送..然后让另一边的SP解开它并在那里进行所有插入..(假设您的数据库 sp 可以处理这些事情..
    • 我不确定您是否希望在您的应用中维护结构和 ID 的帖子插入
    【解决方案3】:

    我最终使用了一个用户定义的表来允许我传入多行来进行批量插入。把我的时间减半。我很满意。 :)

    基本上是这样的:

    http://www.c-sharpcorner.com/blogs/bulk-insert-into-table-using-userdefined-table-type1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-30
      相关资源
      最近更新 更多