นี่เป็นปริศนาเพิ่มประสิทธิภาพการสืบค้นอีกอันหนึ่ง
บางทีฉันแค่ประมาณเครื่องมือเพิ่มประสิทธิภาพข้อความค้นหาหรือบางทีฉันอาจพลาดบางสิ่ง - ดังนั้นฉันจึงวางมันไว้ที่นั่น
ฉันมีโต๊ะธรรมดา
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';
อย่างไรก็ตามจะเป็นการสแกน
เห็นได้ชัดว่า case-clause นั้นเป็น bijection ดังนั้นในทางทฤษฎีแล้วการเพิ่มประสิทธิภาพควรเป็นไปได้ที่จะหักแผนคิวรีแรกออกจากเคียวรีที่สอง
นอกจากนี้ยังไม่ใช่เชิงวิชาการอย่างแท้จริง: ข้อความค้นหาได้รับแรงบันดาลใจจากการแปลค่า enum เป็นชื่อที่เป็นมิตรของพวกเขา
ฉันต้องการที่จะได้ยินจากคนที่รู้ว่าสิ่งที่สามารถคาดหวังจากการเพิ่มประสิทธิภาพแบบสอบถาม (และโดยเฉพาะอย่างยิ่งหนึ่งในเซิร์ฟเวอร์ SQL): ฉันแค่คาดหวังมากเกินไป?
ฉันถามว่าฉันมีกรณีก่อนที่การเปลี่ยนแปลงเล็กน้อยของแบบสอบถามจะทำให้การเพิ่มประสิทธิภาพนั้นสว่างขึ้นทันที
ฉันใช้ Sql Server 2016 Developer Edition