Почему индекс не используется
Вопрос
Индекс есть, а в плане Seq Scan. Назови возможные причины и как каждую проверить.
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Низкая селективность: нужна большая доля строк, 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 ошибок.
Предыдущий вопрос
Порядок колонок в составном индексе
Следующий вопрос
Составной индекс под фильтр и сортировку