Оптимизация временных файлов в PostgreSQL: мониторинг log_temp_files
- Запросы выполняются медленно из-за интенсивных операций записи и чтения в каталоге
base/pgsql_tmp. - В логах PostgreSQL появляются записи вида:
LOG: temporary file: path "...", size 524288000 bytes. - Метрики
temp_bytesиtemp_filesвpg_stat_databaseнепрерывно растут.
1. Включение логирования генерации временных файлов
Отредактируйте postgresql.conf, чтобы логировать все временные файлы размером более 1MB:
# Логировать сброс на диск файлов от 1024 килобайт (0 = логировать все)
log_temp_files = 1024
log_min_duration_statement = 250SELECT pg_reload_conf();2. Анализ суммарного объема временных файлов по базам
SELECT datname, temp_files, pg_size_pretty(temp_bytes) AS temp_size
FROM pg_stat_database
ORDER BY temp_bytes DESC;3. Поиск медленного запроса и анализ плана EXPLAIN
EXPLAIN (ANALYZE, BUFFERS)
SELECT customer_id, count(*), sum(amount)
FROM payments
GROUP BY customer_id
ORDER BY sum(amount) DESC;Если в выводе присутствует Sort Method: external merge Disk: 15420kB вместо quicksort Memory, запросу не хватает work_mem.
4. Точечная корректировка памяти
Увеличьте work_mem для конкретного проблемного пользователя/сервиса:
ALTER USER reporting_service SET work_mem = '256MB'; Частые вопросы (FAQ)
Почему сброс сортировки на диск (external merge Disk) критичен для производительности?
Операции в оперативной памяти выполняются в сотни раз быстрее, чем создание, запись, повторное чтение и удаление временных файлов на дисковом накопителе.
Как ограничить максимальный размер временных файлов для защиты диска?
Задайте параметр temp_file_limit (в килобайтах) в postgresql.conf. При превышении лимита одним запросом PostgreSQL аварийно отменит этот запрос.