Tôi có một truy vấn với nhiều kế hoạch thực hiện, bộ nhớ được cấp cho một kế hoạch là rất lớn so với kế hoạch thứ hai
dựa trên bài viết này https://bloss.msdn.microsoft.com/sql_server_team/addressing-large-memory-grant-requests-from-optimized-nested-loops/
Sự cố xảy ra khi bảng ngoài của phép nối Nested Loop có một biến vị ngữ lọc kết quả thành một đầu vào nhỏ, nhưng sắp xếp theo lô có vẻ như đang sử dụng ước tính cho số lượng thẻ tương đương với toàn bộ bảng bên ngoài. Điều này có thể dẫn đến việc cấp bộ nhớ quá mức mà trong một máy chủ rất đồng thời có thể có một số tác dụng phụ, như điều kiện OOM, áp lực bộ nhớ cho việc xóa bộ nhớ cache của gói hoặc chờ đợi RESOURCE_SEMAPHORE. Chúng tôi đã thấy làm thế nào một truy vấn duy nhất phù hợp với mẫu này thực sự có thể nhận được vài GB bộ nhớ được cấp trên các máy cao cấp (1TB + RAM).
Một tùy chọn cho đến bây giờ sẽ là vô hiệu hóa tính năng này trên toàn cầu bằng cách sử dụng Trace Flag 2340, như được mô tả trong KB 2801413. Tuy nhiên, trong SQL Server 2016 RC0, chúng tôi đã thay đổi hành vi để duy trì lợi thế của tối ưu hóa, nhưng hiện tại giới hạn cấp tối đa được dựa trên trên không gian cấp bộ nhớ có sẵn. Cải tiến này cũng chuyển thành khả năng mở rộng tốt hơn, theo nghĩa có thể thực hiện nhiều truy vấn hơn với dung lượng bộ nhớ nhỏ hơn. Chúng tôi đang xem xét chuyển lại hành vi này sang hành vi sắp tới đã chuyển hành vi này sang SQL Server 2014 Service Pack 2 và như thường lệ cung cấp giá trị gia tăng cho các phiên bản trên thị trường.
Đây chính xác là những gì tôi đang thấy tuy nhiên tôi đang sử dụng SQL Server 2016 Enterprise.
Đây là những kế hoạch thực hiện
https://www.brentozar.com/pastetheplan/?id=SJ0mYAy0b
https://www.brentozar.com/pastetheplan/?id=BJzutC1R-
Câu hỏi của tôi là
Lý do cho 2 kế hoạch thực hiện là gì?
Trình tối ưu hóa đang sử dụng kế hoạch thực hiện hàng đầu, tôi buộc nó phải sử dụng kế hoạch thấp hơn nhưng sau đó đôi khi nó lại quay trở lại kế hoạch hàng đầu, lý do nào cho điều đó?
Làm thế nào để khắc phục vấn đề này? Vấn đề này khiến ứng dụng bị sập (có nhiều
RESOURCE_SEMAPHORE
chờ đợi và ứng dụng trở nên không phản hồi)? Tôi nên sử dụng gợi ý:DISABLE_OPTIMIZED_NESTED_LOOP
hayTrace Flag 2340
?LƯU Ý: Tôi đã kiểm tra XML và cả hai gói đều có
NestedLoops Optimized="false"