实体框架性能不一致



我有一个方法在我的MVC应用程序,是使用实体框架插入调查的结果。这项调查有大约70个问题,所有的结果都会在SaveChanges的一个电话中插入。

// mock code
public class SurveyService {
    public SurveyService(MyDbContext db) { ... }
    public void SaveSurvey(...) {
        foreach(var result in results) {
            db.Results.Add(new Result(...));
        }
        db.SaveChanges();
    }
}

我没有在循环中调用SaveChanges。只需要添加一堆实体,做一次SaveChanges。代码不是特别慢,但是每次INSERT大约需要20毫秒。当你有70个实体,加起来是1.4秒。

我可以在LinqPad中使用这个非常相同的类(使用程序集创建连接)并执行以下操作:

// in linqpad this refers to the context
var survey = new SurveyService(this);
survey.SaveSurvey(...);

使用完全相同的web。配置,指向相同的数据库并保存相同的结果,每个保存大约需要2-3毫秒。我已经检查了更改跟踪器,在上下文中没有任何差异,它使用的是完全相同的代码,所以我不确定开销在哪里。我添加了数据库日志记录,并且可以非常一致地看到,在应用程序中运行时,查询速度要慢10倍左右。

是什么原因导致性能不一致?

Rick Stahl在http://weblog.west-wind.com/posts/2013/Dec/22/Entity-Framework-and-slow-bulk-INSERTs上讨论了类似的问题,他认为问题在于ef中的变更跟踪机制,并提出了一些解决这些问题的方法

最新更新