Chăm sóc hiệu suất:
Tôi đã trải nghiệm rằng ít nhất với EF Core , các câu trả lời khác nhau được đưa ra ở đây có thể dẫn đến hiệu suất khác nhau. Tôi biết rằng OP đã hỏi về Linq với SQL, nhưng dường như với tôi cũng có những câu hỏi tương tự xảy ra với EF Core.
Trong một trường hợp cụ thể mà tôi phải xử lý, đề xuất (tốt hơn về mặt cú pháp) của Marc Gravell đã dẫn đến các kết nối trái trong một ứng dụng chéo - tương tự như những gì Mike U mô tả - kết quả là chi phí ước tính cho truy vấn cụ thể này là hai cao gấp nhiều lần so với truy vấn không có tham gia chéo . Thời gian thực hiện của máy chủ khác nhau theo hệ số 3 . [1]
Giải pháp của Marc Gravell đã dẫn đến một truy vấn mà không tham gia chéo.
Bối cảnh: Về cơ bản, tôi cần phải thực hiện hai phép nối trái trên hai bảng, mỗi bảng lại yêu cầu nối với bảng khác. Hơn nữa, ở đó tôi phải chỉ định các điều kiện khác trên các bảng mà tôi cần để áp dụng phép nối trái. Ngoài ra, tôi đã có hai tham gia bên trong trên bàn chính.
Dự toán chi phí vận hành:
- với áp dụng chéo: 0,2534
- không áp dụng chéo: 0,0991.
Thời gian thực hiện của máy chủ tính bằng ms (các truy vấn được thực hiện 10 lần; được đo bằng cách sử dụng THỐNG KÊ THỜI GIAN BẬT):
- áp dụng chéo: 5, 6, 6, 6, 6, 6, 6, 6, 6, 6
- không áp dụng chéo: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
(Lần chạy đầu tiên chậm hơn đối với cả hai truy vấn; dường như có gì đó được lưu trong bộ nhớ cache.)
Kích thước bảng:
- bảng chính: 87 hàng,
- bảng đầu tiên cho tham gia trái: 179 hàng;
- bảng thứ hai cho tham gia trái: 7 hàng.
Phiên bản EF Core: 2.2.1.
Phiên bản SQL Server: MS SQL Server 2017 - 14 ... (trên Windows 10).
Tất cả các bảng có liên quan chỉ có các chỉ mục trên các khóa chính.
Kết luận của tôi: luôn luôn nên xem xét SQL được tạo vì nó thực sự có thể khác nhau.
[1] Thật thú vị, khi đặt 'Thống kê máy khách' trong MS SQL Server Management Studio, tôi có thể thấy một xu hướng ngược lại; cụ thể là lần chạy cuối cùng của giải pháp mà không áp dụng chéo mất hơn 1 giây. Tôi cho rằng có gì đó không ổn ở đây - có thể với thiết lập của tôi.