linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
Intro
Lessons
Footer
linuxlab-УчебникиЦеныО платформеКонфиденциальность и куки
Copyright © 2026 LinuxLab. Все права защищены.
linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
  • Введение
  • Главы
  • How it worksскоро
  • Уроки
  • База знаний
  • Собеседование
home/postgres/lessons/pg-lab-41-1-work-mem

lesson ── postgres-labs ── ~20 мин ── 4 шагов

work_mem и проливы сортировки на диск

work_mem - лимит памяти на одну операцию сортировки или хеша. Когда его не хватает, операция не падает, а проливается на диск во временные файлы. Ты заставишь сортировку пролиться при маленьком work_mem, увидишь это в EXPLAIN и в накопленном счётчике temp_files, а потом поднимешь work_mem и убедишься, что пролив исчез. Сначала предсказывай метод сортировки, потом проверяй по выводу.

▶ интерактивный sandbox

Поднимется контейнер postgreslab/postgres-base с PostgreSQL 17 и psql. В браузере откроется терминал, база lab уже настроена. Каждый шаг проверяется автоматически. Сеть air-gapped, наружу контейнер не ходит.

запустить sandbox →

stack ── PostgreSQL 17 · psql · 1 GB RAM · air-gapped · самоуничтожается через 45 мин простоя

Шаги

  1. 01

    Сними базовое значение счётчика проливов

    Счётчик temp_files в pg_stat_database считает, сколько временных файлов база создала с момента сброса статистики. Прочитай его:

    sql
    SELECT temp_files FROM pg_stat_database WHERE datname = current_database();

    Предскажи: на свежей базе это, скорее всего, 0.

    ✓ Базовое значение снято. Теперь заставим сортировку пролиться.

  2. 02

    Урежь work_mem и заставь сортировку пролиться

    Поставь маленький work_mem в своей сессии и отсортируй большой набор - он не влезет в 64 КБ и прольётся на диск:

    sql
    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.

  3. 03

    Посмотри объём пролитого на диск

    Счётчик temp_bytes показывает суммарный объём временных файлов.

    sql
    SELECT temp_files, pg_size_pretty(temp_bytes) AS temp
    FROM pg_stat_database WHERE datname = current_database();

    Предскажи: temp_files теперь не ноль, а temp - заметный объём в КБ или МБ.

    ✓ Виден объём проливов. Это прямая цена нехватки work_mem.

  4. 04

    Подними work_mem и повтори

    Теперь дай сортировке достаточно памяти:

    sql
    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();накопленные проливы на диск

концепции

  • · при нехватке work_mem сортировка проливается на диск, а не падает
  • · Sort Method: external merge в плане = пролив; quicksort = в памяти
  • · temp_files в pg_stat_database - накопленный счётчик проливов по базе

← предыдущая

Найди медленный SQL через pg_stat_statements

следующая →

Архив WAL и привязка момента к сегменту

Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки