Bật MARS chỉ cần thiết nếu bạn muốn thực hiện nhiều truy vấn trên cùng một kết nối song song. Điều này xảy ra nếu bạn làm điều gì đó như sau:
/* Foreach uses an iterator over the resultset of your query, but the query is not fetched
immediately, instead the iterator internally triggers fetching for single
processed record from opened data reader. Because of that the query and the reader
are active until the iteration is over. */
foreach (var department in context.Departments.Where(...))
{
/* The first query is still active on the connection but now you are executing
lazy loading of all related employees =>. You are executing a second query and,
without MARS, you will get an exception. */
var employee = department.Employees.FirstOrDefault(...);
}
Làm cách nào để tránh điều đó?
- Sử dụng tải háo hức thay vì tải lười biếng:
context.Departments.Include(d => d.Employees)
- Materialise kết quả toàn bộ bộ phận của thiết trước khi sử dụng tải lười biếng. Nó có nghĩa là không truy cập vào nhân viên bên trong vòng lặp.
- Enable MARS và các ví dụ đề cập sẽ chỉ đơn giản là làm việc
Đây có phải là cách được đề nghị? Điều này có ảnh hưởng xấu đến hiệu suất/ tôi nên tìm kiếm điều gì?
Tùy thuộc vào sự cố bạn đang cố giải quyết. Nếu bạn có nhiều phòng ban để xử lý, việc truy cập vào bộ sưu tập nhân viên của họ sẽ kích hoạt một truy vấn riêng biệt cho từng bộ phận. Đó được gọi là N + 1 vấn đề - bạn có N phòng ban và một truy vấn để lấy chúng và cho mỗi bộ phận bạn sẽ thực hiện một truy vấn bổ sung => N + 1 truy vấn. Đối với một số lượng lớn các phòng ban này sẽ là một kẻ giết người hiệu suất.
Tải ứng dụng không phải là giải pháp chống đạn. Nó có thể affect performance as well. Đôi khi bạn chỉ cần thực hiện các truy vấn riêng biệt để tìm nạp tất cả các phòng ban cần thiết và các truy vấn riêng biệt để tìm nạp tất cả các nhân viên cần thiết. Nếu bạn có tải chậm tắt nó nên sửa chữa quan hệ của bạn và điền vào tài sản nhân viên một cách chính xác cho bạn. Btw, tôi đã thực hiện một suggestion on Data UserVoice để hỗ trợ tính năng này ra khỏi hộp.
Nguồn
2012-05-07 09:05:41
Cảm ơn bạn. Tôi đã hy vọng bạn sẽ nhận thấy bài đăng này. Bình chọn cho đề xuất của bạn trên Data UserVoice. –
Để tham khảo trong tương lai cũng biết rằng ** song song chỉ ở cấp mã **. Từ tài liệu MSDN * MARS cho phép thực thi xen kẽ nhiều yêu cầu trong một kết nối duy nhất. Nghĩa là, nó cho phép chạy hàng loạt và trong quá trình thực thi, nó cho phép các yêu cầu khác thực hiện. Tuy nhiên, lưu ý rằng MARS được xác định theo dạng xen kẽ, không phải về mặt thực thi song song. * Https://msdn.microsoft.com/en-us/library/ms131686.aspx – PedroC88