lesson ── postgres-labs ── ~20 мин ── 4 шагов
work_mem - лимит памяти на одну операцию сортировки или хеша. Когда его не хватает, операция не падает, а проливается на диск во временные файлы. Ты заставишь сортировку пролиться при маленьком work_mem, увидишь это в EXPLAIN и в накопленном счётчике temp_files, а потом поднимешь work_mem и убедишься, что пролив исчез. Сначала предсказывай метод сортировки, потом проверяй по выводу.
интерактивный sandbox
Поднимется контейнер postgreslab/postgres-base с PostgreSQL 17 и psql. В браузере откроется терминал, база lab уже настроена. Каждый шаг проверяется автоматически. Сеть air-gapped, наружу контейнер не ходит.
stack ── PostgreSQL 17 · psql · 1 GB RAM · air-gapped · самоуничтожается через 45 мин простоя
Счётчик temp_files в pg_stat_database считает, сколько временных файлов база создала с момента сброса статистики. Прочитай его:
SELECT temp_files FROM pg_stat_database WHERE datname = current_database();
Предскажи: на свежей базе это, скорее всего, 0.
✓ Базовое значение снято. Теперь заставим сортировку пролиться.
Поставь маленький work_mem в своей сессии и отсортируй большой набор - он не влезет в 64 КБ и прольётся на диск:
SET work_mem = '64kB';
EXPLAIN (ANALYZE) SELECT g FROM generate_series(1, 300000) AS g ORDER BY g;
Предскажи, что покажет строка Sort Method: quicksort (в памяти) или external merge (на диске с указанием Disk)? Найди её в выводе.
Ищи в выводе EXPLAIN строку, начинающуюся с 'Sort Method:'.
✓ Сортировка пролилась: temp_files вырос, Sort Method был external merge.
Счётчик temp_bytes показывает суммарный объём временных файлов.
SELECT temp_files, pg_size_pretty(temp_bytes) AS temp
FROM pg_stat_database WHERE datname = current_database();
Предскажи: temp_files теперь не ноль, а temp - заметный объём в КБ или МБ.
✓ Виден объём проливов. Это прямая цена нехватки work_mem.
Теперь дай сортировке достаточно памяти:
SET work_mem = '64MB';
EXPLAIN (ANALYZE) SELECT g FROM generate_series(1, 300000) AS g ORDER BY g;
Предскажи: Sort Method станет quicksort (целиком в памяти), без строки Disk. Счётчик temp_files от прошлого пролива остаётся - он накопительный и не уменьшается, но новых проливов этот прогон не добавил.
✓ С большим work_mem сортировка уместилась в памяти - quicksort без Disk.
work_mem - лимит на одну операцию сортировки/хеша. При нехватке операция проливается на диск (external merge, temp-файлы), а не падает. Сигнал виден в EXPLAIN (Sort Method) и в pg_stat_database (temp_files).
команды
SET work_mem = '64kB';уменьшить лимит в сессии - для демонстрации проливаEXPLAIN (ANALYZE) SELECT ... ORDER BY ...;увидеть Sort Method в планеSELECT temp_files, temp_bytes FROM pg_stat_database WHERE datname=current_database();накопленные проливы на дискконцепции