これは別のクエリオプティマイザーの難問です。
たぶん私はクエリオプティマイザーを過大評価しているのかもしれませんし、何か不足しているかもしれません。
シンプルなテーブルがあります
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句が
WHERE P.Name = 'one';
ただし、スキャンになります。
ケース句は明らかに全単射であるため、理論的には、最適化によって2番目のクエリから最初のクエリプランを差し引くことができるはずです。
また、純粋に学術的なものでもありません。列挙型の値をそれぞれのわかりやすい名前に変換することでクエリが発想を得ています。
クエリオプティマイザー(特にSql Serverのオプティマイザー)から何が期待できるかを知っている人からの連絡を希望します。単に期待しすぎですか。
以前にクエリのわずかな変化が最適化を突然明らかにする場合があったので、私は尋ねています。
SQL Server 2016 Developer Editionを使用しています。