Gần đây tôi đã chuyển mô hình thực thể của mình từ một ObjectContext sử dụng 4.1 sang DbContext bằng 5.0. Tôi bắt đầu hối tiếc vì tôi nhận thấy một số hiệu suất rất kém trên truy vấn bằng cách sử dụng DbContext vs ObjectContext. Đây là kịch bản thử nghiệm:DbContext Hiệu suất truy vấn kém so với ObjectContext
Cả hai ngữ cảnh đều sử dụng cùng một cơ sở dữ liệu với khoảng 600 bảng. LazyLoading và ProxyCreation được tắt cho cả hai (không được hiển thị trong ví dụ mã). Cả hai đều có lượt xem được tạo trước.
Lần kiểm tra đầu tiên thực hiện 1 cuộc gọi để tải lên vùng làm việc siêu dữ liệu. Sau đó, trong vòng lặp for được thực hiện 100 lần, tôi mới tạo ra một ngữ cảnh và thực hiện một cuộc gọi đầu tiên. 10. Tôi đang tạo ngữ cảnh bên trong vòng lặp for bởi vì mô phỏng này được sử dụng trong dịch vụ WCF. bối cảnh mỗi lần)
for (int i = 0; i < 100; i++)
{
using (MyEntities db = new MyEntities())
{
var a = db.MyObject.Take(10).ToList();
}
}
Khi tôi chạy điều này với ObjectContext mất khoảng 4,5 giây. Khi tôi chạy nó bằng DbContext, nó mất khoảng 17 giây. Tôi đã lược tả điều này bằng cách sử dụng trình biên dịch hiệu suất của RedGate. Đối với DbContext có vẻ như thủ phạm chính là một phương thức gọi là UpdateEntitySetMappings. Điều này được gọi trên mọi truy vấn và xuất hiện để truy xuất metadataworkspace và chuyển qua tất cả các mục trong không gian OS. AsNoTracking không giúp được gì.
EDIT: Để cung cấp cho một số chi tiết tốt hơn, vấn đề phải làm với việc tạo \ khởi tạo của một DbSet vs một ObjectSet, không phải là truy vấn thực tế. Khi tôi thực hiện cuộc gọi với ObjectContext, phải mất trung bình 42ms để tạo ObjectSet. Khi tôi thực hiện cuộc gọi với DbContext, phải mất khoảng 140ms để tạo dbset nội bộ. Cả hai ObjectSet và DbSet thực hiện một số thực thể lập bản đồ tra cứu từ metadataworkspace. Những gì tôi đã nhận thấy là DbSet hiện nó cho tất cả các loại trong không gian làm việc trong khi ObjectSet thì không. Tôi đoán (chưa thử nó) rằng một mô hình có ít bảng hơn sự khác biệt về hiệu suất là ít hơn.