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

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

Стоимостная модель

Стоимость - условные единицы, где последовательное чтение страницы = 1.0. Seq Scan стоит relpages × seq_page_cost + reltuples × cpu_tuple_cost. Планировщик выбирает план с минимальной оценкой, а не «правильный».

view as markdownaka: cost, seq-scan-cost, cost-parameters

Планировщик сравнивает планы по одному числу - оценке стоимости в условных единицах. За единицу взято последовательное чтение одной страницы.

Параметры

sql
SHOW seq_page_cost;        -- 1.0
SHOW random_page_cost;     -- 4.0
SHOW cpu_tuple_cost;       -- 0.01
SHOW cpu_index_tuple_cost; -- 0.005
SHOW cpu_operator_cost;    -- 0.0025

random_page_cost = 4 отражает вращающийся диск; на SSD его часто снижают до 1.1-2.0, делая индексные сканы выгоднее.

Формула Seq Scan

cost = relpages × seq_page_cost + reltuples × cpu_tuple_cost

relpages/reltuples берутся из pg_class (обновляются ANALYZE/VACUUM):

sql
SELECT relpages, reltuples FROM pg_class WHERE relname = 'tickets';

Результат можно сверить с total cost в EXPLAIN до сотых - планировщик считает ту же арифметику.

Кардинальность важнее параметров

Стоимость родительских узлов считается из числа строк (rows), которое отдают дети. Ошибка в оценке строк распространяется вверх и определяет выбор алгоритмов. Откуда берётся оценка - в planner-statistics, как устроены startup/total - в startup-total-cost.

§ команды

bash
SELECT relpages, reltuples FROM pg_class WHERE relname='t';

Размеры таблицы, на которые опирается формула

bash
SET random_page_cost = 1.1;

Удешевить случайный доступ - для SSD, чтобы индексы выбирались чаще

§ см. также

  • startup-total-costStartup cost против total costУ каждого узла два числа: startup cost (до первой строки) и total cost (до всех). У Seq Scan startup ~0, у Sort - большой. LIMIT смещает выбор в пользу плана с маленьким startup.
  • planner-statisticsСтатистика планировщика: pg_statsПланировщик не читает данные при планировании - берёт сводку из pg_statistic (view pg_stats), собранную ANALYZE: null_frac, n_distinct, MCV с частотами и гистограмму равной площади. Устаревшая сводка - частый корень плохих планов.
  • selectivity-crossoverСелективность и точка переломаСелективность - доля строк, проходящих условие. Index Scan дёшев при малой доле и круто дорожает; Seq Scan стоит одинаково. Линии пересекаются на единицах процентов - это точка перелома, зависит от random_page_cost.
Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки