Estou usando o PostgreSQL 9.1 no Ubuntu. O agendamento VACUUM ANALYZE
ainda é recomendado ou o vácuo automático é suficiente para atender a todas as necessidades?
Se a resposta for "depende", então:
- Eu tenho um banco de dados largish (tamanho de despejo compactado de 30 GiB, diretório de dados de 200 GiB)
- Eu faço ETL no banco de dados, importando perto 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)
- Crio rollups por hora e, a partir daí, relatórios diários, semanais e mensais
Estou perguntando porque o agendado VACUUM ANALYZE
está afetando meus relatórios. Ele é executado por mais de 5 horas e tive que eliminá-lo duas vezes esta semana, porque estava afetando as importações regulares de bancos de dados. check_postgres
não relata inchaço significativo no banco de dados, então isso não é realmente um problema.
A partir dos documentos, o autovacuum deve também cuidar da identificação da transação. A pergunta permanece: eu ainda preciso de um VACUUM ANALYZE
?
postgresql
etl
vacuum
François Beausoleil
fonte
fonte
Respostas:
VACUUM é necessário apenas em linhas atualizadas ou excluídas em tabelas não temporárias. Obviamente, você está fazendo muitas INSERTs, mas não é óbvio pela descrição que você também está fazendo muitas UPDATEs ou DELETEs.
Essas operações podem ser rastreadas com a
pg_stat_all_tables
visualização, especificamente as colunasn_tup_upd
en_tup_del
. Além disso, ainda mais ao ponto, há uman_dead_tup
coluna que diz, por tabela, quantas linhas precisam ser aspiradas. (consulte Monitorando estatísticas no documento para obter funções e visualizações relacionadas à coleta de estatísticas).Uma estratégia possível no seu caso seria suprimir o VACUUM agendado, mantendo um olho nessa visão e verificando em quais tabelas as tabelas
n_dead_tup
estão subindo significativamente. Em seguida, aplique o VACUUM agressivo apenas nessas tabelas. Isso será uma vitória se houver tabelas grandes cujas linhas nunca serão excluídas nem atualizadas e o VACUUM agressivo é realmente necessário apenas em tabelas menores.Mas continue executando o ANALYZE para que o otimizador sempre tenha novas estatísticas.
fonte
Não vejo nada na sua pergunta que
autovacuum
não resolvesse. Depende em grande parte do padrão de suas atividades de escrita . Você menciona 3 milhões de novas linhas por semana, masINSERT
(ouCOPY
) normalmente não cria inchaço na tabela e no índice. (autovacuum
apenas é necessário 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 da tabela e do índice, especialmente ao direcionar 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 tender a interferir na sua carga de trabalho, consulte também "Atraso no vácuo com base em custos" . A aspiração manual deve ser uma exceção rara.Se você tiver muitos
UPDATE
s aleatórios , convém configurá-loFILLFACTOR
para algo menor que 100, para permitir atualizações HOT imediatamente e reduzir a necessidadeVACUUM
. Mais sobre atualizações HOT:Observe também que as tabelas temporárias precisam do manual
VACUUM
&ANALYZE
. Cito o manual emCREATE TABLE
:fonte
Embora eu concorde que o melhor é usar os recursos automáticos, em vez de executá-lo em todo o banco de dados, na maioria dos casos, é necessário um ajuste de tabela.
Eu não concordo totalmente com a escolha de design do postgres para unir o vácuo e a análise. Vi várias instâncias em que bancos de dados fazem muitas inserções / atualizações, mas pequenas exclusões nunca são realizadas e começam a ter um desempenho ruim.
A solução é ir para as tabelas que são muito usadas e estão sujeitas a consultas grandes e definir as configurações de análise automática para essas tabelas para algo onde elas estão sendo analisadas uma vez ou a cada dois dias.
Você pode acessar as configurações por tabela no gui na guia auto aspirador e verá as configurações de análise que podem ser definidas independentemente do vácuo.
As configurações acabam na tabela de relações e podem ser vistas com a consulta
e um valor de amostra de uma análise agressiva pode ser
Para ver quando a última vez que suas tabelas foram analisadas automaticamente
fonte
ANALYZE
, como o PostgreSQL saberá que as estatísticas mudaram? E como você pode determinar que é issoANALYZE
que leva muito tempo? Ao mesmo tempo, embora não esteja claro qual GUI mencionada acima, você está certo nas configurações específicas por tabela que podem ser úteis.