EF Core 2.2をEF Core 3.0にアップグレードした後、大きなパフォーマンスの問題に直面しています。単一のコレクションナビゲーションプロパティと数百のフィールドを持つ単純なデータモデルを想像してみてください(現実はさらに暗く見えます)。
public class Item
{
[Key]
public int ItemID {get;set;}
public ICollection<AddInfo> AddInfos {get;set;}
... // consisting of another 100+ properties!
}
そして
public class AddInfo
{
[Key]
public int AddInfoID {get;set;}
public int? ItemID {get;set;}
public string SomePayload {get;set;}
}
アイテムの取得中、次のようにクエリを実行します。
...
var myQueryable = this._context.Items.Include(i => i.AddInfos).Where(**some filter**);
... // moar filters
var result = myQueryable.ToList();
この時点まで、まっすぐ進みます。
EF 2.2では、クエリ可能な結果をフェッチすることで、2つの個別のクエリ(1つItem
はAddInfo
-レベル用)を取得します。これらのクエリは通常10.000 items
と約250.000をフェッチしAddInfos
ます。
ただし、EF Core 3.0では、単一のクエリが生成されているため、 一見すると左側のクエリに結合AddInfo
するItem
方が適切なオプションのようです。私たちは、Item
しかし、なぜ小さいクラスまたは匿名型に投影しているすべての100+フィールド、(.Select(...)への呼び出しを追加する-法)に取得する必要が現実的ではありません。したがって、結果セットには冗長性があり(それぞれItem
約25回)、クエリ自体が許容時間内に実行するには時間がかかりすぎます。
EF-Core 3.0 には、データモデルを大幅に変更することなく、古き良きEF Core 2.2のクエリ動作に戻すことができるオプションがありますか?アプリケーションの他の部分でのこの変更からすでに利益を得ていますが、この特定のシナリオでは利益がありません。
よろしくお願いします!
更新
さらなる調査の後、私は、この問題は既にマイクロソフトでadressedされることを見出し、ここで、箱のうち、分割されたクエリの実行を設定する方法はないように思えます。