一些查询后实体框架变慢

时间:2012-12-18 10:49:20

标签: c# entity-framework asp.net-mvc-4

我有一个代码:

foreach (var idObject in ids)
{
    var parsedIDs = ParseId(idObject.id);

    var integers = new Dictionary<string, int>() { { "model_id", model }, { "year", 2010 }, { "quarter", 1 }, { "month", 1 }, { "rows", rows }, { "page", page } };
    var strings = new Dictionary<string, string>() { { "gr_str", "" }, { "row_id", "" }, { "sidx", sidx }, { "sord", sord } };
    var additionals = new Dictionary<string, object>() { { "rowid", idObject.id },
                                {"contr_group_id_e", parsedIDs[0]},
                                {"nomencl_group_set1_id_e", parsedIDs[1]},
                                {"nomencl_group_set2_id_e", parsedIDs[2]},
                                {"workshop_id_e", parsedIDs[3]},
                                {"unit_meas_id_e", parsedIDs[4]},
                                {"plant_id_e", parsedIDs[5]} };

    foreach (var datePair in queryDates)
    {
        additionals["begin_date_e"] = datePair.Key;
        additionals["end_date_e"] = datePair.Value;

        var parameters = InitParams(integers, strings, additionals).ToArray();

        var lastTimestamp = DateTime.Now;

        var queryResults = ModelEntities.ExecuteStoreQuery<ReadyProductIndexes>(Queries.SaleIndexGetRowByID, "Sale", MergeOption.NoTracking, parameters).ToList();

        Debug.WriteLine("TIme: " + (DateTime.Now - lastTimestamp).TotalSeconds);
    }

    Debug.WriteLine("rowid " + idObject.id);
}

有一个问题 - 在第一个foreach步骤中一切正常,但在第二个和其他查询开始工作非常慢(例如第一步为0.2秒,第二步为8秒)。 / p>

我的代码出了什么问题?

编辑:我尝试使用MS SQL分析器,并且有一些有趣的事情 - Profiler显示8秒的请求持续时间,但当我尝试手动运行Profiler的请求时,它会运行快速。这很奇怪。

2 个答案:

答案 0 :(得分:2)

我认为这里的问题很常见,因为你的EF上下文增长,查询需要花费更长的时间。这是因为检测更改(在大多数EF操作上运行)枚举当前由EF跟踪的每个对象。这意味着如果您跟踪数千个实体,则可能需要相当长的时间。从您的代码示例中可以看出这个问题的位置有点难以理解,但它非常适合该模式。我建议您查看DbSet上的.Local集合,以确认跟踪了很多项目。

我写了几篇文章,你可以阅读herehere

所有这一切的结果是你想要减少EF正在跟踪的东西(通过使用.AsNoTracking或通过调用detect更改来减少),你的查询应该很好而且快速。

答案 1 :(得分:0)

在查询结尾处使用OPTION(RECOMPILE)解决