Non penso che sia necessario aspirare manualmente, a meno che non si inizi a vedere un peggioramento delle prestazioni. Tuttavia, consiglio vivamente di rivedere le impostazioni del vuoto e del vuoto automatico e modificarlo in base alle proprie esigenze
Per visualizzare le tue impostazioni correnti, esegui questa query:
SELECT *
FROM pg_settings
WHERE name LIKE '%vacuum%'
La maggior parte dei campi si spiega da sé, ma ecco la documentazione su di essi:
https://www.postgresql.org/docs/current/static/runtime-config-autovacuum.html
Direi che il tuo obiettivo dovrebbe essere quello di configurare l'autovacuum per pulire la spazzatura in modo coerente, ma non eseguire costantemente l'autovacuum
Le impostazioni più importanti sono:
- autovacuum_vacuum_scale_factor : determina la percentuale di tuple che possono essere morte prima dell'attivazione di una pulizia. Valore predefinito = 0,2
- autovacuum_vacuum_threshold : numero minimo di tuple morte prima dell'attivazione della pulizia. Valore predefinito = 50
La soglia aiuta a impedire che il processo di pulizia venga attivato troppo spesso per i tavoli di piccole dimensioni.
Le impostazioni predefinite funzionano bene, a meno che tu non abbia tabelle molto grandi. In poche parole, se ti capita di avere una tabella che richiede 100 GB, accumulerai rifiuti da 20 GB, prima che venga attivato il vuoto automatico. Pertanto, di solito consiglio di impostare un fattore di scala basso. Quanto in basso dovresti determinare da solo. Uso 0,05 sul mio progetto attuale
Le soglie possono anche essere aumentate. Molte applicazioni hanno un paio di tabelle, che vengono spesso aggiornate e 50 tuple non sono poi così tante. Aumentare quello a 1000 non dovrebbe comportare alcun problema, ma ovviamente dovresti considerare il tuo caso
Puoi anche mettere a punto l'autovacuum e avere impostazioni diverse per alcuni dei tuoi tavoli
ALTER TABLE your_table SET (autovacuum_vacuum_scale_factor = 0.05);
Se configuri scale_factor e soglie dovresti andare bene. È inoltre possibile aumentare autovacuum_vacuum_cost_limit
, che per impostazione predefinita è uguale a vacuum_cost_limit
, che è impostato su 200. Questa è una caratteristica molto importante del vuoto, che non consente di consumare tutte le risorse e consente all'applicazione di operare con i dati anche durante il processo di aspirazione , ma il valore predefinito è troppo basso. L'aumento a 1000 non dovrebbe comportare ritardi significativi, ma consentirà al processo del vuoto di terminare molto più velocemente
Naturalmente, puoi anche eseguire il vuoto manualmente. In un caso molto semplice, puoi avere un semplice cron job, che effettuerà una pulizia completa ogni notte, quando al tuo DB non si accede frequentemente
Spero possa aiutare!