Em algumas ocasiões, e depois de fazer um enorme update
, insert
ou delete
de uma tabela, iniciei um VACUUM FULL ANALYZE
para ter certeza de que o banco de dados não estava ficando muito inchado. Fazer isso em um banco de dados de produção me permitiu descobrir que isso não era uma boa ideia, porque eu poderia bloquear a tabela por um longo período de tempo. Então, eu cancelei o processo, talvez tentei apenas VACUUM
(não completo) ou deixe AUTOVACUUM
fazer mais tarde o que puder fazer.
A questão é: se eu parar um VACUUM ou AUTOVACUUM "no meio do caminho", todo o processamento já feito é perdido?
Por exemplo, se VACUUM
já encontrei 1 M de linhas mortas e eu paro, todas essas informações são perdidas? O VACUUM funciona de maneira totalmente transacional ("tudo ou nada", como um bom número de processos do PostgreSQL)?
Se VACUUM puder ser interrompido com segurança sem que todo o trabalho seja perdido, existe alguma maneira de fazer o vacuum
trabalho de forma incremental? [Trabalhe por 100 ms, pare, espere 10 ms para permitir o não bloqueio do resto do mundo... e assim por diante]. Eu sei que você pode fazer parte disso ajustando os parâmetros do autovacuum, mas estou pensando em poder controlar isso programaticamente, poder fazê-lo em determinados momentos / sob certas condições.
NOTA: Parar / cancelar / matar o processo significa neste contexto:
- Se estiver usando o pgAdmin, pressione o botão "Cancelar consulta".
- Se estiver trabalhando programaticamente, chame pg_cancel_backend().
Suponho que ambos sejam equivalentes. Eu não usei nenhum comando kill no nível do shell/sistema.
O trabalho feito por um VACUUM FULL interrompido será totalmente perdido, pois ele simplesmente voltará a usar a versão anterior da tabela e jogará fora a versão em andamento da tabela.
O trabalho feito por um VACUUM regular (não-FULL) pode não ser totalmente perdido. Ele limpa índices em lotes, e todos os lotes que foram totalmente limpos não precisarão ser limpos novamente. Eles ainda precisarão ser inspecionados novamente, mas serão encontrados já limpos na próxima vez. Portanto, você pode salvar algumas E/S de gravação que não precisarão ser repetidas.