Назад | Перейти на главную страницу

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

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

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' по-прежнему выполняет сканирование таблицы.

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

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

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

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