问题与MS SQL Server 2008+有关。索引搜索估计行
有表(比如,5-10M行)
CREATE TABLE [Test].[Persons](
[PersonId] [int] NOT NULL,
[FirstName] [varchar] (50) NOT NULL,
[LastName] [varchar] (50) NOT NULL,
[OtherNames] [varchar] (50) NULL,
[BirthDate] [varchar] (10) NULL
CONSTRAINT [PK_Persons] PRIMARY KEY CLUSTERED ([PersonId] ASC)
)
随着指数
CREATE NONCLUSTERED INDEX [IX_Persons_LastName_FirstName]
ON [Test].[Persons] ([LastName] ASC, [FirstName] ASC)
执行简单的查询像
SELECT [FirstName],[LastName],[BirthDate]
FROM [Test].[Persons] WHERE [LastName] = 'Decker'
我看到,有索引查找运算符,当键不在统计学组态时是确切的值,估计的行严重不同于实际行。
对于某些特定的键,它可以是约15个估计行与10k个实际行。
似乎在这种情况下,“估计行数”值是直接从AVG_RANGE_ROWS获取相应的时间间隔(即下一个直方图数值)。
预期行为?我的意思是,SQL Server是否“知道”该值不准确,并在计算查询成本时使用这个事实,或者这是一个潜在的错误查询计划问题?
尝试使用SQL2008R2,2012,2014(全部都使用OLD基数估计器)据我所知,只有在处理查询中的多个表时,新CE才会更改内容。尝试有趣,但我还没有。
我想这是因为统计样本只猜测有多少DECKER你很可能有 - 尝试一些常见和罕见的名字,看看是否有模式 – Cato
尝试运行UPDATE STATISTICS –
@Tab Alleman统计信息在查询执行之前用FULLSCAN更新。 – Marvin