+1 За предложение объединения обойти оператор сортировки

ько начал изучать оптимизацию своих запросов с помощью индексов, потому что данные SQL растут большими и быстрыми. Я посмотрел на то, как оптимизатор обрабатывает мой запрос с помощью плана выполнения в SSMS, и заметил, что используется оператор сортировки. Я слышал, что оператор Sort указывает на неверный дизайн в запросе, поскольку сортировка может быть выполнена преждевременно с помощью индекса. Итак, вот пример таблицы и данных, похожих на то, что я делаю:

IF OBJECT_ID('dbo.Store') IS NOT NULL DROP TABLE dbo.[Store]
GO

CREATE TABLE dbo.[Store]
(
    [StoreId] int NOT NULL IDENTITY (1, 1),
    [ParentStoreId] int NULL,
    [Type] int NULL,
    [Phone] char(10) NULL,
    PRIMARY KEY ([StoreId])
)

INSERT INTO dbo.[Store] ([ParentStoreId], [Type], [Phone]) VALUES (10, 0, '2223334444')
INSERT INTO dbo.[Store] ([ParentStoreId], [Type], [Phone]) VALUES (10, 0, '3334445555')
INSERT INTO dbo.[Store] ([ParentStoreId], [Type], [Phone]) VALUES (10, 1, '0001112222')
INSERT INTO dbo.[Store] ([ParentStoreId], [Type], [Phone]) VALUES (10, 1, '1112223333')
GO

Вот пример запроса:

SELECT [Phone]
FROM [dbo].[Store]
WHERE [ParentStoreId] = 10
AND ([Type] = 0 OR [Type] = 1)
ORDER BY [Phone]

Я создаю некластеризованный индекс, чтобы ускорить запрос:

CREATE NONCLUSTERED INDEX IX_Store ON dbo.[Store]([ParentStoreId], [Type], [Phone])

Чтобы построить индекс IX_Store, я начну с простых предикатов

[ParentStoreId] = 10
AND ([Type] = 0 OR [Type] = 1)

Затем я добавляю[Phone] столбец для ORDER BY и для покрытия выхода SELECT

Таким образом, даже при построении индекса оптимизатор по-прежнему использует оператор сортировки (а не сортировку индекса), поскольку[Phone] сортируется ПОСЛЕ[ParentStoreId] А ТАКЖЕ[Type], Если я удалю[Type] столбец из индекса и запустить запрос:

SELECT [Phone]
FROM [dbo].[Store]
WHERE [ParentStoreId] = 10
--AND ([Type] = 0 OR [Type] = 1)
ORDER BY [Phone]

Тогда, конечно, оператор сортировки не используется оптимизатором, потому что[Phone] отсортировано по[ParentStoreId].

Таким образом, вопрос заключается в том, как я могу создать индекс, который будет охватывать запрос (включая[Type] предикат) и не оптимизатор использовать сортировку?

РЕДАКТИРОВАТЬ:

Таблица, с которой я работаю, содержит более 20 миллионов строк

Ответы на вопрос(1)

Ваш ответ на вопрос