Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Tại sao truy vấn này không sử dụng chỉ mục thích hợp?

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sử dụng lại trường bí danh trong câu lệnh SQL SELECT

  2. Đầu tiên tạo các thủ tục được lưu trữ bằng cách sử dụng mã khung thực thể?

  3. Cách thay thế các giá trị (null) bằng đầu ra 0 trong PIVOT

  4. Cách thực thi một trình kích hoạt chỉ khi một cột cụ thể được cập nhật (SQL Server)

  5. Tham số đầu ra thủ tục đã lưu trữ trả về @Value