In alcune occasioni, e dopo aver fatto un grosso update, inserto deleteda un tavolo, ho iniziato VACUUM FULL ANALYZEa assicurarmi che il DB non si stesse gonfiando troppo. Farlo in un database di produzione mi ha fatto scoprire che questa non era una buona idea, perché avrei potuto bloccare la tabella per un lungo periodo di tempo. Quindi, ho annullato il processo, forse ho provato solo VACUUM(non completo) o lasciato AUTOVACUUMfare dopo tutto ciò che può fare.
La domanda è: se interrompo un VACUUM o AUTOVACUUM "a metà strada", tutta l'elaborazione è già stata persa?
Ad esempio, se VACUUMho già trovato 1 M di file morte e lo interrompo, tutte queste informazioni vengono perse? VACUUM funziona in modo completamente transazionale ("tutto o niente", come un ottimo numero di processi PostgreSQL)?
Se VACUUM può essere interrotto in modo sicuro senza perdere tutto il lavoro, c'è un modo per farlo in modo vacuumincrementale? [Lavora per 100 ms, fermati, attendi 10 ms per consentire di non bloccare il resto del mondo ... e così via]. So che puoi fare parte di questo sintonizzando i parametri di autovacuum, ma sto pensando di essere in grado di controllarlo a livello di programmazione, di essere in grado di farlo in determinati momenti / a determinate condizioni.
NOTA: interrompere / annullare / terminare il processo significa in questo contesto:
- Se si utilizza pgAdmin, premere il pulsante "Annulla query".
- Se funziona a livello di codice, chiama pg_cancel_backend ().
Presumo che entrambi siano equivalenti. Non ho usato alcun comando kill a livello di shell / sistema.