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

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

Вопрос

В таблице orders 10 млн строк, 60% имеют status = 'paid'. По status есть индекс, но запрос WHERE status = 'paid' идёт через Seq Scan. Почему?

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

Выберите вариант, и откроется разбор.

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

Коротко

Правильный ответ: Читать подряд всю таблицу дешевле, чем прыгать по индексу. Индекс выгоден при высокой селективности, когда нужна малая доля строк.

Варианты ответа

  1. Читать подряд всю таблицу дешевле, чем прыгать по индексуправильный ответ
  2. Индексы не работают с текстовыми колонками вроде status
  3. Индекс повреждён после массовой вставки, нужен REINDEX
  4. Seq Scan используется для любых таблиц больше 1 млн строк

Разбор

Индекс выгоден при высокой селективности, когда нужна малая доля строк. Если нужно 60% строк, последовательное чтение страниц дешевле, чем случайные переходы из индекса в таблицу. Текстовые колонки индексируются нормально. Повреждённый индекс выдаёт ошибки или неверные данные, а не меняет план. Никакого порога по размеру таблицы для Seq Scan нет. Если бы искали редкий статус, полезен был бы частичный индекс.

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

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