Я только начал изучать оптимизацию своих запросов с помощью индексов, потому что данные SQL растут большими и быстрыми. Я посмотрел, как оптимизатор обрабатывает мой запрос через план выполнения в SSMS и замечает, что используется оператор Sort. Ive слышал, что оператор 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
Таким образом, даже когда индекс построен, оптимизатор по-прежнему использует оператор Sort (а не сортировку индекса), потому что [Phone]
сортируется ПОСЛЕ [ParentStoreId]
И [Type]
. Если я удалю столбец [Type]
из индекса и запустим запрос:
SELECT [Phone]
FROM [dbo].[Store]
WHERE [ParentStoreId] = 10
--AND ([Type] = 0 OR [Type] = 1)
ORDER BY [Phone]
Тогда, конечно, оператор Sort не используется оптимизатором, потому что [Phone]
сортируется [ParentStoreId]
.
Итак, вопрос в том, как создать индекс, который будет охватывать запрос (включая предикат [Type]
) и не использовать оптимизатор для сортировки?
EDIT:
В таблице, в которой я работаю, содержится более 20 миллионов строк