Планировщик игнорирует новый индекс на малоселективной колонке
На таблице 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` в настройках подключения сервиса, чтобы планировщик всегда предпочитал индекс
