Nó không biết giá trị của các biến sẽ là gì khi nó biên dịch truy vấn. Bạn có thể thử OPTION (RECOMPILE)
.
Tôi cho rằng việc bổ sung AND
mệnh đề trong truy vấn (mặc dù về mặt logic, nó khiến nó không có tính chọn lọc hơn chút nào) phải đánh lừa người tối ưu hóa việc ước tính truy vấn với độ chọn lọc cao hơn, do đó cung cấp cho bạn kế hoạch mà bạn muốn!
Bạn nói trong nhận xét rằng phiên bản không có ExceptionDate = ExceptionDate
được ước tính là 88234.8
hàng và phiên bản có 8823.48
Nói chung, trong trường hợp không có số liệu thống kê có thể sử dụng được thì SQL Server rơi vào trạng thái suy đoán phụ thuộc vào loại toán tử so sánh trong vị từ.
Nó giả định rằng một >
ví dụ, vị từ sẽ trả về 30% số hàng và =
vị từ sẽ trả về 10% số hàng, vì vậy có vẻ như nó chỉ áp dụng điều đó trực tiếp vào kết quả của ước tính đầu tiên. Điều thú vị là nó không tính đến thực tế là các dấu bằng đối với chính cột ở đây!
c.f. Các phương pháp hay nhất để quản lý thống kê - Tránh sử dụng các biến cục bộ trong truy vấn