Questo è un altro enigma di Query Optimizer.
Forse sto solo sopravvalutando gli ottimizzatori di query o forse mi sto perdendo qualcosa, quindi lo sto pubblicando.
Ho un tavolo semplice
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])
con un indice e alcune migliaia di righe, Numberdistribuite uniformemente nei valori 0, 1 e 2.
Ora questa query:
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;
un indice cerca IX_Numbercome ci si aspetterebbe.
Se la clausola where è
WHERE P.Name = 'one';
tuttavia, diventa una scansione.
La clausola case è ovviamente una biiezione, quindi in teoria dovrebbe essere possibile un'ottimizzazione per dedurre il primo piano di query dalla seconda query.
Inoltre non è puramente accademico: la query si ispira traducendo i valori enum nei loro rispettivi nomi amichevoli.
Mi piacerebbe avere notizie da qualcuno che sa cosa ci si può aspettare da Query Optimizer (e in particolare quello nel Server SQL): mi aspetto semplicemente troppo?
Sto chiedendo come ho avuto casi prima in cui qualche leggera variazione di una query avrebbe fatto emergere improvvisamente un'ottimizzazione.
Sto usando Sql Server 2016 Developer Edition.