Ответ вслух Middle Индексы спрашивают часто обновлено

Почему индекс не используется

Вопрос

Индекс есть, а в плане Seq Scan. Назови возможные причины и как каждую проверить.

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Сначала смотрю EXPLAIN (ANALYZE, BUFFERS) и сравниваю оценку строк с фактом. Причины обычно такие.

Что должно прозвучать в ответе

  • Низкая селективность: нужна большая доля строк, seq scan дешевле

  • Функция или приведение типа над колонкой: нужен индекс по выражению или переписать условие

  • Условие не по ведущей колонке составного индекса

  • Устаревшая статистика: оценки rows не совпадают с фактом, помогает ANALYZE

  • Маленькая таблица, LIKE с % в начале, OR по разным колонкам

  • Проверка: EXPLAIN (ANALYZE, BUFFERS), сравнить оценки с фактом

Что могут спросить следом

  • Как временно заставить планировщик не использовать seq scan для эксперимента?
  • Что такое random_page_cost и зачем его меняют на SSD?

Разбор

Сначала смотрю EXPLAIN (ANALYZE, BUFFERS) и сравниваю оценку строк с фактом. Причины обычно такие. Первая: условие выбирает большую долю таблицы, и читать подряд действительно дешевле. Вторая: над колонкой функция или неявное приведение типа, например lower(email) или сравнение varchar с числом, тогда нужен индекс по выражению или переписанное условие. Третья: составной индекс, а условие не по его первой колонке. Четвёртая: статистика устарела, планировщик думает, что строк много, хотя их мало, помогает ANALYZE или более подробная статистика по колонке. Ещё бывают маленькие таблицы, LIKE с процентом в начале, OR по разным колонкам. Для эксперимента можно в сессии выключить enable_seqscan и сравнить фактическое время, но в прод такую настройку не оставляют. На SSD часто снижают random_page_cost ближе к 1.1, чтобы планировщик не переоценивал случайное чтение.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.