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.
Saya menafsirkan pertanyaan sebagai bahwa Anda tertarik pada pengoptimal secara umum, tetapi dengan minat khusus untuk SQL Server. Saya menguji skenario Anda dengan db2 LUW V11.1:
Pengoptimal dalam DB2 menulis ulang kueri kedua ke yang pertama:
Rencananya terlihat seperti:
Saya tidak tahu banyak tentang pengoptimal lain, tetapi saya merasa bahwa pengoptimal DB2 dianggap cukup baik bahkan di antara pesaing.
sumber
Dalam permintaan khusus ini, cukup konyol bahkan memiliki
CASE
pernyataan. Anda memfilter ke satu case tertentu! Mungkin ini hanya detail dari contoh kueri tertentu yang Anda berikan, tetapi jika tidak, Anda dapat menulis kueri ini untuk mendapatkan hasil yang setara:Ini akan memberi Anda set hasil yang persis sama, dan karena Anda sudah mengkodekan nilai dalam sebuah
CASE
pernyataan, Anda tidak kehilangan perawatan apa pun di sini.sumber
CASE
pernyataan, karena ORM melakukan hal semacam itu. Apa yang konyol adalah bahwa Anda tidak mengenali aspek sederhana dari masalah ini ... (bagaimana itu karena secara tidak langsung disebut tanpa otak?)CASE
pernyataan tersebut dapat dihilangkan seluruhnya tanpa kekurangan. Tentu saja mungkin ada faktor yang tidak diketahui, tetapi tidak ditentukan.