Sto cercando di far sì che PostgreSQL esegua l'aspirazione automatica del mio database. Al momento ho configurato il vuoto automatico come segue:
- autovacuum_vacuum_cost_delay = 0 # Disattiva il vuoto basato sui costi
- autovacuum_vacuum_cost_limit = 10000 # Valore massimo
- autovacuum_vacuum_threshold = 50 # Valore predefinito
- autovacuum_vacuum_scale_factor = 0.2 # Valore predefinito
Ho notato che il vuoto automatico si attiva solo quando il database non è sotto carico, quindi mi trovo in situazioni in cui ci sono molte più tuple morte che tuple vive. Vedi lo screenshot allegato per un esempio. Uno dei tavoli ha 23 tuple vive ma 16845 tuple morte in attesa di vuoto. È folle!
Il vuoto automatico interviene al termine dell'esecuzione del test e il server di database è inattivo, il che non è quello che desidero in quanto vorrei che il vuoto automatico entrasse in funzione ogni volta che il numero di tuple morte supera il 20% di tuple vive + 50, poiché il database è stato configurato. Il vuoto automatico quando il server è inattivo è inutile per me, poiché il server di produzione dovrebbe colpire migliaia di aggiornamenti / sec per un periodo prolungato, motivo per cui ho bisogno del vuoto automatico per funzionare anche quando il server è sotto carico.
C'è qualcosa che mi manca? Come forzare l'esecuzione del vuoto automatico mentre il server è sotto carico?
Aggiornare
Potrebbe essere un problema di blocco? Le tabelle in questione sono tabelle di riepilogo che vengono popolate tramite un trigger after insert. Queste tabelle sono bloccate in modalità SHARE ROW EXCLUSIVE per impedire scritture simultanee sulla stessa riga.