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

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

Селективность и точка перелома

Селективность - доля строк, проходящих условие. Index Scan дёшев при малой доле и круто дорожает; Seq Scan стоит одинаково. Линии пересекаются на единицах процентов - это точка перелома, зависит от random_page_cost.

view as markdownaka: selectivity, crossover-point

Селективность определяет, какой метод доступа выгоднее (см. access-methods).

Что такое селективность

Это доля строк таблицы, удовлетворяющих условию. flight_id = 7 может иметь селективность 0.2% (мало строк), departure = 'SVO' - 80% (много). Планировщик выводит её из статистики (см. planner-statistics) и умножает на число строк, получая оценку rows.

Точка перелома

стоимость
  │  Seq Scan  ──────────────────  (не зависит от доли)
  │        ╱  Index Scan (круто растёт: random I/O на строку)
  │     ╱
  └──┴──────────────────── доля строк
     ^ перелом (~2-5%)

Index Scan дёшев при малой доле, но каждая строка - случайное обращение к таблице (random_page_cost), поэтому стоимость растёт быстро. Seq Scan читает всё последовательно за одну цену. Левее перелома выгоден индекс, правее - Seq Scan, в середине - Bitmap Heap Scan.

От чего зависит место перелома

В первую очередь от random_page_cost. Снизишь его (например, на SSD) - индексный доступ станет дешевле, и перелом сдвинется вправо: индекс будет выбираться на большей доле строк.

sql
EXPLAIN SELECT * FROM big WHERE k = 7;     -- мало строк → Index/Bitmap
EXPLAIN SELECT * FROM big WHERE k < 900;   -- много строк → Seq Scan

§ команды

bash
EXPLAIN SELECT * FROM t WHERE col = 'rare';

Узкое условие - ожидается индексный доступ

bash
SET random_page_cost = 1.1;

Сдвинуть точку перелома вправо (индекс выгоден на большей доле)

§ см. также

  • access-methodsМетоды доступа: Seq, Index, Bitmap, Index-OnlyЧетыре способа достать строки: Seq Scan (всё подряд), Index Scan (мало строк, random I/O), Bitmap Heap Scan (средняя доля, страницы пачкой), Index-Only Scan (данные из индекса, если visibility map подтверждает).
  • cost-modelСтоимостная модельСтоимость - условные единицы, где последовательное чтение страницы = 1.0. Seq Scan стоит relpages × seq_page_cost + reltuples × cpu_tuple_cost. Планировщик выбирает план с минимальной оценкой, а не «правильный».
  • planner-statisticsСтатистика планировщика: pg_statsПланировщик не читает данные при планировании - берёт сводку из pg_statistic (view pg_stats), собранную ANALYZE: null_frac, n_distinct, MCV с частотами и гистограмму равной площади. Устаревшая сводка - частый корень плохих планов.
Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки