在同一个表中更新具有不同值的多个记录时,EF 6的性能

时间:2016-06-06 08:34:51

标签: c# entity-framework

我有一个表,其值是基于条件更新的,当我调用

// use distinct to get the user id's list
var userIds = db.users.distinct("_id", { "DateRegister": { "$gt": new Date(2015, 11, 31) } })

// perform your aggregation with a filtered collection using the list from the above operations
db.items.aggregate([
    { "$match": { "IdUser": { "$in": userIds } } },
    {
        "$group": {
            "_id": "$IdUser",
            "count": { 
                "$sum": { "$cond": [{ "$gt": [ "$IdItem", null ] }, 1, 0 ] } 
            }            
        }
    },
    {
        "$group": {
            "_id": "$count",
            "users": { "$push": "$_id" }            
        }
    },
    {
        "$project": {
            "_id": 0, 
            "number_of_items": "$_id", 
            "number_of_users": { "$size": "$users" } 
        }
    }
])

性能下降很大。

我也在设置属性

db.SaveChanges()

仍然没有预期的结果。

编辑1:

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

2 个答案:

答案 0 :(得分:1)

不幸的是,您无法通过Entity Framework和SaveChanges获得良好的性能。

SaveChange为每次记录更新进行数据库往返。因此,如果您目前拥有10,000个帐户,则会执行10k数据库往返。

设置AutoDetectChangesEnabled和ValidateOnSaveEnabled通常是一个非常糟糕的主意,并且不会真正提高性能,因为数据库往返次数是真正的问题。

免责声明:我是该项目的所有者Entity Framework Extensions

此库允许通过执行以下操作来显着提高性能:

  • BulkSaveChanges
  • BulkInsert
  • BulkUpdate
  • BulkDelete
  • BulkMerge

示例:

using(var db= new MyEntities())
{
    foreach(var acc in myacclist)
    {
        //will update my account objects here
    }

    db.BulkSaveChanges();
}

答案 1 :(得分:0)

在字符串构建器中构建更新查询并为每1k记录保存它可以提高我的性能

using (var db = new MyEntities())
{
     StringBuilder finalquery = new StringBuilder();
     int i = 0;
     foreach (var acc in myacclist)
     {
       i++;
       //will update my account objects here
       finalquery.Append(stmnt);
       if (1 % 1000 = 0) { db.Database.ExecuteSqlCommand(finalquery.ToString()); }
      }

      db.SaveChanges();
 }