Tôi có một truy vấn chạy dài (bảng thực tế với 100 triệu hàng tham gia một số bảng mờ nhỏ sau đó được nhóm theo) đang tràn sang tempdb, mặc dù (sau khi điều chỉnh) CE rất gần với số lượng hàng thực tế, hãy xem kế hoạch :
Tìm kiếm một lời giải thích, tôi nhận thấy thông tin cấp bộ nhớ sau:
Môi trường: SQL Server 2012 SP1 Enterprise, RAM máy chủ 256 GB, bộ nhớ tối đa SQL Server 200 GB, kích thước vùng đệm 42 GB, kích thước tối đa không gian làm việc 156 GB (GrantedMemory = 156 * 25% ~ = 38 GB)
Câu hỏi
- điều đó có nghĩa là cho dù CE tốt đến đâu, truy vấn không có cơ hội không tràn ra? vì ram tối đa truy vấn được giới hạn ở mức 38 GB
- trình tối ưu hóa truy vấn không xem xét tối đa ram truy vấn khi xây dựng kế hoạch? (buộc tổng hợp Hash Match sẽ loại bỏ bước sắp xếp và cải thiện đáng kể hiệu năng truy vấn, thật không may, truy vấn thực tế đến từ Cognos và chúng tôi không kiểm soát được nó)
- sẽ tăng giới hạn 25% lên gần 100% có phải là một lựa chọn hợp lý ở đây không? (giả sử rằng quyền truy cập máy chủ nói trên có thể được kiểm soát để giới hạn số lượng yêu cầu truy vấn đồng thời)
Gói truy vấn ẩn danh tại Paste The Plan
Khi buộc tổng hợp khớp băm (thay vì tổng hợp sắp xếp + luồng), truy vấn sẽ hoàn thành nhanh hơn 3 - 4 lần. Thật không may, truy vấn thực tế đến từ Cognos và chúng tôi không có cách nào để thay đổi nó.
Không có sự cố tràn băm trong kế hoạch tổng hợp băm. Trình tối ưu hóa truy vấn sẽ không chọn tổng hợp khớp băm vì nếu tôi xem chi phí vận hành cho tổng hợp băm so với tổng hợp luồng, chi phí CPU của nhóm băm cao gấp 2 - 3 lần so với tổng hợp luồng.
Trong cả tổng hợp luồng và hàm băm, các hàng đầu ra ước tính hoàn toàn giống với đầu vào (~ 100 triệu hàng).
Truy vấn sử dụng một chỉ mục cột NC duy nhất và tất cả các số liệu thống kê cột được cập nhật thường xuyên.