Eu tenho uma grande tabela (vamos chamá-la big_table
de ) em um banco de dados PostgreSQL 12.7 rodando em um servidor Debian GNU/Linux. A máquina possui 8 GB de RAM e 4 núcleos de CPU , sendo a maior parte dedicada a este servidor PostgreSQL.
Atualmente, isso big_table
tem cerca de 103 milhões de linhas que contêm dados de séries temporais (por exemplo, os dados não são atualizados, apenas inseridos ou excluídos). Quase todo mês, excluo cerca de 25 a 30 milhões de linhas dessa tabela. Essas linhas excluídas correspondem a um intervalo de tempo consecutivo (por exemplo, algo como "DELETE ... entre 1 de março e 30 de março"). Essas DELETE
operações levam de 10 a 30 minutos para serem concluídas. Este tipo de padrão de uso está em vigor há mais de 6 meses .
O tamanho da tabela é de aproximadamente 46 GB e os índices dessa tabela somam cerca de 61 GB .
Há um aplicativo que insere 10s de linhas a cada poucos segundos para this big_table
, e outro aplicativo da Web voltado para o usuário que lê essa tabela para plotar alguns valores recentes.
Toda vez que executo a DELETE
operação que exclui de 25 a 30 milhões de linhas (no final do mês), vejo que o AUTOVACUUM entra em ação e começa a funcionar.
Eu queria verificar algumas estatísticas sobre como esses AUTOVACUUM e executei a seguinte consulta SQL nesse banco de dados:
SELECT relname, last_vacuum, vacuum_count, autovacuum_count, last_autovacuum, autoanalyze_count, last_autoanalyze
FROM pg_stat_user_tables
WHERE relname = 'big_table' ;
Para minha surpresa, deu o seguinte resultado:
|relname |last_vacuum|vacuum_count|autovacuum_count|last_autovacuum|autoanalyze_count|last_autoanalyze|
|------------|-----------|------------|----------------|---------------|-----------------|----------------|
|big_Table | |0 |0 | |0 | |
Estou tentando entender o seguinte:
- Por que são
autovacuum_count
eauto_analyzecount
zero ? - Por que são
last_autovacuum
elast_autoanalyze
NULL ?
Infelizmente, a documentação oficial em https://www.postgresql.org/docs/12/monitoring-stats.html não foi muito útil para mim.
- Pode ser o caso de AUTOVACUUM iniciar mas não terminar? E semelhante para ANALISAR?
- Se sim, qual pode ser a causa raiz?
- O que devo verificar para verificar se a aspiração de rotina faz o que deveria fazer?
Se o banco de dados já foi desligado de forma inadequada, todas as estatísticas são redefinidas. Você pode verificar pg_stat_database. Ou eles podem ser redefinidos manualmente, seja para o banco de dados ou para tabelas individuais.
Sim, mas deve haver mensagens no arquivo de log sobre isso.
Por exemplo, se você fizer coisas constantemente como reiniciar o banco de dados ou criar ou descartar índices, isso interromperá o autovacuuming e se você fizer essas coisas com frequência suficiente, o autovacuum pode nunca terminar.