Ini adalah teka-teki pengoptimal permintaan lainnya.
Mungkin saya hanya memperkirakan pengoptimal permintaan yang berlebihan, atau mungkin saya melewatkan sesuatu - jadi saya meletakkannya di sana.
Saya punya meja sederhana
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])
dengan indeks dan beberapa ribu baris di sana, Number
didistribusikan secara merata dalam nilai 0, 1 dan 2.
Sekarang pertanyaan ini:
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;
apakah indeks mencari IX_Number
seperti yang diharapkan.
Jika klausa di mana
WHERE P.Name = 'one';
Namun, itu menjadi pemindaian.
Klausa kasus jelas merupakan suatu bujukan, sehingga dalam teori optimasi harus dimungkinkan untuk mengurangi rencana kueri pertama dari kueri kedua.
Itu juga tidak sepenuhnya bersifat akademis: Permintaan diilhami dengan menerjemahkan nilai enum ke nama masing-masing yang bersahabat.
Saya ingin mendengar dari seseorang yang tahu apa yang bisa diharapkan dari pengoptimal permintaan (dan khususnya yang ada di Sql Server): Apakah saya hanya berharap terlalu banyak?
Saya bertanya karena ada beberapa kasus sebelumnya di mana beberapa variasi sedikit kueri akan membuat pengoptimalan tiba-tiba terungkap.
Saya menggunakan Sql Server 2016 Developer Edition.