Крайний левый столбец индекса с несколькими столбцами не работает как индекс с одним столбцом
У меня сложилось впечатление, что индекс как
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 должен прибегать к индексу, когда сочтет это необходимым.