Esse é outro enigma do otimizador de consulta.
Talvez eu esteja apenas superestimando os otimizadores de consulta ou talvez esteja perdendo alguma coisa - por isso estou publicando isso.
Eu tenho uma mesa simples
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])
com um índice e algumas milhares de linhas, Number
sendo distribuídos igualmente nos valores 0, 1 e 2.
Agora esta consulta:
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;
um índice procura IX_Number
como seria de esperar.
Se a cláusula where for
WHERE P.Name = 'one';
no entanto, torna-se uma varredura.
A cláusula de caso é obviamente uma bijeção, portanto, em teoria, uma otimização deve ser possível deduzir o primeiro plano de consulta da segunda consulta.
Também não é puramente acadêmico: a consulta é inspirada na tradução de valores enum para seus respectivos nomes amigáveis.
Eu gostaria de ouvir de alguém que sabe o que pode ser esperado dos otimizadores de consulta (e especificamente do Sql Server): Estou simplesmente esperando demais?
Estou perguntando como tive casos anteriores em que uma ligeira variação de uma consulta faria uma otimização aparecer de repente.
Estou usando o Sql Server 2016 Developer Edition.