В плане стоимость узла записана как 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.