📚 В плане появился external merge Disk. Нужно ли сразу повышать work_mem?

Артефакт:

Sort Method: external merge Disk: 184320kB Buffers: shared hit=42817 read=6932, temp read=23140 written=23208

Это значит: сортировка не поместилась в доступную рабочую память и использовала временное дисковое пространство.

Но это ещё не готовая настройка.

work_mem применяется не один раз на весь запрос. В одном плане могут быть несколько операций:

Sort Hash Hash Join HashAggregate ещё один Sort

Каждая может использовать память отдельно. Плюс есть parallel workers и другие запросы на сервере.

Поэтому опасно делать вывод:

увидели Disk → подняли work_mem глобально

Сначала проверьте:

— какой узел пишет во временные файлы; — сколько строк пришло на вход; — почему промежуточный набор такой большой; — сколько Sort/Hash-операций в плане; — есть ли параллельность; — сколько таких запросов работает одновременно; — какие work_mem и hash_mem_multiplier действуют сейчас.

Disk не равен нужному значению work_mem. temp read и temp written — не размер одного временного файла.

Иногда решение — не память, а более ранний фильтр, другая форма JOIN, проверка DISTINCT или ORDER BY, уменьшение диапазона данных или подходящий индекс.

Но индекс — только диагностическая ветка, не автоматический ответ на любой Sort.

Важно: EXPLAIN ANALYZE реально выполняет запрос. Для DML-команд он реально выполняет изменение данных. На production это нужно оценивать отдельно.

Вывод: временный файл — симптом. Решение выбирают после анализа узла плана, входного объёма, числа операций и конкурентности.

Сохраните признаки, по которым видно, что запрос начал платить диском за сортировку или hash-операции.

🔹🔹🔹🔹

📚 В плане появился external merge Disk | Сетка — социальная сеть от hh.ru