In alcune occasioni, e dopo aver fatto un grosso update
, insert
o delete
da un tavolo, ho iniziato VACUUM FULL ANALYZE
a 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 AUTOVACUUM
fare 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 VACUUM
ho 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 vacuum
incrementale? [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.