Quali operazioni utilizzano work_mem?

Tra le operazioni che possono utilizzare work_mem troviamo:

  • ORDER BY
  • GROUP BY
  • DISTINCT
  • JOIN
  • UNION
  • INTERSECT
  • operazioni di aggregazione e hashing

Ad esempio:

SELECT *
FROM users
ORDER BY name;

Per eseguire l'ORDER BY, PostgreSQL può utilizzare memoria fino al limite definito da work_mem.

work_mem è per operazione

Un aspetto importante è che work_mem non viene riservata una sola volta per query.

Una stessa query può eseguire diverse operazioni che utilizzano work_mem e ogni operazione può avere il proprio utilizzo di memoria.

Per questo motivo:

work_mem = 64 MB

non significa necessariamente che una query consumerà al massimo 64 MB di RAM.

Una query complessa potrebbe utilizzare più operazioni contemporaneamente, aumentando il consumo complessivo.

Perché è importante?

Un valore troppo basso può causare un maggiore utilizzo del disco durante operazioni di ordinamento o hashing, con possibili rallentamenti.

Un valore troppo alto, invece, può causare un consumo elevato di RAM quando vengono eseguite molte query contemporaneamente.

La configurazione deve quindi essere valutata insieme a:

  • RAM disponibile
  • numero di connessioni concorrenti
  • complessità delle query
  • tipo di workload

Come visualizzo il valore attuale?

Per visualizzare il valore attuale che viene utilizzato attualmente dalla tua configurazione Postgres puoi utilizzare il seguente comando:

SHOW work_mem;

Esempio:

4MB

Modificarlo temporaneamente

È possibile modificarlo per la sessione corrente:

SET work_mem = '64MB';

In questo modo il valore modificato vale solo per la connessione corrente.

Come posso modificarlo per una singola transazione?

SET LOCAL work_mem = '64MB';

Con SET LOCAL, il valore resta valido fino alla fine della transazione.

Come posso configurarlo globalmente?

Il valore può essere impostato anche nella configurazione di PostgreSQL postgresql.conf, ad esempio:

work_mem = 64MB

È possibile invece impostarlo globalmente, tramite query su tutto il cluster PostgreSQL, attraverso il seguente comando:

ALTER SYSTEM SET work_mem = '64MB';

È importante non aumentarlo indiscriminatamente: poiché più operazioni e più sessioni possono utilizzare memoria contemporaneamente, un valore elevato può portare rapidamente a un consumo significativo di RAM.

In sintesi

work_mem definisce il limite di memoria utilizzabile da una singola operazione di una query, non la quantità di RAM assegnata all'intera query, alla sessione o al database.