이것은 또 다른 쿼리 최적화 프로그램 수수께끼입니다.
어쩌면 나는 쿼리 최적화 프로그램을 과대 평가하거나 무언가를 놓치고있을 수도 있습니다.
나는 간단한 테이블이있다
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';
그러나 스캔이됩니다.
case-clause는 명백히 bijection이므로 이론상 첫 번째 쿼리 계획을 두 번째 쿼리에서 빼는 최적화가 가능해야합니다.
그것은 또한 학문적이지 않습니다 :이 쿼리는 열거 형 값을 각각의 친숙한 이름으로 번역하여 영감을 얻었습니다.
쿼리 최적화 프로그램 (특히 SQL Server의 최적화 프로그램)에서 기대할 수있는 것을 알고있는 누군가의 의견을 듣고 싶습니다. 단순히 너무 많이 기대하고 있습니까?
쿼리의 약간의 변형으로 인해 최적화가 갑자기 시작되는 경우가 있었기 때문에 묻습니다.
Sql Server 2016 Developer Edition을 사용하고 있습니다.