Tôi có một số người cảm ơn vì bản cập nhật gần đây cho SQL Sentry Plan Explorer. Brooke Philpott (@Macromullet) và Greg Gonzalez (blog | @SQLsensei), tất nhiên, cho R &D và để đào sâu mã và phân loại nó ra. Nhưng cũng gửi đến Paul White (blog | @SQL_kiwi) vì đã kiên trì giúp chúng tôi xác thực các bản sửa lỗi.
Vấn đề mà Paul đã phát hiện ra là SQL Server 2008+ làm xáo trộn các ước tính về bản số trên các truy vấn nhất định khi có liên quan đến việc tra cứu khóa hoặc RID. Tôi sẽ giải thích sâu hơn cho bài đăng trên blog của Paul và lỗi mà anh ấy đã gửi trên Connect, nhưng ngắn gọn là chúng tôi đang sử dụng những ước tính bị sai lệch này, tin rằng chúng và ngoại suy chúng để hiển thị cho bạn thông tin "tốt hơn". Thật không may, như Paul giải thích, chúng tôi đã bị lừa.
Paul hiển thị truy vấn sau đối với một bản sao của AdventureWorks 2005.
SELECT th.ProductID, th.TransactionID, th.TransactionDate FROM Production.TransactionHistory AS th WHERE th.ProductID = 1 AND th.TransactionDate BETWEEN '20030901' AND '20031231';
Management Studio đưa ra kế hoạch sau, giống như Paul đã mô tả:
Trong Plan Explorer, chúng tôi đã cố gắng hữu ích bằng cách nhân số hàng ước tính (làm tròn thành 17) với số lần thực thi (45) và đưa ra 765:
Đối với hầu hết các toán tử, cách tiếp cận này mang lại dữ liệu phù hợp, nhưng do lỗi này trong SQL Server, nó không chính xác đối với tra cứu khóa / RID. Chúng tôi đã điều chỉnh điều đó và phát hành bản sửa lỗi thích hợp trong 7.2.42.0 (tải xuống ngay bây giờ!). Sơ đồ đồ họa hiện hiển thị đúng số lượng hàng chính xác cho cả hai ước tính:
Và thực tế:
Tôi sẽ nhắc lại lời cảnh báo của Paul: Hãy coi chừng các ước lượng về bản số kém khi một vị từ được áp dụng như một phần của tra cứu.
Có một số vấn đề phức tạp hơn gây ra bởi những ước tính sai lệch này, mà chúng tôi cũng đã giải quyết. Tôi sẽ viết blog về một vài trong số đó trong một bài đăng tiếp theo - đối với bài đăng này, tôi chỉ muốn chứng minh rằng chúng tôi đã nhanh chóng giải quyết vấn đề cụ thể mà Paul đã nêu bật trong bài đăng của anh ấy.