EntityFrameworkで興味深いパフォーマンスの問題が発生しています。私はCodeFirstを使用しています。
これが私のエンティティの構造です:
ブックには多くのレビューを含めることができます。レビューは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件のレビューがある1冊の本を取得しようとしています。
var bookAndReviews = db.Books.Where(b => b.BookId == id)
.Include(b => b.Reviews)
.FirstOrDefault();
この特定の本には10,000件のレビューがあります。このクエリのパフォーマンスは約4秒です。(SQLプロファイラーを介して)まったく同じクエリを実行すると、実際にはすぐに返されます。同じクエリとSqlDataAdapterおよびカスタムオブジェクトを使用してデータを取得しましたが、500ミリ秒未満で発生します。
ANTS Performance Profilerを使用すると、時間の大部分がいくつかの異なることを行うために費やされているように見えます。
Equalsメソッドは5000万回呼び出されています。
なぜこれを5000万回呼び出す必要があるのか、そしてどうすればこれのパフォーマンスを向上させることができるのか誰かが知っていますか?