Eu tenho uma tabela com 5.000.000 registros com a coluna DateOfBirth distribuída entre 1950 e 2007. O histograma de estatísticas para o índice possui apenas dois RANGE_HI_KEYs. Acho que o histograma deveria ter mais baldes dada a quantidade de registros e a seletividade do campo.
Alguém pode me explicar por que o SQL Server está usando apenas dois RANGE_HI_KEYs?
OBSERVAÇÃO: recebo o mesmo detalhamento de estatísticas em 2014 e 2016
Mesa
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
)
Índice
CREATE NONCLUSTERED INDEX [IX_dbo_Person_DateOfBirth]
ON [dbo].[Person] ( [DateOfBirth] ASC )
Histograma
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
Muito fácil. Procure o resultado de:
Isso
DISTINCT_RANGE_ROWS + 1
significa que o SQL Server considera que todos os seus DOBs estão aproximadamente igualmente distribuídos no intervalo, com uma média de 236 itens por dia.
Consulte seus dados e veja se você tem algum esboço como: intervalos de dias ausentes ou > 1000 DOBs por dia.
Se você fizer isso, isso seria uma pergunta para o motor.