2011-10-19 51 views
5

Tôi đã có một vài tháng kinh nghiệm làm việc với Entity Framework và chủ yếu là viết một tấn truy vấn dữ liệu truy vấn LINQ chống lại nó. Tôi đến từ một nền sql nặng, và đang cố gắng để tối ưu hóa một số sql cho hiệu suất và khả năng đọc nếu tôi đang cố gắng để gỡ lỗi các vấn đề hiệu suất.Entity Framework Truy vấn Tối ưu hóa

Tôi nhận thấy một số các sql tạo làm những việc như thế này cho một tableA với các cột {col1, col2, col3}

select 
    Extent1.col1 
from 
(
    select col1, col2, col3 from tableA 
) AS Extent1 

Câu hỏi của tôi là, làm thế nào để ngăn chặn nó làm các bảng này có nguồn gốc vô dụng và thay vào đó chỉ cần

select col1 from tableA 

nơi cần thiết? Tôi dường như không thể hiểu tại sao đôi khi nó lại xảy ra và đôi khi nó không ...

+0

Tôi muốn nghe suy nghĩ của người khác; nhưng tôi nghĩ đây chỉ là một trong những điểm thu hút của việc sử dụng EF (cũng như các ORM khác?). Bạn mất rất nhiều quyền kiểm soát đối với SQL thực tế được tạo ra và SQL được tạo ra thường khá tệ. – CodingGorilla

+0

có thể trùng lặp của [Cải thiện truy vấn được tạo từ khung thực thể] (http://stackoverflow.com/questions/7418675/improve-query-generated-from-entity-framework) –

Trả lời

4

Bạn đã so sánh kế hoạch thực hiện truy vấn thực tế của truy vấn được tạo với cách bạn sẽ tối ưu hóa nó? Bạn có thể ngạc nhiên trước kết quả, tôi biết tôi là như vậy. Và tôi đã có được sự tôn trọng sâu sắc đối với các nhà phát triển trong nhóm máy chủ SQL, người dường như đang làm một công việc tuyệt vời để làm cho một truy vấn phụ tối ưu thực hiện giống như vậy.

Tôi muốn được nghe nếu trải nghiệm của bạn khác với trải nghiệm của tôi; Tôi đã ngừng tìm cách thay đổi các truy vấn được tạo ra bởi vì đối với mọi truy vấn tôi đã thử xem xét, không có sự khác biệt thực sự nào về hiệu suất.

EDIT: tuyên bố cuối cùng của tôi là không hoàn toàn đúng, có chắc chắn N + 1 tình huống mà bạn phải coi chừng, và bất kỳ hoạt động hàng loạt (cập nhật, xóa và chèn nhiều hồ sơ vào cùng thời gian) sẽ không có hiệu suất ngay cả khi viết một truy vấn bằng tay do bản chất làm việc với các bản ghi riêng lẻ. Nhưng các phần mở rộng không liên quan về cơ bản bị loại bỏ bởi trình tối ưu hóa truy vấn SQL Server.

+0

Xin chào Joel, nói chung bạn là chính xác, nhưng tôi có một vài truy vấn khó chịu thực sự có khoảng 300 dòng dài làm điều này "vô dụng có nguồn gốc bảng" kinh doanh nhiều lần trong suốt. Lấy truy vấn đó và chỉ đơn giản là thay thế các bảng có nguồn gốc với lựa chọn trực tiếp tiếp theo của họ từ bảng đối tác có một truy vấn rất lớn như thế từ 7 giây xuống dưới 1 giây .... vì vậy tôi đồng ý với bạn cho hầu hết các phần, nhưng cố gắng tìm làm thế nào tôi có thể tối ưu hóa tốt hơn linq của tôi để tôi không chạy vào vấn đề này. – Zom

+0

@Isamu: Nói chung nếu bạn có thể làm cho truy vấn LINQ của bạn đơn giản hơn, thì SQL cũng trở nên đơn giản hơn. Có rất nhiều kỹ thuật để làm điều này, nhưng không có bất kỳ mã nào để xem xét ở nơi đầu tiên, rất khó để đưa ra lời khuyên cụ thể. Là> hiệu suất tăng 7x bạn đang báo cáo là kết quả trực tiếp của việc xóa các cột không cần thiết khỏi mã do EF tạo ra hay bạn đang thực hiện các phép biến đổi phức tạp hơn? – StriplingWarrior

+1

Tôi giả sử bạn đã tính toán truy vấn bộ nhớ đệm khi bạn kiểm tra sự khác biệt về hiệu suất ... Có một bài đăng blog trên blog của nhóm EF (http://blogs.msdn.com/b/adonet/archive/2011/07/ 25/generated-sql-improvements-for-tpt-queries.aspx) mở để phản hồi về các vấn đề cụ thể liên quan đến cải tiến hiệu suất cho SQL được tạo. Bài đăng cụ thể đó nói về những cải tiến mà họ đã thực hiện khi xử lý phân cấp thừa kế lớp bảng mỗi loại trong bản phát hành gần đây nhất. –

Các vấn đề liên quan