Селективность условий (см. selectivity-crossover) выводится из статистики, а не из самих данных.
Что собирает ANALYZE
ANALYZE берёт случайную выборку (по умолчанию ~30 000 строк) и кладёт
сводку в pg_statistic. Удобный доступ - через pg_stats:
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.