Tôi đang khám phá trình tối ưu hóa trong SQL Server, đặc biệt là biểu đồ và tôi thấy một số kết quả lạ.
Nếu tôi thực hiện truy vấn bên dưới, nơi tôi biết không có biểu đồ trên trường, SQL Server sẽ đưa ra ước tính hàng bằng với kết quả thực tế. Nếu tôi chạy cùng một truy vấn mà tôi sử dụng DECLARE @i NUMERIC(19,2) = 30.0
thay vì hằng số WHERE [Rate] < @i
, thì ước tính là 94.8
như tôi mong đợi cho truy vấn được hiển thị do cơ sở dữ liệu không có số liệu thống kê về trường.
Vì vậy, câu hỏi của tôi là tại sao SQL Server xuất ra kết quả chính xác khi nó không có số liệu thống kê về lĩnh vực này?
Khi tắt AUTO_CREATE_STATISTICS
như được chỉ ra bởi câu trả lời của tôi, tôi gặp một số hành vi kỳ lạ trên các ước tính hàng.
Một ràng buộc tồn tại trên bảng giới hạn [Rate]
ở giữa 6.5 - 200.0
. Các ước tính thay đổi rất nhiều khi thử nghiệm tùy thuộc vào việc >
được sử dụng hay >=
cũng như 24.0
hoặc 64
các truy vấn định dạng trong đó vị từ hiển thị một chuyển đổi ngụ ý sang loại money
.
Đối với WHERE [Rate] > 6.5
ước tính là 28.44
sau đó dừng lại ở mức giá trên 100
.
Đối với WHERE [Rate] > 7
trường hợp số thập phân được loại trừ, 28.44
ước tính sẽ chạy hết cỡ255
Đối với WHERE [Rate] >= 6.5
các 28.44
ước tính chạy lên đến khoảng 100
sau đó thay đổi để 17.7764
lên đến 1000
trước khi ước tính giảm xuống còn 1.
Vì vậy, dường như không có nhiều sự nhất quán. Có vẻ như SQL Server nhận thức được các ràng buộc dựa trên một số truy vấn tôi đang thử nghiệm, nhưng đôi khi nó cũng bỏ qua sự hiện diện của nó.