Скорее всего, оптимизатор запросов просто видит, что вы также выбираете DisplayText
- поэтому для каждой из 20 000 строк, найденных в индексе NC, должен быть поиск ключа в кластеризованный индекс для получения этих данных - и поиск ключей - это дорогие операции! Так что, в конце концов, может быть проще и эффективнее сканировать индекс кластера сразу.
Бьюсь об заклад, если вы выполните этот запрос здесь:
select CaseActionId, Executed, ExecutedBy
from CaseActions
where Executed='2500-01-01'
тогда будет использоваться индекс NC
Если вам действительно нужен DisplayText
, и этот запрос вы будете часто выполнять, возможно, вам следует включить этот столбец в индекс в качестве дополнительного столбца на уровне листа:
DROP INDEX [IX_Actions_Executed]
CREATE NONCLUSTERED INDEX [IX_Actions_Executed]
ON [dbo].[Actions]([Executed] ASC, [ExecutedBy] ASC)
INCLUDE([DisplayText])
Это сделает ваш NC-индекс охватывающим индекс , то есть он может вернуть все столбцы, необходимые для вашего запроса. Если вы снова запустите исходный запрос с указанным индексом покрытия, я уверен, что оптимизатор запросов SQL Server действительно его использует. Вероятность использования любого индекса NC будет значительно увеличенной, если этот индекс NC является индексом покрытия, например, некоторые запросы могут получить все свои столбцы, которые им нужны, только из индекса NC, без поиска ключей.
Пропущенные подсказки к индексам иногда вводят в заблуждение - есть также известные ошибки, которые приводят к тому, что SQL Server Mgmt Studio постоянно рекомендует индексы, которые уже существуют ..... не ставьте слишком много своих денег на эти индексные подсказки!