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/lessons/pg-lab-26-1-planner-statistics

lesson ── postgres-labs ── ~24 мин ── 4 шагов

Предскажи селективность и почини корреляцию

Планировщик не читает данные - он смотрит в сводку. Достанем гистограмму, предскажем оценку строк руками, потом сломаем планировщика коррелированными колонками и починим расширенной статистикой. Запусти psql во вкладке client.

▶ интерактивный sandbox

Поднимется контейнер postgreslab/postgres-base с PostgreSQL 17 и psql. В браузере откроется терминал, база lab уже настроена. Каждый шаг проверяется автоматически. Сеть air-gapped, наружу контейнер не ходит.

запустить sandbox →

stack ── PostgreSQL 17 · psql · 1 GB RAM · air-gapped · самоуничтожается через 45 мин простоя

Шаги

  1. 01

    Достань гистограмму

    sql
    ANALYZE tickets;
    SELECT histogram_bounds FROM pg_stats
    WHERE tablename = 'tickets' AND attname = 'flight_id';

    Это границы корзин равной площади: в каждой примерно одинаковая доля строк.

    подсказка

    100 корзин = по ~1% строк в каждой.

    ✓ Гистограмма собрана - по ней можно предсказывать селективность.

  2. 02

    Предскажи селективность диапазона

    Выбери X посередине диапазона flight_id. По числу корзин правее X предскажи долю строк с flight_id > X. Затем сверь:

    sql
    EXPLAIN SELECT * FROM tickets WHERE flight_id > 25;

    rows в плане должно отвечать предсказанной доле.

    подсказка

    Доля = (число корзин правее X) / (всего корзин).

    ✓ Оценка rows отвечает доле корзин правее значения.

  3. 03

    Сломай планировщика корреляцией

    Колонки departure и arrival у нас коррелированы. Сравни оценку с фактом:

    sql
    EXPLAIN ANALYZE SELECT * FROM flights WHERE departure='SVO' AND arrival='LED';

    estimated rows занижено: планировщик перемножил селективности, считая колонки независимыми.

    подсказка

    P(A и B) = P(A) × P(B) неверно для коррелированных колонок.

    ✓ Оценка занижена - вот цена предположения о независимости.

  4. 04

    Почини расширенной статистикой

    sql
    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;расширенная статистика для корреляции

концепции

  • · статистика - снимок ANALYZE, а не живые данные
  • · MCV хранит частые значения, гистограмма - остальные корзинами равной площади
  • · по умолчанию колонки независимы, селективности перемножаются
  • · CREATE STATISTICS чинит оценку коррелированных колонок

← предыдущая

Воспроизведи стоимость Seq Scan вручную

следующая →

Проведи запрос от Seq Scan до Index-Only Scan

Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки