Bu başka bir sorgu optimizer bilmecesidir.
Belki sadece sorgu optimize edicileri aşırı tahmin ediyorum, ya da belki bir şey eksik - bu yüzden orada koyuyorum.
Basit bir masam var
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])
bir indeks ve orada bin sıra ile Number
0, 1 ve 2 değerlerinde eşit olarak dağıtılır.
Şimdi bu sorgu:
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
beklendiği gibi bir endeks arayışı yapar .
Eğer nerede cümlesi
WHERE P.Name = 'one';
ancak bir tarama haline gelir.
Vaka cümlesi açık bir şekilde bir iki yönlüdür, bu nedenle teoride birinci sorgu planını ikinci sorgudan çıkarmak için bir optimizasyon mümkün olmalıdır.
Aynı zamanda sadece akademik değil: Sorgu, enum değerlerini ilgili kolay adlarına çevirerek esinlenmiştir.
Sorgu optimize edicilerden (ve özellikle Sql Server'da bir) ne olacağını bilen birinden duymak istiyorum: Sadece çok fazla bekliyorum?
Daha önce bir sorgu biraz varyasyon bir optimizasyon aniden ortaya geleceğini durumlarda vardı soruyorum.
Sql Server 2016 Developer Edition kullanıyorum.