Сортировка ушла на диск: план и настройка
Вопрос
Запрос SELECT * FROM orders ORDER BY amount выполнялся с work_mem = '256kB'. Заполни пропуск в плане (как называется метод сортировки, который пишет на диск) и параметр, увеличение которого вернёт сортировку в память.
Gather Merge (cost=81382.00..178611.09 rows=833334 width=32) (actual time=402.998..596.602 rows=1000000 loops=1)
Workers Planned: 2
Workers Launched: 2
-> Sort (cost=80381.98..81423.65 rows=416667 width=32) (actual time=394.508..443.503 rows=333333 loops=3)
Sort Key: amount
Sort Method: __(1)__ Disk: 15224kB
...
-- для этого отчёта:
SET __(2)__ = '64MB';
Попробуйте сами
Заполните пропуски по номерам.
Показать ответ и разбор
Коротко
Что в пропусках
external merge
work_mem
Разбор
Если данные для сортировки не помещаются в work_mem, PostgreSQL сортирует их кусками во временных файлах и сливает: Sort Method: external merge Disk: .... В памяти были бы quicksort или, при LIMIT, top-N heapsort. work_mem действует на каждую операцию сортировки или хеширования отдельно и в каждом воркере, поэтому его поднимают точечно (SET в сессии или SET LOCAL в транзакции отчёта), а не глобально. Часто лучше вовсе убрать сортировку индексом по ключу сортировки или выбрать меньше колонок.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.