Tại sao SQL Server từ chối cập nhật các số liệu thống kê này với bất cứ điều gì ngoài fullscan?


13

Tôi nhận thấy một hoạt động thống kê cập nhật tự động tương đối dài (20 phút +) trong bản dựng cơ sở dữ liệu hàng ngày. Bảng liên quan là

CREATE TABLE [dbo].[factWebAnalytics](
    [WebAnalyticsId] [bigint] IDENTITY(1,1) NOT NULL,
    [MarketKey] [int] NOT NULL CONSTRAINT [DF_factWebAnalytics_MarketKey]  DEFAULT ((-1)),
    /*Other columns removed*/
 CONSTRAINT [PK_factWebAnalytics] PRIMARY KEY CLUSTERED 
(
    [MarketKey] ASC,
    [WebAnalyticsId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [MarketKeyPS]([MarketKey])
) ON [MarketKeyPS]([MarketKey])

Điều này đang chạy trên Microsoft SQL Server 2012 (SP1) - 11.0.3513.0 (X64) vì vậy các chỉ mục kho lưu trữ có thể ghi không có sẵn.

Bảng chứa dữ liệu cho hai khóa Market riêng biệt. Bản dựng chuyển phân vùng cho một MarketKey cụ thể sang bảng phân tầng, vô hiệu hóa chỉ mục của cột, thực hiện ghi cần thiết, xây dựng lại kho lưu trữ cột, sau đó chuyển lại.

Kế hoạch thực hiện cho các thống kê cập nhật cho thấy rằng nó lấy ra tất cả các hàng từ bảng, sắp xếp chúng, nhận được số lượng hàng ước tính sai và tràn đến tempdbmức tràn 2.

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

Đang chạy

SELECT [s].[name] AS "Statistic",
       [sp].*
FROM   [sys].[stats] AS [s]
       OUTER APPLY sys.dm_db_stats_properties ([s].[object_id], [s].[stats_id]) AS [sp]
WHERE  [s].[object_id] = OBJECT_ID(N'[dbo].[factWebAnalytics]'); 

trình diễn

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

Nếu tôi rõ ràng thử và giảm kích thước mẫu của số liệu thống kê của chỉ số đó xuống số liệu thống kê được sử dụng bởi những người khác với

UPDATE STATISTICS [dbo].[factWebAnalytics] [PK_factWebAnalytics] WITH SAMPLE 897667 ROWS

Truy vấn chạy trong 20 phút + một lần nữa và kế hoạch thực hiện cho thấy nó đang xử lý tất cả các hàng không phải là mẫu 897.667 được yêu cầu.

Các số liệu thống kê được tạo ở cuối tất cả những điều này không thú vị lắm và dường như không đảm bảo thời gian dành cho việc quét toàn bộ.

Statistics for INDEX 'PK_factWebAnalytics'.
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Name                            Updated                         Rows                            Rows Sampled                    Steps                           Density                         Average Key Length              String Index                    
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
PK_factWebAnalytics             Jan 22 2016 11:31AM             420072086                       420072086                       2                               0                               12                              NO                                                              420072086                       

All Density                     Average Length                  Columns                         
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
0.5                             4                               MarketKey                       
2.380544E-09                    12                              MarketKey, WebAnalyticsId       

Histogram Steps                 
RANGE_HI_KEY                    RANGE_ROWS                      EQ_ROWS                         DISTINCT_RANGE_ROWS             AVG_RANGE_ROWS                  
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1                               0                               3.441652E+08                    0                               1                               
2                               0                               7.590685E+07                    0                               1                               

Bất kỳ ý tưởng tại sao tôi gặp phải hành vi này và những bước tôi có thể thực hiện ngoài việc sử dụng NORECOMPUTEnhững điều này?


Một kịch bản repro ở đây . Nó chỉ đơn giản là tạo một bảng có PK cụm và chỉ mục cột và cố gắng cập nhật các số liệu thống kê PK với cỡ mẫu thấp. Điều này không sử dụng phân vùng - cho thấy khía cạnh phân vùng là không cần thiết. Tuy nhiên, việc sử dụng phân vùng được mô tả ở trên làm cho vấn đề trở nên tồi tệ hơn khi chuyển đổi phân vùng và sau đó chuyển đổi lại (thậm chí không có bất kỳ thay đổi nào khác) sẽ tăng số lần sửa đổi gấp đôi số lượng hàng trong phân vùng, do đó thực tế đảm bảo rằng số liệu thống kê sẽ xem xét cũ và tự động cập nhật.

Tôi đã thử thêm một chỉ mục không được nhóm vào bảng như được chỉ ra trong KB2986627 (cả hai được lọc không có hàng và sau đó, khi thất bại, NCI không được lọc cũng không có hiệu lực).

Bản repro không hiển thị hành vi có vấn đề trên bản dựng 11.0.6020.0 và sau khi nâng cấp lên SP3, sự cố hiện đã được khắc phục.

Câu trả lời:


10

Điều đầu tiên tôi sẽ thử là cập nhật phiên bản SQL Server từ SP1 CU16 với QFE mà bạn có ngay bây giờ, sang SP3 CU1 (bản dựng 2012 hiện tại) sau đó kiểm tra lại xem hành vi có giống như vậy không.

Ví dụ:

CỐ ĐỊNH: THỐNG KÊ CẬP NHẬT thực hiện lấy mẫu và xử lý không chính xác cho một bảng có chỉ mục cột trong SQL Server

... Lần đầu tiên được phát hành trong SP2 CU2 có thể có liên quan.

Điều đó nói rằng, tôi không chắc chắn nếu cột năm 2012 hỗ trợ mẫu bảng, được yêu cầu cho thống kê được lấy mẫu. Tôi sẽ cập nhật câu trả lời này sau khi có câu trả lời.


1
(Về đoạn cuối) SELECT WebAnalyticsId, MarketKey from [dbo].[factWebAnalytics] TABLESAMPLE (897667 ROWS) ORDER BY MarketKey, WebAnalyticsIdchạy trong chưa đầy 30 giây cho tôi. Nó không sử dụng chỉ mục cột mặc dù. Nó sử dụng chỉ số cụm.
Martin Smith

2
Vâng, nó chắc chắn trông giống như một cái gì đó cố định trong các phiên bản sau. Tôi đã tạo một repro đơn giản ở đây pastebin.com/7f4TwmKW và trên máy chủ thử nghiệm chạy 11.0.5343.0 đã tìm thấy yêu cầu của tôi về kích thước mẫu 10.000 hàng đã bị bỏ qua và tất cả 8.000.000 hàng được lấy mẫu i.stack.imgur.com/DbbjZ.png (plan giống như câu hỏi trong câu hỏi) - Nhưng tôi không gặp phải điều này trên Microsoft SQL Server 2012 (SP3) (KB3072779) - 11.0.6020.0 (các hàng được lấy mẫu có 274.649 khá gần với số lượng hàng ước tính trong bản dựng trước đó và kế hoạch sử dụng CI thay vì nhà kho.)
Martin Smith
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.