Пропуски Middle EXPLAIN и оптимизация обновлено

Сортировка ушла на диск: план и настройка

Вопрос

Запрос 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';

Попробуйте сами

Заполните пропуски по номерам.

1
2
Показать ответ и разбор

Коротко

Если данные для сортировки не помещаются в workmem, PostgreSQL сортирует их кусками во временных файлах и сливает: Sort Method: external merge Disk: ....

Что в пропусках

1

external merge

2

work_mem

Разбор

Если данные для сортировки не помещаются в work_mem, PostgreSQL сортирует их кусками во временных файлах и сливает: Sort Method: external merge Disk: .... В памяти были бы quicksort или, при LIMIT, top-N heapsort. work_mem действует на каждую операцию сортировки или хеширования отдельно и в каждом воркере, поэтому его поднимают точечно (SET в сессии или SET LOCAL в транзакции отчёта), а не глобально. Часто лучше вовсе убрать сортировку индексом по ключу сортировки или выбрать меньше колонок.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме