Крайний левый столбец индекса с несколькими столбцами не работает как индекс с одним столбцом

У меня сложилось впечатление, что индекс как

CREATE NONCLUSTERED INDEX IX_Name_Age ON People
(
   Name ASC,
   Age ASC
)

будет использоваться не только для запроса типа Select * From People WHERE Name = 'X' и Age = Y, но также будет функционировать как индекс из одного столбца для чего-то вроде Select * From People WHERE Name = 'Z'

Однако, в моих нескольких тестах, которые я сделал до сих пор, это не похоже на случай. Например, у меня есть индекс для Manufacturer/PartNumber с производителем в качестве ведущего столбца, но Select * WHERE Manufacturer = 'A' по-прежнему выполняет сканирование таблицы.

Я делаю / интерпретирую что-то неправильно или мое первоначальное предположение было неверным?

2 ответа

Если SQL Server считает, что использование некластеризованного индекса будет дешевле, если вы будете искать в крайнем левом столбце, тогда это произойдет. Проблема в вашем случае (я предполагаю) состоит в том, что вы делаете SELECT * вместо указания только тех столбцов, которые хотите вернуть. Если вы укажете столбцы, которые не входят в некластеризованный индекс, то SQL Server потребуется выполнить поиск ключа после поиска по индексу и вернуться к кластерному индексу (или кучи, если нет кластерного индекса), чтобы получить остальные. колонн.

Если вам нужно всего несколько столбцов, укажите их и добавьте в качестве включенных столбцов в существующий индекс, и SQL Server начнет использовать этот индекс.

Сколько строк в таблице? SQL Server иногда не будет беспокоиться об использовании индекса, если таблица достаточно мала, поскольку накладные расходы при поиске RID/ закладок из некластеризованного индекса могут перевесить выигрыш в производительности от отказа от сканирования таблицы. Пока вы сохраняете статистику обновленной в таблице, SQL Server должен прибегать к индексу, когда сочтет это необходимым.

Другие вопросы по тегам