# Статистика планировщика: pg_stats _Планировщик и оптимизатор · PostgreSQL Knowledge Base_ **TL;DR:** Планировщик не читает данные при планировании - берёт сводку из pg_statistic (view pg_stats), собранную ANALYZE: null_frac, n_distinct, MCV с частотами и гистограмму равной площади. Устаревшая сводка - частый корень плохих планов. Селективность условий (см. [selectivity-crossover](/courses/postgres/kb/selectivity-crossover.md)) выводится из статистики, а не из самих данных. ## Что собирает 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](/courses/postgres/kb/extended-statistics.md). ## Команды ```sql ANALYZE tablename; ``` Пересобрать статистику таблицы ```sql SELECT histogram_bounds FROM pg_stats WHERE tablename='t' AND attname='c'; ``` Посмотреть гистограмму колонки ## См. также - [Селективность и точка перелома](/courses/postgres/kb/selectivity-crossover.md) - [Расширенная статистика (CREATE STATISTICS)](/courses/postgres/kb/extended-statistics.md) - [Стоимостная модель](/courses/postgres/kb/cost-model.md)