số liệu thống kê được cập nhật, nhưng ước tính không chính xác


12

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:

nhập mô tả hình ảnh ở đây

Đố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_Documentsnhư 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:

nhập mô tả hình ảnh ở đây

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_KEYgiá trị khác có trong biểu đồ được cung cấp bởi show_statisticsvà 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_ROWStừ 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_Documentslà một PK kết hợp bao gồm ReportID INTDocumentID 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_KEYtrong 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ê.

Câu trả lời:


10

Có một giải pháp đơn giản cho việc này:

Bỏ tất cả các _dta_...số liệu thống kê và ngừng áp dụng mù quáng các khuyến nghị DTA.

Thêm thông tin

Vấn đề cụ thể là có nhiều bộ thống kê cho cột được đề cập. Số dtaliệu thống kê bổ sung được tạo bằng cách lấy mẫu dữ liệu (hành vi mặc định cho số liệu thống kê không được liên kết với chỉ mục).

Như thường thấy với các thống kê được lấy mẫu, biểu đồ kết quả không bao gồm toàn bộ phạm vi của dữ liệu không trả lời. Truy vấn trong câu hỏi đã xảy ra để chọn một giá trị nằm ngoài biểu đồ, dẫn đến ước tính 1 hàng.

Hành vi chính xác của trình tối ưu hóa truy vấn khi tồn tại nhiều bộ thống kê cho cùng một cột không được ghi lại đầy đủ. Nó không có xu hướng thích thống kê 'quét toàn bộ' hơn so với lấy mẫu, nhưng nó cũng thích các số liệu thống kê được cập nhật gần đây hơn các thống kê cũ hơn.


Điều này thực sự làm việc. Tuy nhiên tôi đã không tạo ra _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ù ...
user1151923
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.