Несоответствие индексов и условий запроса и Эффективные условия запросов
Индексы это ещё одна из самых сложных тем, которую особенно любят прогонять на собеседованиях, после транзакций и блокировок конечно)
#std652
1.1. ...Условия используются в следующих секциях запроса:
ВЫБРАТЬ … ИЗ … ГДЕ <условие>
СОЕДИНЕНИЕ … ПО <условие>
ВЫБРАТЬ … ИЗ <ВиртуальнаяТаблица>(, <условие>)
ИМЕЮЩИЕ <условие>
1.2. Если в структуре базы данных отсутствует индекс, удовлетворяющий всем перечисленным условиям, то для получения результата СУБД будет вынуждена сканировать таблицу или один из ее индексов. Это приведет к увеличению времени выполнения запроса, а также к возможному снижению параллельности системы, поскольку возрастет количество установленных блокировок.
Требования к индексу связаны с физической структурой индекса в СУБД. Эта структура представляет собой дерево значений проиндексированных полей. На первом уровне дерева находятся значения первого поля индекса, на втором - второго и так далее. Такая структура позволяет достичь высокой эффективности при поиске по индексу. Кроме того, она гарантирует отсутствие деградации производительности индекса с ростом количества данных.
Однако, индекс такой структуры, очевидно, может быть использован только строго определенным образом. Сначала необходимо провести поиск по значению первого поля индекса, затем - второго и так далее. Если, например, условие по первому полю индекса не указано, то индекс уже не сможет обеспечить быстрый поиск. Если указано условие по нескольким первым полям индекса, а затем одно или несколько полей индекса не задано, то индекс может быть использован только частично.
3. ... Следует иметь в виду, что создание индекса ускоряет процесс поиска информации, но может несколько замедлить процесс ее изменения (добавления, редактирования и удаления). Поэтому индексы следует создавать осознанно и только в том случае, если точно известен запрос, для которого такой индекс необходим. Не следует создавать индексы "на всякий случай" или заведомо избыточные индексы.
По стандарту выше главное запомнить: конструкции с условиями, на которые влияет наличие индекса, важен порядок полей и лишние индексы - плохо.
А следующий стандарт дополняет первый и чуть более его раскрывает.
#std652
1. ... Поля основного условия в секциях ГДЕ, ПО и виртуальных таблицах должны быть проиндексированы.
Основное условие – это то, что позволяет ограничить объем выборки больше других условий и его составляющие объединены по И.
Дополнительное условие – это то, что объединено с основным условием по И и его составляющие могут быть любой сложности (НЕ, <>, +, -, /, *, функции и т.п.).
...
Для условий в ГДЕ или в виртуальной таблице следует индексировать поля в основной таблице, из которой выполняется выборка.
Для условий в ПО ЛЕВОГО соединения следует индексировать поля в правой таблице.
Для условий в ПО ВНУТРЕННЕГО соединения следует индексировать поля в таблице с большим количеством записей.
... требования допустимо не соблюдать, если в таблицах ... менее 1000 записей
P.S. Полное описание стандарта по ссылке в начале поста. Относительно второго стандарта лучше смотреть на примерах, приведенных там же)
Для более подробного ознакомления с данной темой или для повторения мат.части, рекомендую эту методичку - Индексы таблиц базы данных
И почитать про дополнительные индексы, доступно только на версии платформы КОРП #std791
#ЧёПоСтандартам #std652 #std658