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/Планировщик и оптимизатор/planner-statistics

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

Статистика планировщика: pg_stats

Планировщик не читает данные при планировании - берёт сводку из pg_statistic (view pg_stats), собранную ANALYZE: null_frac, n_distinct, MCV с частотами и гистограмму равной площади. Устаревшая сводка - частый корень плохих планов.

view as markdownaka: pg-stats, histogram, most-common-vals

Селективность условий (см. selectivity-crossover) выводится из статистики, а не из самих данных.

Что собирает ANALYZE

ANALYZE берёт случайную выборку (по умолчанию ~30 000 строк) и кладёт сводку в pg_statistic. Удобный доступ - через pg_stats:

sql
ANALYZE flights;
SELECT attname, null_frac, n_distinct, most_common_vals, histogram_bounds
FROM pg_stats WHERE tablename = 'flights';
ПолеСмысл
null_fracдоля NULL
n_distinctчисло различных значений
most_common_vals / most_common_freqsчастые значения и их частоты
histogram_boundsграницы корзин для остальных значений

MCV и гистограмма

Частые значения вынесены в MCV с точными частотами - по ним оценка почти идеальна. Остальные описывает гистограмма: корзины равной площади (в каждой ~1% строк при 100 корзинах), поэтому селективность диапазона оценивается ровно по всему диапазону. Длину MCV и гистограммы задаёт default_statistics_target (по умолчанию 100).

Устаревшая статистика

Сводка - снимок на момент ANALYZE. После массовой загрузки данных она врёт, пока не обновлена. Симптом - расхождение rows (оценка) и actual в EXPLAIN ANALYZE. Лечение - ANALYZE, особенно сразу после загрузки. Для коррелированных колонок нужна extended-statistics.

§ команды

bash
ANALYZE tablename;

Пересобрать статистику таблицы

bash
SELECT histogram_bounds FROM pg_stats WHERE tablename='t' AND attname='c';

Посмотреть гистограмму колонки

§ см. также

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