Entity Frameworkで興味深いパフォーマンス問題が発生しています。私はコードファーストを使用しています。Entity Frameworkパフォーマンスの問題
私のエンティティの構造は次のとおりです。
本は多くのレビューを持つことができます。 レビューは1つのブックに関連付けられています。 レビューには、1つまたは複数のコメントを付けることができます。 コメントは1つのレビューに関連付けられています。
public class Book
{
public int BookId { get; set; }
// ...
public ICollection<Review> Reviews { get; set; }
}
public class Review
{
public int ReviewId { get; set; }
public int BookId { get; set; }
public Book Book { get; set; }
public ICollection<Comment> Comments { get; set; }
}
public class Comment
{
public int CommentId { get; set; }
public int ReviewId { get; set; }
public Review Review { get; set; }
}
多くのデータがデータベースに格納され、適切なインデックスが追加されました。私は、このクエリを使用してそれに関する10,000のレビューを持っている単一の本を取得しようとしています:
var bookAndReviews = db.Books.Where(b => b.BookId == id)
.Include(b => b.Reviews)
.FirstOrDefault();
この本は10,000件のレビューがあります。このクエリのパフォーマンスは約4秒です。まったく同じクエリを(SQLプロファイラを介して)実行すると、実際にはまったく時間がかかりません。私は同じクエリとSqlDataAdapterとカスタムオブジェクトを使用してデータを取得し、500ミリ秒以下で発生します。
Equalsメソッドが50万回と呼ばれている:時間の大部分は、いくつかの異なるものをやって費やされているようにANTSパフォーマンスプロファイラの使用
はそれが見えます。
誰もがこの50万回を呼び出す必要がある理由を知っていますか、これに対してどのようにパフォーマンスを向上させることができますか?
実際には、どのクエリが生成されているか、または最適なクエリであると想定していますか。 –
EF Profilerを試してみてください。 –
問題は私が述べたようなものではありません。私は、EFが生成している正確なクエリを使用して、通常のADO.netを使用してSQLデータアダプタで使用し、同じオブジェクトを手動でロードしました。それは1秒未満で実行されます。 – Dismissile