Em algumas ocasiões, e depois de fazer um maciço update
, insert
ou delete
a partir de uma mesa, eu comecei um VACUUM FULL ANALYZE
para garantir que a DB não estava sendo muito inchado. Fazer isso em um banco de dados de produção me permitiu descobrir que não era uma boa ideia, porque eu poderia bloquear a tabela por um longo período de tempo. Então, cancelei o processo, talvez tentei apenas VACUUM
(não completo) ou deixei AUTOVACUUM
fazer mais tarde o que puder.
A pergunta é: se eu interromper um VACUUM ou AUTOVACUUM "no meio do caminho", todo o processamento já está perdido?
Por exemplo, se você VACUUM
já encontrou 1 milhão 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 número muito bom de processos do PostgreSQL)?
Se o 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, aguarde 10 ms para permitir o bloqueio do resto do mundo ... e assim por diante]. Eu sei que você pode fazer parte disso ajustando os parâmetros de vácuo automático, mas estou pensando na possibilidade de controlar isso programaticamente, de fazê-lo em determinados momentos / sob certas condições.
NOTA: Parar / cancelar / eliminar o processo significa neste contexto:
- Se estiver usando o pgAdmin, pressione o botão "Cancelar consulta".
- Se estiver trabalhando programaticamente, chame pg_cancel_backend ().
Presumo que ambos sejam equivalentes. Eu não usei nenhum comando kill / shell no nível do sistema.
fonte
vacuum_cost_page_hit
evacuum_cost_page_miss
para zero.