Tôi đang sử dụng Entity Framework 5, ObjectContext và POCO trên lớp truy cập dữ liệu của tôi. Tôi có một thực thi chung chung và tôi có một phương thức truy vấn cơ sở dữ liệu với phân trang bằng cách sử dụng Skip() và Take(). Tất cả mọi thứ hoạt động tốt, ngoại trừ việc thực hiện truy vấn là rất chậm khi bỏ qua rất nhiều hàng (Tôi đang nói về 170K hàng)Khuôn khổ thực thể Bỏ qua phương pháp chạy rất chậm
Đây là một đoạn trích của các truy vấn của tôi trên LINQ to Entities:
C# Mã :
ObjectContext oc = TheOBJEntitiesFactory.CreateOBJEntitiesContext(connection);
var idPred = oc.CreateObjectSet<view_Trans>("view_Trans").AsQueryable();
idPred = idPred.OrderBy(sortColumn, sortDirection.ToLower().Equals("desc"));
var result = idPred.Skip(iDisplayStart).Take(iDisplayLength);
return new PagedResult<view_Trans>(result, totalRecords);
trong truy vấn dịch sang Transact-SQL tôi nhận thấy rằng thay vì sử dụng ROW_NUMBER() khoản với quan điểm trực tiếp của nó làm cho một phụ truy vấn và áp dụng các ROW_NUMBER() các kết quả của tiểu truy vấn ...
dụ:
select top(10) extent1.A, extent1.B.extent1.C from (
select extent1.A, extent1.B, extent1.C,
row_number() OVER (ORDER BY [Extent1].[A] DESC) AS [row_number]
from (
select A,B,C from table as extent1)) as extent1
WHERE [Extent1].[row_number] > 176610
ORDER BY [Extent1].[A] DESC
này mất khoảng 165 giây để hoàn thành. Bất kỳ ý tưởng về cách cải thiện hiệu suất của câu lệnh truy vấn đã dịch?
Vì truy vấn nhanh mà không có sự bỏ qua, điều này cho thấy rằng vấn đề nằm trong SQL, chứ không phải là các lĩnh vực xem xét hiệu suất khác trong khung thực thể. Vì vậy, điều đầu tiên tôi sẽ làm là sử dụng SQL Profiler để chẩn đoán tại sao truy vấn chậm. Bạn đã thử cái này chưa? Bạn đã tìm thấy gì? –
Tôi đã làm điều đó. Tôi nghĩ rằng vấn đề là trong subquery không cần thiết đang được xây dựng bởi Entity Framework, khi tôi thực hiện cùng một truy vấn bằng cách sử dụng LinqToSql thay vì Entity Framework, kết quả không giống nhau và truy vấn nhanh hơn rất nhiều (~ 30 giây). Nếu bạn thấy Sql trong ví dụ trên, có một truy vấn con không cần thiết đối với bảng và row_number không được áp dụng cho bảng, mà là kết quả của truy vấn con đó. – Boanerge
Điều đó không thực sự trả lời câu hỏi của tôi. Truy vấn con bạn đổ lỗi xuất hiện trong rất nhiều truy vấn EF mà không cần 165s để hoàn thành. SQL Profiler sẽ cung cấp cho bạn thông tin cụ thể hơn. Cái gì, chính xác, đang gây ra 165s? –