Во-первых, вы должны убедиться, что сортировка на самом деле является узким местом производительности.Продолжительность сортировки будет зависеть от количества сортируемых элементов, а количество хранилищ для конкретного родительского хранилища, вероятно, будет небольшим.(Это предполагает, что оператор сортировки применяется после применения предложения where).
Я слышал, что оператор Sort указывает на неверный дизайн в запросе, поскольку сортировка может быть выполнена преждевременно через индекс
Это чрезмерное обобщение.Зачастую оператор сортировки может быть просто перемещен в индекс, и, если извлекаются только первые несколько строк набора результатов, это может существенно снизить стоимость запроса, поскольку базе данных больше не нужно извлекать все совпадающие строки (и сортировать ихвсе), чтобы найти первые, но может читать записи в порядке набора результатов и останавливаться, как только будет найдено достаточное количество записей.
В вашем случае вы, кажется, извлекаете весь набор результатов, поэтому сортировка выполняется так:вряд ли все ухудшится (если только набор результатов не будет огромным).Кроме того, в вашем случае может быть нетривиально создать полезный отсортированный индекс, потому что предложение where содержит или.
Теперь, если вы все еще хотите избавиться от этого оператора сортировки, вы можете попробовать:
SELECT [Phone]
FROM [dbo].[Store]
WHERE [ParentStoreId] = 10
AND [Type] in (0, 1)
ORDER BY [Phone]
В качестве альтернативы вы можете попробовать следующий индекс:
CREATE NONCLUSTERED INDEX IX_Store ON dbo.[Store]([ParentStoreId], [Phone], [Type])
, чтобы попытаться заставить оптимизатор запросов выполнить сканирование диапазона индекса только на ParentStoreId
, а затем просканировать все соответствующие строкив индексе, выводя их, если Type
соответствует.Однако это может вызвать увеличение дискового ввода-вывода и, следовательно, замедлить ваш запрос, а не ускорить его.
Редактировать : В качестве последнего средства вы можете использовать
SELECT [Phone]
FROM [dbo].[Store]
WHERE [ParentStoreId] = 10
AND [Type] = 0
ORDER BY [Phone]
UNION ALL
SELECT [Phone]
FROM [dbo].[Store]
WHERE [ParentStoreId] = 10
AND [Type] = 1
ORDER BY [Phone]
с помощью
CREATE NONCLUSTERED INDEX IX_Store ON dbo.[Store]([ParentStoreId], [Type], [Phone])
и сортируйте два списка на сервере приложений, где вы можете объединить (как в сортировке слиянием) предварительно отсортированные списки, тем самым избегая полной сортировки.Но это действительно микрооптимизация, которая, хотя и ускоряет саму сортировку на порядок, вряд ли сильно повлияет на общее время выполнения запроса, так как я ожидаю, что узким местом будет сетевой и дисковый ввод-вывод,особенно в свете того факта, что диск будет выполнять много произвольного доступа, поскольку индекс не кластеризован.