lesson ── postgres-labs ── ~24 мин ── 4 шагов
Планировщик не читает данные - он смотрит в сводку. Достанем гистограмму,
предскажем оценку строк руками, потом сломаем планировщика
коррелированными колонками и починим расширенной статистикой. Запусти
psql во вкладке client.
интерактивный sandbox
Поднимется контейнер postgreslab/postgres-base с PostgreSQL 17 и psql. В браузере откроется терминал, база lab уже настроена. Каждый шаг проверяется автоматически. Сеть air-gapped, наружу контейнер не ходит.
stack ── PostgreSQL 17 · psql · 1 GB RAM · air-gapped · самоуничтожается через 45 мин простоя
ANALYZE tickets;
SELECT histogram_bounds FROM pg_stats
WHERE tablename = 'tickets' AND attname = 'flight_id';
Это границы корзин равной площади: в каждой примерно одинаковая доля строк.
100 корзин = по ~1% строк в каждой.
✓ Гистограмма собрана - по ней можно предсказывать селективность.
Выбери X посередине диапазона flight_id. По числу корзин правее X
предскажи долю строк с flight_id > X. Затем сверь:
EXPLAIN SELECT * FROM tickets WHERE flight_id > 25;
rows в плане должно отвечать предсказанной доле.
Доля = (число корзин правее X) / (всего корзин).
✓ Оценка rows отвечает доле корзин правее значения.
Колонки departure и arrival у нас коррелированы. Сравни оценку с фактом:
EXPLAIN ANALYZE SELECT * FROM flights WHERE departure='SVO' AND arrival='LED';
estimated rows занижено: планировщик перемножил селективности, считая колонки независимыми.
P(A и B) = P(A) × P(B) неверно для коррелированных колонок.
✓ Оценка занижена - вот цена предположения о независимости.
CREATE STATISTICS f_da (dependencies) ON departure, arrival FROM flights;
ANALYZE flights;
EXPLAIN ANALYZE SELECT * FROM flights WHERE departure='SVO' AND arrival='LED';
Теперь estimated rows ближе к actual: планировщик учёл зависимость.
CREATE STATISTICS без ANALYZE пуста - не забудь ANALYZE.
✓ Расширенная статистика создана - оценка коррелированных условий исправлена.
Планировщик берёт сводку из pg_stats: MCV (частые значения с точными частотами) и гистограмму равной площади. Селективность диапазона предсказывается по числу корзин. Слабое место - предположение о независимости колонок; CREATE STATISTICS (dependencies) его снимает.
команды
SELECT histogram_bounds FROM pg_stats WHERE tablename='t' AND attname='c';посмотреть гистограммуCREATE STATISTICS s (dependencies) ON a, b FROM t;расширенная статистика для корреляцииконцепции