# Startup cost против total cost _Планировщик и оптимизатор · PostgreSQL Knowledge Base_ **TL;DR:** У каждого узла два числа: startup cost (до первой строки) и total cost (до всех). У Seq Scan startup ~0, у Sort - большой. LIMIT смещает выбор в пользу плана с маленьким startup. В плане стоимость узла записана как `cost=startup..total`. ## Два числа - **startup cost** - работа до выдачи первой строки; - **total cost** - работа до выдачи всех строк. У Seq Scan startup близок к нулю: первую строку отдают сразу. У Sort startup большой - чтобы отдать первую строку, надо отсортировать всё: ``` Sort (cost=39.27..40.52 rows=500 ...) ← startup 39.27 -> Seq Scan on tickets (cost=0.00..9.00 ...) ``` ## Почему это важно: LIMIT Без `LIMIT` планы сравниваются по total cost. С `LIMIT 10` важна стоимость первых десяти строк, и план с маленьким startup выигрывает. `ORDER BY x LIMIT 10` с индексом по `x` уходит в Index Scan: индекс отдаёт строки уже отсортированными, startup мал. Seq Scan + Sort обязан обработать всё до первой строки - его startup огромен. Поэтому `LIMIT` - не пост-обработка готового результата, а вход в стоимостную модель, способный сменить сам план. Откуда берутся сами числа - в [cost-model](/courses/postgres/kb/cost-model.md). ## Команды ```sql EXPLAIN SELECT * FROM t ORDER BY x; ``` Увидеть большой startup у Sort ```sql EXPLAIN SELECT * FROM t ORDER BY x LIMIT 10; ``` С LIMIT план может уйти в Index Scan ради малого startup ## См. также - [Стоимостная модель](/courses/postgres/kb/cost-model.md) - [Методы доступа: Seq, Index, Bitmap, Index-Only](/courses/postgres/kb/access-methods.md) - [Статистика планировщика: pg_stats](/courses/postgres/kb/planner-statistics.md)