Tôi đang gặp sự cố về hiệu suất thú vị với Entity Framework. Tôi đang sử dụng Code First.Vấn đề về hiệu suất khung thực thể
Đây là cấu trúc của các thực thể của tôi:
Một cuốn sách có thể có nhiều đánh giá. Bài đánh giá được liên kết với một cuốn sách. Bài đánh giá có thể có một hoặc nhiều Nhận xét. Nhận xét được liên kết với một đánh giá.
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; }
}
Tôi đã tạo cơ sở dữ liệu với nhiều dữ liệu và thêm chỉ mục thích hợp. Tôi đang cố tải xuống một cuốn sách có 10.000 bài đánh giá về nó bằng cách sử dụng truy vấn này:
var bookAndReviews = db.Books.Where(b => b.BookId == id)
.Include(b => b.Reviews)
.FirstOrDefault();
Cuốn sách cụ thể này có 10.000 bài đánh giá. Hiệu suất của truy vấn này là khoảng 4 giây. Chạy chính xác cùng một truy vấn (thông qua SQL Profiler) thực sự trả về trong thời gian không có ở tất cả. Tôi đã sử dụng cùng một truy vấn và một SqlDataAdapter và các đối tượng tùy chỉnh để lấy dữ liệu và nó xảy ra dưới 500 mili giây.
Sử dụng ANTS Performance Profiler nó trông giống như một số lượng lớn thời gian đang được chi tiêu làm một vài điều khác nhau:
Các Bằng phương pháp đang được gọi là 50 triệu lần.
Có ai biết tại sao cần gọi 50 triệu lần này và làm cách nào để tăng hiệu suất cho việc này?
Bạn có thực sự muốn xem truy vấn nào đang được tạo bởi câu lệnh của bạn hoặc bạn cho rằng đó là truy vấn tối ưu? –
Hãy thử EF Profiler. –
Vấn đề không phải là truy vấn như tôi đã nêu. Tôi lấy truy vấn chính xác mà EF đang tạo ra và sử dụng nó trong một Sql Data Adapter bằng cách sử dụng ADO.net thông thường, tải lên các đối tượng tương tự bằng tay. Nó chạy trong chưa đầy một giây. – Dismissile