Recentemente, encontrei um problema estranho ao migrar do PG 9.4 => 11
Eu repliquei o servidor de produção do PG 9.4 para o PG 11 usando pglogical
. Tudo funcionou bem, exceto que descobrimos que algumas consultas complexas demoravam dezenas de segundos no servidor PG 11, enquanto no servidor 9.4 demoravam menos de um segundo.
Acontece que a execução ANALYZE
no novo servidor corrigiu as consultas lentas. Então, eu verifiquei $PGDATA/pg_stat
e $PGDATA/pg_stat_tmp
descobri que eles estavam vazios em ambos os servidores!
Onde o PG armazena as estatísticas? (Pergunta de acompanhamento - não pglogical
coleta estatísticas enquanto está replicando?)
Editar/acompanhar:
Saída da consulta no pg_stat_user_tables
novo servidor PG 11 -
select analyze_count,autoanalyze_count, count(*) from pg_stat_user_tables group by 1,2;
analyze_count | autoanalyze_count | count
---------------+-------------------+-------
1 | 11 | 1
4 | 7 | 1
1 | 0 | 14
4 | 0 | 168
(4 rows)
Mesma consulta no servidor PG 9.4 antigo (servidor de produção atual):
analyze_count | autoanalyze_count | count
---------------+-------------------+-------
0 | 13 | 3
0 | 226 | 1
0 | 1 | 31
0 | 5 | 6
0 | 21 | 2
0 | 16 | 2
0 | 601 | 1
0 | 8 | 1
0 | 20 | 1
0 | 4 | 2
0 | 9 | 2
0 | 10 | 2
0 | 12 | 1
0 | 7 | 2
0 | 41 | 1
0 | 2 | 11
0 | 6 | 1
0 | 3 | 8
0 | 731 | 1
0 | 39 | 1
0 | 11 | 1
0 | 0 | 99
0 | 50 | 1
0 | 66 | 1
0 | 241 | 1
0 | 14 | 2
Existem dois tipos diferentes de estatísticas, e você as está confundindo. Uma é sobre as distribuições de valores nas colunas da tabela e coisas assim. Eles são mantidos na tabela pg_catalog.pg_statistic e na visualização mais amigável pg_stats. Esta é uma tabela de banco de dados mais ou menos normal. Estes são coletados por ANALYZE e/ou VACUUM, ou seus equivalentes "auto".
O outro tipo de estatística registra quantas atualizações, inserções, etc. ocorreram em cada tabela. Em um servidor ativo, você pode ver esses dados usando as visualizações
pg_stat_user_tables
e amigos, mas não há tabelas reais subjacentes a essas visões. Essas estatísticas afetam o primeiro tipo de estatísticas, porque são usadas para decidir com que frequência ANALYZE e VACUUM são executados automaticamente. Eles são armazenados fora das tabelas normais do banco de dados, em "pg_stats_tmp" (ou qualquer outro "stats_temp_directory" definido se não for o padrão) quando o servidor estiver em execução e movidos para pg_stat para armazenamento a frio enquanto o servidor estiver desligado. Após uma falha, todos esses dados são descartados. Se ambos os diretórios estiverem vazios, talvez você tenha desativado "track_counts" ou talvez tenha definido "stats_temp_directory" como um valor não padrão e, portanto, está procurando no lugar errado. Ou talvez tenha havido um acidente recentemente e eles ainda não foram reconstruídos.Se você tiver "track_counts" ou "autovacuum" desativado, isso explicaria a falta de estatísticas recentes. Ou, se você preencheu o novo banco de dados com extrema rapidez, talvez a análise automática ainda não tenha tido a chance de fazer suas coisas. Se nenhum desses for o caso, então você teria que considerar se não há estatísticas (da variedade pg_stats) ou se elas existiam, mas não eram recentes o suficiente. Executar esta consulta pode ajudá-lo a descobrir isso:
Mas há uma boa chance de você nunca conseguir chegar a uma conclusão definitiva, a menos que esteja disposto a recriar a situação do zero e fuçar nela.
Você encontrará muitas informações na documentação .
Particularmente, você encontrará informações sobre estatísticas armazenadas na
pg_stats
visualização (documentação aqui ), mas precisará de permissão de leitura nas tabelas do seu esquema para poder ver os dados nelas. Não se esqueça de verificar se está conectado ao banco de dados correto.Saúde,