Некластеризованные индексы могут абсолютно использоваться для оптимизации сортировки.Индексы - это, по сути, двоичные деревья поиска, что означает, что они содержат значения, отсортированные по порядку.
Однако, в зависимости от запроса, вы можете поместить SQL Server в головоломку.
Если у вас есть таблица с 100 миллионами строк, ваш запрос будет соответствовать 11 миллионам из них, как показано ниже, дешевле ли использовать индекс на category
, чтобы выбрать строки и отсортировать результаты по name
, или прочитать все 100 миллионов строк из индекса, предварительно отсортированного по name
, а затем отфильтровать 89 миллионовиз них путем проверки category
?
select ...
from product
where category = ?
order by name;
Теоретически, SQL Server может использовать индекс на name
для чтения строк в порядке и использовать индекс наcategory
эффективно фильтровать?Я скептическиЯ редко видел, чтобы SQL Server использовал несколько индексов для доступа к одной и той же таблице в одном запросе (при условии выбора одной таблицы, игнорирования объединений или рекурсивных CTE).Это должно было бы проверить индекс 100 миллионов раз.Индексы имеют высокие накладные расходы на поиск по индексу, поэтому они эффективны, когда один поиск сужает результирующий набор на много.
Не видя схемы, статистики и точного запроса, мне трудно сказать,это имеет смысл, но я ожидаю, что я обнаружу, что SQL Server будет использовать индекс для условия where и отсортирует результаты, игнорируя индекс для столбца сортировки.
Индекс для столбца сортировки может использоваться, если вывыбираем всю таблицу, хотя.Как select ... from product order by name;
Опять же, ваш пробег может варьироваться.Это предположение, основанное на прошлом опыте.