Ceci est une autre énigme d'optimiseur de requête.
Peut-être que je surestime simplement les optimiseurs de requête, ou peut-être qu'il me manque quelque chose - je le mets donc là.
J'ai une table simple
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])
avec un index et quelques milliers de lignes, Number
réparties uniformément dans les valeurs 0, 1 et 2.
Maintenant, cette requête:
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;
recherche un indice IX_Number
comme on pourrait s'y attendre.
Si la clause where est
WHERE P.Name = 'one';
cependant, cela devient un scan.
La clause de cas est évidemment une bijection, donc en théorie une optimisation devrait être possible pour déduire le premier plan de requête de la seconde requête.
Ce n'est pas non plus purement académique: la requête est inspirée de la traduction des valeurs d'énumération en leurs noms conviviaux respectifs.
J'aimerais entendre quelqu'un qui sait ce que l'on peut attendre des optimiseurs de requêtes (et en particulier celui de Sql Server): est-ce que j'attends simplement trop?
Je demande comme j'avais des cas auparavant où une légère variation d'une requête ferait soudainement apparaître une optimisation.
J'utilise Sql Server 2016 Developer Edition.