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ステップではすべてが正常に機能しますが、2番目のクエリと他のクエリの動作が非常に遅くなり始めました(たとえば、最初のステップで0.2秒、2番目のステップで8秒)。

私のコードの何が問題になっていますか?

編集:私はMS SQLプロファイラーを使おうとしましたが、興味深いことがいくつかあります-プロファイラーは8秒間のリクエストを表示しますが、プロファイラーからリクエストを手動で実行しようとすると、高速に実行されます。それ、変だよ。

4

2 に答える 2

2

ここでの問題はかなり一般的なものだと思います.EFコンテキストが大きくなると、クエリに指数関数的に時間がかかります. これは、変更の検出 (ほとんどの EF 操作で実行される) が、現在 EF によって追跡されているすべてのオブジェクトを列挙するためです。これは、何千ものエンティティを追跡している場合、かなりの時間がかかることを意味します。この問題がどこにあるのかコードサンプルから判断するのは少し難しいですが、パターンに非常によく適合します。DbSets の .Local コレクションを調べて、追跡されているアイテムが多数あることを確認することをお勧めします。

これについていくつかの記事を書きました。ここここで読むことができます。

これらすべての結果として、 (.AsNoTracking を使用するか、detect changes less を呼び出すことによって) EF が追跡するものの量を減らしたいと考えており、クエリは素晴らしく高速である必要があります。

于 2012-12-18T20:24:28.043 に答える
0

OPTION(RECOMPILE)クエリの最後に使用して解決

于 2012-12-19T02:47:30.030 に答える