Проблема независимости
Планировщик по умолчанию считает условия независимыми:
P(A и B) = P(A) × P(B). Для независимых колонок это верно, для
коррелированных - грубая ошибка. city = 'СПб' AND country = 'Россия'
отбирает столько же строк, сколько одно city = 'СПб', но перемножение
даёт заниженную оценку - и под неё выбирается плохой план (см.
planner-statistics).
Три вида расширенной статистики
CREATE STATISTICS s (dependencies, ndistinct, mcv)
ON departure, arrival FROM flights;
ANALYZE flights;
dependencies- функциональные зависимости между колонками; планировщик перестаёт перемножать их селективности;ndistinct- число различных комбинаций группы колонок (важно дляGROUP BYпо нескольким колонкам);mcv- частые комбинации значений нескольких колонок сразу.
После CREATE STATISTICS и ANALYZE оценка rows для коррелированных
условий приближается к фактической, и план исправляется. Проверить
эффект - сравнить estimated и actual rows в EXPLAIN ANALYZE до и после.
Где смотреть
SELECT * FROM pg_stats_ext;