Preciso realizar uma atualização simples em todas as linhas de uma tabela. A tabela tem 40-50 milhões de linhas. A eliminação de índices e restrições durante os UPDATE
resultados resulta em uma grande melhoria de desempenho.
Mas e o autovácuo? O autovacuum pode iniciar um VACUUM
ou ANALYZE
no meio de um UPDATE
? Nesse caso, seria um trabalho inútil que consumiria os recursos da máquina. Eu poderia desativá-lo na tabela antes do UPDATE
e reativá-lo depois:
ALTER TABLE my_table
SET (autovacuum_enabled = false, toast.autovacuum_enabled = false);
-- Drop constraints, drop indexes, and disable unnecessary triggers
UPDATE my_table SET ....;
-- Restore constraints, indexes, and triggers
ALTER TABLE my_table
SET (autovacuum_enabled = true, toast.autovacuum_enabled = true);
Isso funciona mesmo se eu não confirmar depois do primeiro ALTER
?
Além disso, se eu desativá-lo durante o UPDATE
, ele será acionado após a atualização ou ignorará essas atualizações porque foi desativado durante elas? (Minha suspeita é que será executado, mas prefiro ter certeza.)
Estou usando o PG 9.3 agora, mas devo atualizar em breve. Portanto, qualquer menção de mudanças em versões mais recentes é apreciada.
Não
Simplesmente não há sentido.
autovacuum
não limpará nenhuma linha bloqueada em uma transação em execução. Entãoautovacuum
Mas, isso não vai bloquear ou desacelerar a atualização em nenhum sentido significativo que eu saiba.