Estou usando o PostgreSQL 9.1 no Ubuntu. O agendamento VACUUM ANALYZE
ainda é recomendado, ou o autovacuum é suficiente para atender todas as necessidades?
Se a resposta for "depende", então:
- Eu tenho um banco de dados grande (tamanho de despejo compactado de 30 GiB, diretório de dados de 200 GiB)
- Faço ETL no banco de dados, importando cerca de 3 milhões de linhas por semana
- As tabelas com as alterações mais frequentes são todas herdadas de uma tabela mestre, sem dados na tabela mestre (os dados são particionados por semana)
- Eu crio rollups por hora e, a partir daí, relatórios diários, semanais e mensais
Estou perguntando porque a programação VACUUM ANALYZE
está impactando na minha reportagem. Ele é executado por mais de 5 horas e tive que matá-lo duas vezes esta semana, porque estava afetando as importações regulares do banco de dados. check_postgres
não relata nenhum inchaço significativo no banco de dados, então isso não é realmente um problema.
A partir dos documentos, o autovacuum também deve cuidar do envolvimento do ID da transação. A questão permanece: eu ainda preciso de um VACUUM ANALYZE
?
VACUUM só é necessário em linhas atualizadas ou excluídas em tabelas não temporárias. Obviamente você está fazendo muitos INSERTs, mas não é óbvio pela descrição que você também está fazendo muitos UPDATEs ou DELETEs.
Essas operações podem ser rastreadas com a
pg_stat_all_tables
exibição, especificamente as colunasn_tup_upd
e .n_tup_del
Além disso, ainda mais importante, há uman_dead_tup
coluna que informa, por tabela, quantas linhas precisam ser limpas. (consulte Monitorando estatísticas no documento para funções e visualizações relacionadas à coleta de estatísticas).Uma estratégia possível no seu caso seria suprimir o VACUUM agendado, ficando de olho nessa view e verificando em quais tabelas ela
n_dead_tup
está subindo significativamente. Em seguida, aplique o VACUUM agressivo apenas a essas tabelas. Isso será uma vitória se houver tabelas grandes cujas linhas nunca sejam excluídas nem atualizadas e o VACUUM agressivo for realmente necessário apenas em tabelas menores.Mas continue executando o ANALYZE para que o otimizador tenha sempre estatísticas atualizadas.
Não vejo nada na sua pergunta que
autovacuum
não resolva. Depende muito do padrão de suas atividades de escrita . Você menciona 3 milhões de novas linhas por semana, masINSERT
(ouCOPY
) normalmente não cria tabelas e índices inchados. (autovacuum
só tem que cuidar das estatísticas da coluna , do mapa de visibilidade e de alguns trabalhos menores).UPDATE
eDELETE
são a causa dominante do inchaço de tabelas e índices, especialmente ao segmentar linhas aleatórias. Não vejo nada disso na sua pergunta.autovacuum
percorreu um longo caminho e está fazendo um ótimo trabalho no Postgres 9.1 ou posterior. Eu daria uma olhada nasautovacuum
configurações . Se a aspiração tende a interferir com sua carga de trabalho, também dê uma olhada em "Atraso de vácuo baseado em custo" . A aspiração manual deve ser a rara exceção.Se você tiver muitos s aleatórios
UPDATE
, talvez queira definir oFILLFACTOR
para algo menor que 100, para permitir atualizações HOT imediatamente e reduzir a necessidade deVACUUM
. Mais sobre atualizações HOT:Observe também que as tabelas temporárias precisam de manual
VACUUM
&ANALYZE
. Cito o manual sobreCREATE TABLE
:Embora eu concorde que é melhor usar os recursos automáticos em vez de executá-los em todo o banco de dados, na maioria dos casos é necessário o ajuste por tabela.
Não concordo muito com a escolha de design do postgres para unir vácuo e análise, já vi vários casos em que bancos de dados que fazem muita inserção/atualização, mas pouca exclusão, nunca são analisados e começam a ter um desempenho ruim.
A solução é entrar nas tabelas que são muito usadas e estão sujeitas a grandes consultas e definir as configurações de análise automática dessas tabelas para algo em que elas sejam analisadas uma vez ou a cada dois dias.
Você pode acessar as configurações por tabela no gui na guia de vácuo automático e verá as configurações de análise que podem ser definidas independentemente do vácuo.
As configurações acabam na tabela de opções e podem ser vistas com a consulta
e um valor amostral de uma análise agressiva pode ser
Para ver quando foi a última vez que suas tabelas foram analisadas automaticamente