Вступить в клуб →
сложнаявопросPostgreSQL и Redis: запросы и кэш

Планировщик игнорирует новый индекс на малоселективной колонке

На таблице orders (30 млн строк) создали индекс по status. Значение paid занимает около 60% строк, значение refund_pending — 0.3%.

Запрос WHERE status = 'refund_pending' теперь идёт по индексу и работает быстро. Запрос WHERE status = 'paid' по-прежнему выбирает Seq Scan, статистика свежая. Как это трактовать?

  • Статистика всё-таки устарела: после `VACUUM ANALYZE` планировщик перейдёт на индекс и станет быстрее
  • Планировщик прав: читать 60% таблицы через индекс дороже последовательного чтения; под редкие статусы разумен частичный индекс
  • Индекс повреждён неполным построением после конкурентного создания — поможет `REINDEX CONCURRENTLY` таблицы
  • Нужно отключить `enable_seqscan` в настройках подключения сервиса, чтобы планировщик всегда предпочитал индекс

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела