Đây là một câu hỏi hóc búa tối ưu hóa truy vấn khác.
Có lẽ tôi chỉ ước tính quá mức tối ưu hóa truy vấn hoặc có thể tôi đang thiếu một cái gì đó - vì vậy tôi sẽ đưa nó ra ngoài đó.
Tôi có một cái bàn đơn giản
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])
với một chỉ mục và hàng ngàn hàng trong đó, Number
được phân bổ đều trong các giá trị 0, 1 và 2.
Bây giờ truy vấn này:
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;
không một chỉ số tìm kiếm IX_Number
như người ta mong đợi.
Nếu mệnh đề where là
WHERE P.Name = 'one';
tuy nhiên, nó trở thành quét.
Mệnh đề trường hợp rõ ràng là một mệnh đề, vì vậy về mặt lý thuyết, tối ưu hóa có thể được khấu trừ kế hoạch truy vấn đầu tiên từ truy vấn thứ hai.
Nó cũng không hoàn toàn mang tính học thuật: Truy vấn được lấy cảm hứng bằng cách dịch các giá trị enum sang tên thân thiện tương ứng của chúng.
Tôi muốn nghe từ một người biết những gì có thể được mong đợi từ các trình tối ưu hóa truy vấn (và cụ thể là câu hỏi trong Sql Server): Tôi chỉ đơn giản là mong đợi quá nhiều?
Tôi đang hỏi khi tôi gặp trường hợp trước khi một số biến thể nhỏ của truy vấn sẽ làm cho việc tối ưu hóa đột nhiên được đưa ra ánh sáng.
Tôi đang sử dụng Sql Server 2016 Developer Edition.