Большинство думает, что
ORDER BY всегда сортирует вообще всю таблицу. Но в PostgreSQL для LIMIT есть отдельная оптимизация — Top-N Heap Sort.SELECT *
FROM orders
ORDER BY created_at DESC
LIMIT 10;
Если нужен только top-10 результат, PostgreSQL не обязан сортировать миллионы строк полностью. Вместо этого он держит в памяти только N лучших строк во время
scan.Это видно прямо в
execution plan:Sort Method: top-N heapsort
Особенно интересно становится на огромных таблицах, где полный
sort мог бы уйти на диск:SET work_mem = '4MB';
EXPLAIN ANALYZE
SELECT *
FROM events
ORDER BY created_at DESC
LIMIT 50;
Даже при маленьком
work_mem PostgreSQL может избежать полной сортировки всех строк и работать заметно быстрее именно благодаря оптимизации Top-N.А если добавить подходящий индекс:
CREATE INDEX idx_events_created_at
ON events (created_at DESC);
🔥 PostgreSQL вообще сможет обойтись без Sort и просто сделать Index Scan в нужном порядке.
➡️ SQL Ready | #совет
