这是另一个查询优化器难题。
也许我只是高估了查询优化器,或者我错过了一些东西,所以我把它放在了那儿。
我有一张简单的桌子
CREATE TABLE [dbo].[MyEntities](
[Id] [uniqueidentifier] NOT NULL,
[Number] [int] NOT NULL,
CONSTRAINT [PK_dbo.MyEntities] PRIMARY KEY CLUSTERED ([Id])
)
CREATE NONCLUSTERED INDEX [IX_Number] ON [dbo].[MyEntities] ([Number])
带有一个索引和几千行,Number
均匀分布在值0、1和2中。
现在这个查询:
SELECT * FROM
(SELECT
[Extent1].[Number] AS [Number],
CASE
WHEN (0 = [Extent1].[Number]) THEN 'one'
WHEN (1 = [Extent1].[Number]) THEN 'two'
WHEN (2 = [Extent1].[Number]) THEN 'three'
ELSE '?'
END AS [Name]
FROM [dbo].[MyEntities] AS [Extent1]
) P
WHERE P.Number = 0;
是否IX_Number
会像人们期望的那样寻找索引。
如果where子句是
WHERE P.Name = 'one';
但是,它变成了扫描。
案例显然是一个双射,因此从理论上讲,应该有可能进行优化以从第二个查询中扣除第一个查询计划。
这也不是纯粹的学术性:查询是通过将枚举值转换为它们各自的友好名称而得到启发的。
我想听听知道查询优化器(特别是Sql Server中的查询优化器)的期望的人:我只是期望太多了吗?
我问的是,在某些情况下,查询的一些细微变化会使优化突然出现。
我正在使用Sql Server 2016开发人员版。