linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
Intro
Lessons
Footer
linuxlab-УчебникиЦеныО платформеКонфиденциальность и куки
Copyright © 2026 LinuxLab. Все права защищены.
linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
  • Введение
  • Главы
  • How it worksскоро
  • Уроки
  • База знаний
  • Собеседование
home/postgres/kb/Планировщик и оптимизатор/extended-statistics

kb/planner ── Планировщик и оптимизатор ── advanced

Расширенная статистика (CREATE STATISTICS)

По умолчанию планировщик считает колонки независимыми и перемножает селективности - для коррелированных это занижает оценку. CREATE STATISTICS (dependencies, ndistinct, mcv) собирает статистику по группе колонок вместе.

view as markdownaka: create-statistics, multivariate-statistics, column-correlation

Проблема независимости

Планировщик по умолчанию считает условия независимыми: P(A и B) = P(A) × P(B). Для независимых колонок это верно, для коррелированных - грубая ошибка. city = 'СПб' AND country = 'Россия' отбирает столько же строк, сколько одно city = 'СПб', но перемножение даёт заниженную оценку - и под неё выбирается плохой план (см. planner-statistics).

Три вида расширенной статистики

sql
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 до и после.

Где смотреть

sql
SELECT * FROM pg_stats_ext;

§ команды

bash
CREATE STATISTICS s (dependencies) ON a, b FROM t;

Снять предположение независимости для пары колонок

bash
ANALYZE t;

Собрать расширенную статистику (без ANALYZE она пустая)

bash
SELECT * FROM pg_stats_ext;

Посмотреть собранную расширенную статистику

§ см. также

  • planner-statisticsСтатистика планировщика: pg_statsПланировщик не читает данные при планировании - берёт сводку из pg_statistic (view pg_stats), собранную ANALYZE: null_frac, n_distinct, MCV с частотами и гистограмму равной площади. Устаревшая сводка - частый корень плохих планов.
  • selectivity-crossoverСелективность и точка переломаСелективность - доля строк, проходящих условие. Index Scan дёшев при малой доле и круто дорожает; Seq Scan стоит одинаково. Линии пересекаются на единицах процентов - это точка перелома, зависит от random_page_cost.
  • cost-modelСтоимостная модельСтоимость - условные единицы, где последовательное чтение страницы = 1.0. Seq Scan стоит relpages × seq_page_cost + reltuples × cpu_tuple_cost. Планировщик выбирает план с минимальной оценкой, а не «правильный».
Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки