# Стоимостная модель _Планировщик и оптимизатор · PostgreSQL Knowledge Base_ **TL;DR:** Стоимость - условные единицы, где последовательное чтение страницы = 1.0. Seq Scan стоит relpages × seq_page_cost + reltuples × cpu_tuple_cost. Планировщик выбирает план с минимальной оценкой, а не «правильный». Планировщик сравнивает планы по одному числу - оценке стоимости в условных единицах. За единицу взято последовательное чтение одной страницы. ## Параметры ```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](/courses/postgres/kb/planner-statistics.md), как устроены startup/total - в [startup-total-cost](/courses/postgres/kb/startup-total-cost.md). ## Команды ```sql SELECT relpages, reltuples FROM pg_class WHERE relname='t'; ``` Размеры таблицы, на которые опирается формула ```sql SET random_page_cost = 1.1; ``` Удешевить случайный доступ - для SSD, чтобы индексы выбирались чаще ## См. также - [Startup cost против total cost](/courses/postgres/kb/startup-total-cost.md) - [Статистика планировщика: pg_stats](/courses/postgres/kb/planner-statistics.md) - [Селективность и точка перелома](/courses/postgres/kb/selectivity-crossover.md)