Hiểu rõ hơn về thống kê của SQL Server


7

Tôi có một bảng với 5.000.000 bản ghi với cột DateOfBirth trải dài từ năm 1950 đến năm 2007 Biểu đồ thống kê cho chỉ mục chỉ có hai RANGE_HI_KEY. Tôi cảm thấy như biểu đồ nên có nhiều thùng hơn với số lượng hồ sơ và tính chọn lọc của lĩnh vực.

Ai đó có thể giải thích cho tôi tại sao SQL Server chỉ sử dụng hai RANGE_HI_KEY không?

LƯU Ý: Tôi nhận được bảng phân tích thống kê tương tự vào năm 2014 và 2016

Bàn

CREATE TABLE [dbo].[Person](
    [BusinessEntityID] [INT] NOT NULL,
    [PersonType] [NCHAR](2) NOT NULL,
    [NameStyle] [dbo].[NameStyle] NOT NULL,
    [Title] [NVARCHAR](8) NULL,
    [FirstName] [dbo].[Name] NOT NULL,
    [MiddleName] [dbo].[Name] NULL,
    [LastName] [dbo].[Name] NOT NULL,
    [Suffix] [NVARCHAR](10) NULL,
    [EmailPromotion] [INT] NOT NULL,
    [rowguid] [UNIQUEIDENTIFIER] NOT NULL,
    [ModifiedDate] [DATETIME] NOT NULL,
    [DateOfBirth] [DATE] NOT NULL
)

Mục lục

CREATE NONCLUSTERED INDEX [IX_dbo_Person_DateOfBirth] 
ON [dbo].[Person] ( [DateOfBirth] ASC )

Biểu đồ

Statistics for INDEX 'IX_dbo_Person_DateOfBirth'.
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Name                            Updated                         Rows                            Rows Sampled                    Steps                           Density                         Average Key Length              String Index                    
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
IX_dbo_Person_DateOfBirth       Jun 24 2016  7:16PM             5000000                         5000000                         2                               0.004236792                     3                               NO                                                              5000000                         

All Density                     Average Length                  Columns                         
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
4.720544E-05                    3                               DateOfBirth                     

Histogram Steps                 
RANGE_HI_KEY                    RANGE_ROWS                      EQ_ROWS                         DISTINCT_RANGE_ROWS             AVG_RANGE_ROWS                  
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1/1/1950 12:00:00 AM            0                               255                             0                               1                               
12/31/2007 12:00:00 AM          4999537                         208                             21182                           236.0276                        

Câu trả lời:


3

Rất dễ. Tìm kiếm kết quả của:

select datediff(day,'1/1/1950','12/31/2007');

Nó sẽ cung cấp cho bạn DISTINCT_RANGE_ROWS + 1
Điều đó có nghĩa là SQL Server nghĩ rằng tất cả các DOB của bạn được phân phối xấp xỉ bằng nhau trên phạm vi với trung bình 236 mục mỗi ngày.
Truy vấn dữ liệu của bạn và xem liệu bạn có bất kỳ phác thảo nào như: phạm vi ngày bị thiếu hoặc> 1000 DOB mỗi ngày.
Nếu bạn làm như vậy, đó sẽ là một câu hỏi cho động cơ.


Cảm ơn Slava. Vì vậy, các phím hi dựa trên dữ liệu sai lệch chứ không phải số lượng hoặc lây lan!
Búa SQL

@Query Hammer RANGE_HI_KEYlà giá trị thực trong bảng. RANGE_ROWSlà có bao nhiêu hàng rơi giữa cuối cùng RANGE_HI_KEYvà hiện tại RANGE_HI_KEY.
swasheck

Bạn đúng rồi. Nếu bạn quan tâm, tôi có một slide tương tác rất hay trên đó trong sqlpass.org/EventDoad.aspx?suid=11095
Slava Murygin
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.