Почему не используется индекс по статусу
Вопрос
В таблице orders 10 млн строк, 60% имеют status = 'paid'. По status есть индекс, но запрос WHERE status = 'paid' идёт через Seq Scan. Почему?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Варианты ответа
- Читать подряд всю таблицу дешевле, чем прыгать по индексуправильный ответ
- Индексы не работают с текстовыми колонками вроде
status - Индекс повреждён после массовой вставки, нужен REINDEX
- Seq Scan используется для любых таблиц больше 1 млн строк
Разбор
Индекс выгоден при высокой селективности, когда нужна малая доля строк. Если нужно 60% строк, последовательное чтение страниц дешевле, чем случайные переходы из индекса в таблицу. Текстовые колонки индексируются нормально. Повреждённый индекс выдаёт ошибки или неверные данные, а не меняет план. Никакого порога по размеру таблицы для Seq Scan нет. Если бы искали редкий статус, полезен был бы частичный индекс.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.