У вас должен быть покрывающий индекс для вашего запроса, чтобы он выполнялся быстро, кроме этого, здесь нет ярлыка для повышения производительности, так как ваш запрос должен будет прочитать каждую страницу таблицы для подсчета идентификатора категории.
У меня есть таблица с 5 миллионами строк. Почти 4,7 миллиона строк имеют значение Delete = False, без индекса покрытия мой запрос занимает около 12 секунд, и план выполнения выглядит следующим образом.
Как только я создаю следующий покрывающий индекс для моей таблицы, запрос выполняется менее чем за секунду, и план выполнения выглядит точно так же, но онвыполняет поиск по некластерному индексу, а не сканирует кластерный индекс:
Index Definition:
CREATE NONCLUSTERED INDEX [Test_Index]
ON [dbo].[Test] ([IsDeleted])
INCLUDE ([CategoryId])
При таком покрытии индекс SQL Server будет тольконужно смотреть в индекс и возвращать результаты, а не просматривать всю таблицу.
Если вы действительно хотите ускорить этот запрос, есть еще один очень специфический способ ускорить этот запрос, создав отфильтрованный индекс специально для вашего запроса;
Index definition would be:
CREATE NONCLUSTERED INDEX [Test_Index2]
ON [dbo].[Test] ([CategoryId])
WHERE IsDeleted = 'False'
С помощью этого отфильтрованного индексамой запрос был довольно мгновенным, я не установил время ввода-вывода для моего запроса, но я бы увидел несколько миллисекунд. План выполнения слегка изменился с этим индексом.