Khi tôi làm, dbcc show_statistics ('Reports_Documents', PK_Reports_Documents)
tôi nhận được kết quả sau cho Báo cáo ID 18698:
Đối với truy vấn này:
SELECT *
FROM Reports_Documents
WHERE ReportID = 18698 option (recompile)
Tôi nhận được một kế hoạch truy vấn làm cho Tìm kiếm chỉ mục cụm PK_Reports_Documents
như mong đợi.
Nhưng điều gây trở ngại cho tôi là giá trị không chính xác cho Số lượng hàng ước tính:
Theo đó :
Khi truy vấn mẫu giá trị mệnh đề WHERE bằng với giá trị biểu đồ RANGE_HI_KEY, SQL Server sẽ sử dụng cột EQ_lawS trong biểu đồ để xác định số lượng hàng bằng
Đây cũng là cách tôi mong đợi, tuy nhiên dường như không phải như vậy trong cuộc sống thực. Tôi cũng đã thử một số RANGE_HI_KEY
giá trị khác có trong biểu đồ được cung cấp bởi show_statistics
và trải nghiệm tương tự. Vấn đề này trong trường hợp của tôi dường như khiến một số truy vấn sử dụng các kế hoạch thực hiện không tối ưu dẫn đến thời gian thực hiện trong vài phút trong khi tôi có thể khiến nó chạy trong 1 giây với một gợi ý truy vấn.
Tất cả trong tất cả: Ai đó có thể giải thích cho tôi tại sao EQ_ROWS
từ biểu đồ không được sử dụng cho Số lượng hàng ước tính và ước tính không chính xác đến từ đâu?
Một chút thông tin (có thể hữu ích):
- Tự động tạo số liệu thống kê được bật và tất cả các số liệu thống kê được cập nhật.
- Bảng được truy vấn có khoảng 80 triệu hàng.
PK_Reports_Documents
là một PK kết hợp bao gồmReportID INT
vàDocumentID CHAR(8)
Truy vấn dường như tải tổng cộng 5 đối tượng thống kê khác nhau, tất cả đều chứa ReportID
+ một số cột khác từ bảng. Họ đã được cập nhật mới. RANGE_HI_KEY
trong bảng dưới đây là giá trị cột ràng buộc trên cao nhất trong biểu đồ.
+-------------------------------------------------------------------------+----------+--------------+--------------+---------------------+--------------+------------+----------+---------------------+----------------+
| name | stats_id | auto_created | user_created | Leading column Type | RANGE_HI_KEY | RANGE_ROWS | EQ_ROWS | DISTINCT_RANGE_ROWS | AVG_RANGE_ROWS |
+-------------------------------------------------------------------------+----------+--------------+--------------+---------------------+--------------+------------+----------+---------------------+----------------+
| PK_Reports_Documents | 1 | 0 | 0 | Stationary | 18722 | 0 | 2228,526 | 0 | 1 |
| _dta_index_Reports_Documents_42_1629248859__K1_K63_K14_K13_K22_K23_72_6 | 62 | 0 | 0 | Stationary | 18698 | 0 | 2228,526 | 0 | 1 |
| _dta_stat_1629248859_1_1_59 | 76 | 0 | 1 | Stationary | 18686 | 50,56393 | 1 | 0 | 13397,04 |
| _dta_stat_1629248859_1_22_14_18_12_6 | 95 | 0 | 1 | Stationary | 18698 | 0 | 2228,526 | 0 | 1 |
| _dta_stat_1629248859_1_7_14_4_23_62 | 96 | 0 | 1 | Stationary | 18698 | 56,63327 | 21641,5 | 0 | 14526,44 |
+-------------------------------------------------------------------------+----------+--------------+--------------+---------------------+--------------+------------+----------+---------------------+----------------+
sp_updatestats
được lên kế hoạch để chạy mỗi đêm để cập nhật số liệu thống kê.
_dta_
số liệu thống kê, họ đã ở đó kể từ khi tôi có cái nhìn đầu tiên về DB. Tôi không biết sử dụng các đề xuất có thể có tác dụng phụ như vậy mặc dù ...