更好地了解 SQL Server 统计信息

SQL*_*mer 7 sql-server statistics index-statistics sql-server-2014 sql-server-2016

我有一个包含 5,000,000 条记录的表,DateOfBirth 列分布在 1950 年和 2007 年之间。索引的统计直方图只有两个 RANGE_HI_KEY。鉴于记录的数量和字段的选择性,我觉得直方图应该有更多的桶。

谁能向我解释为什么 SQL Server 只使用两个 RANGE_HI_KEY ?

注意:我在 2014 年和 2016 年得到相同的统计数据

桌子

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
)
Run Code Online (Sandbox Code Playgroud)

指数

CREATE NONCLUSTERED INDEX [IX_dbo_Person_DateOfBirth] 
ON [dbo].[Person] ( [DateOfBirth] ASC )
Run Code Online (Sandbox Code Playgroud)

直方图

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                        
Run Code Online (Sandbox Code Playgroud)

小智 3

好简单。查找以下结果:

select datediff(day,'1/1/1950','12/31/2007');
Run Code Online (Sandbox Code Playgroud)

这意味着DISTINCT_RANGE_ROWS + 1
SQL Server 认为您的所有 DOB 在该范围内大致均匀分布,平均每天有 236 个项目。
查询您的数据并查看是否有任何轮廓,例如:缺少日期范围或每天 >1000 DOB。
如果你这样做,那么这对引擎来说就是一个问题。