2

したがって、プロジェクトには非常に基本的なデータ モデル (.NET 4.0 をターゲットとし、NuGet によってインストールされた EF 5 を使用し、最初にデータベース) があり、Item と ItemGroup の 2 つのテーブルがあります。

Item-table には、文字列と数値の両方のさまざまなフィールドと、ItemGroup を指す外部キーがあります。

一方、ItemGroup には Id、Name、および Code (最後の 2 つは文字列) しかありません。

現在、およそ 50,000 個のアイテムと 100 個のアイテム グループしかありません。context.Items.ToList()SQL プロファイラーを使用してを実行すると、所要時間は約 2 ~ 3 秒で、これは完全に許容範囲です。ただし、を使用して同時に ItemGroups をロードしたい場合、context.Items.Include("ItemGroup").ToList()実行時間は約 12 秒まで跳ね上がります。また、すべてのアイテムをフェッチした後ですべての ItemGroup を単純にフェッチすると、実行時間も非常に長くなります。これにより、時間がかかるのはアイテムをそれぞれのグループにマッピングすることだと思います。

ただし、SQL プロファイラーが非常に単純な INNER JOIN クエリも 10 秒以上かかるとレポートする理由は、これでもまだ説明できません。

私はここで途方に暮れており、これまでこの種の問題に直面したことはなかったので、アドバイスは大歓迎です。

4

1 に答える 1

5

イーガーローディング(インクルード)を使用している場合、データベースからデータベースツリー全体を一度にロードするため、非常に低速です。

ただし、 LinqPadを使用してEFクエリをT-SQLに変換し、SQLServer2008のDatabaseEngineTuning Adviserを使用すると、改善が必要な領域を特定できます。これにより、必要なインデックスキーを特定できます。

Microsoftは、EFのパフォーマンスに関する考慮事項に関する記事も公開しています。

于 2012-12-03T15:31:10.487 に答える