Планировщик сравнивает планы по одному числу - оценке стоимости в условных единицах. За единицу взято последовательное чтение одной страницы.
Параметры
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):
SELECT relpages, reltuples FROM pg_class WHERE relname = 'tickets';
Результат можно сверить с total cost в EXPLAIN до сотых - планировщик
считает ту же арифметику.
Кардинальность важнее параметров
Стоимость родительских узлов считается из числа строк (rows), которое отдают дети. Ошибка в оценке строк распространяется вверх и определяет выбор алгоритмов. Откуда берётся оценка - в planner-statistics, как устроены startup/total - в startup-total-cost.