我有一个代码:
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的请求时,它会运行快速。这很奇怪。
答案 0 :(得分:2)
我认为这里的问题很常见,因为你的EF上下文增长,查询需要花费更长的时间。这是因为检测更改(在大多数EF操作上运行)枚举当前由EF跟踪的每个对象。这意味着如果您跟踪数千个实体,则可能需要相当长的时间。从您的代码示例中可以看出这个问题的位置有点难以理解,但它非常适合该模式。我建议您查看DbSet上的.Local集合,以确认跟踪了很多项目。
所有这一切的结果是你想要减少EF正在跟踪的东西(通过使用.AsNoTracking或通过调用detect更改来减少),你的查询应该很好而且快速。
答案 1 :(得分:0)
在查询结尾处使用OPTION(RECOMPILE)
解决