Quali operazioni utilizzano work_mem?
Tra le operazioni che possono utilizzare work_mem troviamo:
ORDER BYGROUP BYDISTINCTJOINUNIONINTERSECT- 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.