Це ще одна загадка оптимізатора запитів.
Можливо, я просто завищую оптимізатори запитів, або, можливо, мені щось не вистачає - тому я викладаю його там.
У мене проста таблиця
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 P.Name = 'one';
однак це стає скануванням.
Заява "регістр" - це, очевидно, бікс
Це також не є суто академічним: запит надихається перекладом значень enum у відповідні дружні імена.
Мені хотілося б почути від того, хто знає, чого можна очікувати від оптимізаторів запитів (а саме від сервера Sql): Я просто очікую занадто багато?
Я запитую, як у мене були випадки, коли деякі незначні зміни запиту зробили б оптимізацію раптом.
Я використовую Sql Server 2016 для розробників.