Sql-Server

更好地理解 SQL Server 統計資訊

  • June 25, 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
)

指數

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

直方圖

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                        

很容易。查找結果:

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

DISTINCT_RANGE_ROWS + 1

這意味著 SQL Server 認為您的所有 DOB 大致平均分佈在該範圍內,平均每天 236 個項目。

查詢您的數據並查看您是否有任何大綱,例如:缺少日期範圍或每天超過 1000 個 DOB。

如果你這樣做,那將是引擎的問題。

引用自:https://dba.stackexchange.com/questions/142208