Для SQL Server существует множество факторов, которые влияют на окончательный план выполнения.На базовом уровне статистика играет очень большую роль, но она основана на данных, но не всегда на всех данных.Статистика тоже не всегда актуальна.При создании или перестройке индекса статистика должна основываться на полной / 100% выборке данных.Однако частота выборки для автоматического обновления статистики намного ниже, чем 100%, поэтому можно выбрать диапазон, который на самом деле не является представительным для большей части данных.Предполагаемое количество строк для операции также играет роль, которая может быть основана на количестве строк в таблице или статистике отфильтрованной операции.Таким образом, устаревшая (или неполная) статистика может привести к тому, что оптимизатор выберет неоптимальный план, так же как несколько строк в таблице могут привести к полному игнорированию индексов (что может быть более эффективным).
Как уже упоминалось в другом ответе, чем более уникальными (т.е. выборочными) данные будут, тем полезнее будет индекс.Но имейте в виду, что единственным гарантированным столбцом для статистики является начальный (или «самый левый» или «первый») столбец индекса.SQL Server может собирать и собирает статистику для других столбцов, даже если некоторые из них отсутствуют в каких-либо индексах, но только если установлена опция DB AutoCreateStatistics (и это по умолчанию).
Кроме того, существование внешних ключей можетпомочь оптимизатору, когда эти поля находятся в запросе.
Но одна область, не рассматриваемая в вопросе, - это область самого запроса.У запроса, слегка измененного, но все же возвращающего те же результаты, может быть совершенно другой план выполнения.Также возможно сделать недействительным использование индекса, используя:
LIKE '%' + field
или упаковав поле в функцию, например:
WHERE DATEADD(DAY, -1, field) < GETDATE()
Теперь, имейте в виду, что читатьоперации (в идеале) выполняются быстрее с индексами, но операции DML (INSERT, UPDATE и DELETE) выполняются медленнее (при этом требуется больше ресурсов ЦП и дискового ввода-вывода), поскольку индексы необходимо поддерживать.
Наконец, "оценочный"«ЦП и т. Д. Значения стоимости не всегда следует полагаться.Лучший тест - сделать:
SET STATISTICS IO ON
run query
SET STATISTICS IO OFF
и сосредоточиться на «логическом чтении».Если вы уменьшите логическое чтение, то вам следует повысить производительность.
В конечном итоге вам понадобится набор данных, который будет немного ближе к тому, что вы имеете в производственной среде, чтобы настроить производительность в отношении обоих индексов.и сами запросы.