4

〜 20K レコードを取得し、2 つの子エンティティを含める単純な EF 実装があります。

using (InsightEntities context = new InsightEntities())
{
   return context.Accounts
   .Include(x => x.Division)
   .Include(x => x.Division.Company)
   .OrderBy(x => x.ID)
   .AsNoTracking()
   .ToList();
}

SQL プロファイラーを使用して EF 呼び出しをプロファイリングすると、後続の呼び出しであっても、SQL コマンドの実行時間は ~1.2 秒です。しかし、EF が生成しているのと同じ SQL をコピーして貼り付け、SSMS を介して直接実行すると、所要時間はその半分になります。

以下は、EF 呼び出し (赤い楕円) と直接呼び出し (緑の楕円) のスクリーンショットです。

ここに画像の説明を入力

EF がデータをオブジェクトにマッピングしたり、リレーションシップを解釈したりするなど、多くの作業を行っていることは理解していますが、クエリだけで、同じクエリを直接実行するよりも 2 倍の時間がかかるのはなぜでしょうか? クエリを最適化する可能性のある既定の EF 接続文字列への変更はありますか?

(クエリ自体は、すべての外部キーのインデックスで完全に最適化されていることを付け加えておきます。)

ありがとうございました!

4

2 に答える 2

1

インクルード ステートメントは速度低下を引き起こすことが知られています。正確な理由はわかりません。インクルード ステートメントをコメント アウトして、代わりに遅延読み込みを使用してみてください。同じ結論の別の SO 記事を次に示し ます。生成されたクエリに 1/2 秒しかかからないのに、Entity Framework がレコードの読み込みに 30 秒かかるのはなぜですか?

于 2013-08-21T17:48:29.483 に答える