Sql-Server
更好地理解 SQL Server 統計資訊
我有一個包含 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。
如果你這樣做,那將是引擎的問題。