postgres tempfile work_mem sort - ghdrako/doc_snipets GitHub Wiki

  1. Włączenie logowania tworzenia plików tymczasowych
log_line_prefix = '%m [%p] %u@%d '  
  • %m to timestamp,
  • %p to PID procesu,
  • %u to user,
  • %d to database.
# loguj wszystkie pliki tymczasowe większe niż 0 KB
log_temp_files = 0

# (opcjonalnie) jeśli chcesz logować tylko duże pliki, np. > 1 MB
# log_temp_files = 1024

Przeladowanie konfiguracji:

sudo systemctl reload postgresql
pg_ctl reload -D /ścieżka/do/data
2025-05-14 14:22:11.123 CEST [12345] app_user@mydb LOG:  temporary file: path "base/pgsql_tmp/pgsql_tmp12345.0" size  10485760
  1. Wlaczenie rejestracji zapytan
log_statement = 'all'               # loguje WSZYSTKIE zapytania
log_min_duration_statement = 0      # loguj WSZYSTKIE zapytania i ich czasy
2025-05-14 15:00:01.234 CEST [12345] user@db LOG:  statement: SELECT * FROM big_table ORDER BY col;
...
2025-05-14 15:00:01.567 CEST [12345] user@db LOG:  temporary file: path "base/pgsql_tmp/..." size 10485760
  1. Podnoszenie work_mem
  • Globalnie w postgresql.conf:
work_mem = '16MB'
  • dotyczy wszystkich nowych sesji.
ALTER ROLE twoj_uzytkownik SET work_mem = '32MB';
  • Per-session ad hoc:
    SET work_mem = '64MB';
Uwaga: work_mem jest przydzielane per-operacja w zapytaniu. Jeśli masz w jednym zapytaniu np. trzy sorty i dwa hash-joiny, każda z tych operacji może dostać do work_mem tyle pamięci. Uważaj więc, żeby nie przekroczyć pamięci RAM na serwerze.