Загружаем изображение…
PostgreSQL может избежать полной сортировки таблицы при ORDER BY ... LIMIT!
Большинство думает, что
Если нужен только top-10 результат, PostgreSQL не обязан сортировать миллионы строк полностью. Вместо этого он держит в памяти только N лучших строк во время scan.
Это видно прямо в execution plan:
Особенно интересно становится на огромных таблицах, где полный sort мог бы уйти на диск:
Даже при маленьком
А если добавить подходящий индекс:
PostgreSQL вообще сможет обойтись без Sort и просто сделать Index Scan в нужном порядке.
SQL Ready | #совет
Большинство думает, что
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 | #совет