Некластеризованные индексы можно абсолютно использовать для оптимизации сортировки. Индексы - это, по сути, бинарные деревья поиска, что означает, что они содержат значения, отсортированные по порядку.
Однако, в зависимости от запроса, вы можете поставить 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;
Опять же, ваш пробег может отличаться. Это предположение, основанное на прошлом опыте.
person
Brandon
schedule
24.08.2018
can non-clustered indexes be used to improve ORDER BY performance?
- да. Но, не имея на сервере реальных планов выполнения, таблиц DDL + DML и всей информации для воспроизведения проблемы, мы можем только сказать, что это возможно, но не обязательно. - person Ronen Ariely   schedule 24.08.2018general rules for when an index can improve sort performance
: хорошо, мы можем обсудить золотые правила, но они могут работать, а могут и не работать, в чем смысл золотых правил :-). Намного проще понять, что такое некластеризованный индекс и что такое кластерный индекс, что является очень простой темой и является обязательной для всех, кто работает с базами данных. Вы можете попытаться сосредоточиться на конкретном вопросе? Я не уверен, что на данный момент непонятно ;-) - person Ronen Ariely   schedule 24.08.2018Order By
производительности? да. БУДУТ ЛИ некластеризованные индексы улучшитьOrder By
производительность в вашем конкретном случае? Невозможно узнать с помощью той ограниченной информации, которую вы предоставили. - person Brian   schedule 24.08.2018IN
. - person Jonathan Wood   schedule 24.08.2018First off, my real expertise is C/C++/C#
: Хорошо, в этом есть смысл :-), но базой данных, как вы описали, обычно управляет администратор базы данных. Во всяком случае, давайте попробуем помочь вам на стороне базы данных - person Ronen Ariely   schedule 24.08.2018(lprOwner, lprDate
)? И аналогичный индекс для(lprOwner, X
), где X - это каждый столбец, по которому этот запрос может сортировать. Имейте в виду, что хранить и поддерживать индексы дорого, поэтому, если пользователи могут сортировать по 2 или 3 столбцам, это нормально, но если они могут сортировать по любому столбцу в таблице, это может быть плохим решением. - person Brandon   schedule 24.08.2018