Выбор ответа Senior EXPLAIN и оптимизация обновлено

work_mem = 1GB и падение базы по памяти

Вопрос

Чтобы отчёты не писали на диск, админ выставил глобально work_mem = 1GB на сервере с 64 ГБ и max_connections = 200. Через день база упала из-за нехватки памяти. Почему?

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

Выберите вариант, и откроется разбор.

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

Коротко

Правильный ответ: Это лимит на каждую сортировку или хеш, и запрос берёт его многократно. workmem ограничивает память одной операции: каждого узла Sort, Hash, HashAggregate, причём в каждом параллельном воркере, а хеш-операции могут взять ещё больше (hashmemmultiplier, по умолчанию 2).

Варианты ответа

  1. work_mem выделяется один раз на весь сервер, значит дело в другом
  2. work_mem резервируется целиком сразу при подключении каждого клиента
  3. work_mem действует только для VACUUM, а отчёты тут ни при чём
  4. Это лимит на каждую сортировку или хеш, и запрос берёт его многократноправильный ответ

Разбор

work_mem ограничивает память одной операции: каждого узла Sort, Hash, HashAggregate, причём в каждом параллельном воркере, а хеш-операции могут взять ещё больше (hash_mem_multiplier, по умолчанию 2). Сложный запрос с пятью такими узлами и двумя воркерами может занять 15 × 1 ГБ, а таких запросов идут десятки. Резервируется память по мере надобности, а не при подключении, но в пике хватит и этого. Правильно оставить глобальное значение скромным (десятки мегабайт) и поднимать его точечно для отчётов через SET LOCAL или настройку роли. Для VACUUM и CREATE INDEX есть отдельный maintenance_work_mem.

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

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

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