Планировщик ожидал 300 строк, а получил 420 000. И дело может быть не только в индексе. — 14 июля 2026 г. в 15:59:00.413
Планировщик ожидал 300 строк, а получил 420 000. И дело может быть не только в индексе. Фрагмент фактического плана: rows=300 actual rows=420000 Фильтр: status = 'paid' AND paid_at IS NOT NULL Если запрос медленный, первая мысль часто такая: «Добавим ещё один индекс». Но здесь важно другое: PostgreSQL ожидал сотни строк, а получил сотни тысяч. Такое расхождение влияет на весь план. Одна из причин — связанные колонки. Например, status = 'paid' и paid_at IS NOT NULL могут описывать почти одно и то же бизнес-состояние. Если обычной статистики недостаточно для учёта этой связи, планировщик может занизить количество строк. Что проверить: — насколько actual rows отличается от rows; — обновлялась ли статистика после изменений данных; — есть ли зависимость между колонками в фильтре; — уместны ли extended statistics по комбинации колонок; — не пытаемся ли мы лечить ошибку оценки только новым индексом. Вывод: новый индекс не всегда решает проблему плохого плана. Иногда сначала нужно понять, почему планировщик ожидал 300 строк, а получил 420 000. #УЦФОРС #PostgreSQL #SQL #ОптимизацияЗапросов #DBA

