2

我有一个代码:

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 秒)。

我的代码有什么问题?

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

4

2 回答 2

2

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

我写了几篇关于这个的文章,你可以在这里这里阅读。

所有这一切的结果是您希望减少 EF 正在跟踪的东西的数量(通过使用 .AsNoTracking 或通过减少调用检测更改)并且您的查询应该是好的和快速的。

于 2012-12-18T20:24:28.043 回答
0

通过OPTION(RECOMPILE)在查询末尾使用解决

于 2012-12-19T02:47:30.030 回答