Я знаю, что когда дело доходит до использования индекса или сканирования таблицы, SQL Server использует статистику, чтобы определить, какая из них лучше.
У меня есть таблица с 20 миллионами строк. У меня есть индекс (SnapshotKey, Measure) и этот запрос:
select Measure, SnapshotKey, MeasureBand
from t1
where Measure = 'FinanceFICOScore'
group by Measure, SnapshotKey, MeasureBand
Запрос возвращает 500 тыс. Строк. Таким образом, запрос выбирает только 2,5% строк таблицы.
Вопрос в том, почему SQL Server не использует некластеризованный индекс, а вместо этого использует сканирование таблицы?
Статистика обновляется.
Хорошо отметить, что производительность запросов хорошая.
Сканирование таблицы
Принудительный индекс
Структура таблицы / индекса
CREATE TABLE [t1](
[SnapshotKey] [int] NOT NULL,
[SnapshotDt] [date] NOT NULL,
[Measure] [nvarchar](30) NOT NULL,
[MeasureBand] [nvarchar](30) NOT NULL,
-- and many more fields
) ON [PRIMARY]
На столе нет PK, так как это хранилище данных.
CREATE NONCLUSTERED INDEX [nci_SnapshotKeyMeasure] ON [t1]
(
[SnapshotKey] ASC,
[Measure] ASC
)