TL;DR - Não tenho o coletor ativado (ainda) e parece não ser o padrão; quão ruim é isso e devo ativá-lo?
Acabei de criar um novo índice em uma tabela onde uma consulta estava lenta.
Eu fiz isso executando
Explain
a consulta e criando índices em várias combinações das colunas das tabelas/consultas.Perdi os índices que não estavam sendo usados depois de correr
Explain
novamente, mantendo o que foi usadoEntão decidi verificar as estatísticas reunidas para aquela tabela. Acontece que
SELECT schemaname, relname, last_analyze FROM pg_stat_all_tables WHERE relname = '<MY TABLE>';
estava retornando NULL como para a última análise.Verificando o
postgresql.conf
eu identifiquei que atualmente não estou analisando nada...
...
#------------------------------------------------------------------------------
# STATISTICS
#------------------------------------------------------------------------------
# - Query and Index Statistics Collector -
#track_activities = on
#track_counts = on
#track_io_timing = off
#track_functions = none # none, pl, all
#track_activity_query_size = 1024 # (change requires restart)
#stats_temp_directory = 'pg_stat_tmp'
...
Minhas perguntas
- O planejador de consultas ainda tem inteligência suficiente para saber quando ir para um índice versus fazer uma varredura de tabela completa etc.?
- Quando se deve considerar a ativação do Coletor de Estatísticas de Consulta e Índice? (Sempre, apenas em certas circunstâncias, ...)
O coletor de estatísticas já está ativado, não se preocupe.
Observe que as estatísticas que o coletor de estatísticas reúne não são estatísticas de tabela que o otimizador usa, mas dados sobre a carga de trabalho do banco de dados.
As estatísticas da tabela são coletadas por autovacuum, que também é habilitado por padrão.
Existe uma conexão entre ambos, em que o autovacuum conta com as estatísticas coletadas pelo coletor de estatísticas para saber quando deve
ANALYZE
uma tabela.Você está confuso com as configurações no arquivo conf que está sendo comentado? Ser comentado não significa que está desativado, significa que tem seu valor padrão compilado, que é
on
para track_activities e track_counts. (Eu também ativaria track_io_timings - não é usado pelo planejador, mas fornece boas informações para você).Os dados em "pg_stat_all_tables" não são muito duráveis. Ele é perdido toda vez que o servidor trava ou sofre um desligamento imediato, ou pg_stat_reset() é chamado. Agora, todas essas coisas devem ser muito raras em um servidor de produção, mas talvez você não esteja usando um servidor de produção para seus testes e, de qualquer forma, elas nem sempre são tão raras quanto deveriam ser. Se você olhar para pg_stats em vez disso, isso lhe dará uma ideia melhor se a análise realmente já foi executada na mesa.