Você quer saber por que uma consulta do PostgreSQL é lenta? Então EXPLAIN ANALYZE é um ótimo ponto de partida. Mas os planos de consulta podem depender de outras atividades do servidor, podem demorar um pouco para serem executados e podem mudar ao longo do tempo, portanto, se você quiser ver os planos de execução reais de suas consultas mais lentas, o auto_explain é a ferramenta necessária. Neste post, veremos o que ele faz, como configurá-lo e como usar esses logs para acelerar suas consultas.
O que é auto_explain?
auto_explain é uma extensão do PostgreSQL que permite registrar os planos de consulta para consultas mais lentas que um limite (configurável). Isso é incrivelmente útil para depurar consultas lentas, especialmente aquelas que às vezes são problemáticas. É um dos módulos de contribuição, portanto pode ser instalado e configurado facilmente no PostgreSQL normal, e é tão útil que o temos por padrão no ScaleGrid.
Muito obrigado a Takahiro Itagaki, o principal autor por trás da primeira versão do auto_explain (commit, thread), Dean Rasheed, cujo patch inicial e sugestão foi baseado, e os muitos colaboradores e revisores desde então.
Quais parâmetros auto_explain devo usar?
A seguir, discutiremos os parâmetros mais importantes, mas revise a tabela abaixo ou a documentação oficial para obter mais informações sobre o conjunto completo de coisas que você pode acompanhar.
O parâmetro mais importante para auto_explain é log_min_duration
. Por padrão, isso é definido como -1
, o que significa que nada será registrado - então, se quisermos alguns logs, precisamos alterá-lo! A unidade padrão é ms, portanto, uma configuração de 100
registrará os planos de consulta para todas as consultas que excederem 100ms. Isso é o que escolhemos como padrão no ScaleGrid, mas pode ser configurado em Admin -> Config. Se, por algum motivo, você quiser registrar o plano de consulta para cada consulta, você pode definir isso como 0
– mas cuidado, isso pode ter sérias implicações de desempenho.
Como as consultas já estão sendo executadas no servidor, você provavelmente também deseja habilitar auto_explain.log_analyze
. Isso torna a saída equivalente à execução de EXPLAIN ANALYZE
. Por padrão, isso também significa que os tempos por operação são rastreados. Isso vem com alguma sobrecarga adicional, que pode ser minimizada desativando auto_explain.log_timing
(ativado por padrão com log_analyze
). Naturalmente, porém, os tempos por operação são muito úteis ao depurar consultas lentas! Nossos testes internos mostraram sobrecargas aceitáveis para isso, portanto, está ativado por padrão no ScaleGrid, mas, como sempre, teste sua carga de trabalho para ver se a sobrecarga é aceitável no seu caso. Atualmente, há informações públicas limitadas sobre esse tópico, mas uma postagem recente da equipe pgMustard mostrou que, pelo menos em uma pequena carga de trabalho transacional, a sobrecarga pode ser tão baixa quanto 2%. Como eles observaram, isso pode ser reduzido com o auto_explain.sample_rate
parâmetro, ao custo de rastrear apenas um subconjunto de suas consultas.
O parâmetro final que discutiremos em detalhes é auto_explain.log_format
. A saída padrão é TEXT, que provavelmente é o que você está mais familiarizado ao usar EXPLAIN
.
Aqui está um exemplo simples de como a saída auto_explain no formato TEXT pode se parecer:
2021-09-10 15:32:04.606 BST [22770] LOG: duration: 3184.383 ms plan: Query Text: select * from table1 order by column1; Sort (cost=12875.92..13125.92 rows=100000 width=37) (actual time=2703.799..3055.401 rows=100000 loops=1) Sort Key: column1 Sort Method: external merge Disk: 4696kB Buffers: shared hit=837, temp read=587 written=589 -> Seq Scan on table (cost=0.00..1834.01 rows=100000 width=37) (actual time=0.033..27.795 rows=100000 loops=1) Buffers: shared hit=834
Você pode ver aqui que você obtém a duração da consulta no início, que você pode estar acostumado a ver no final dos planos de consulta normalmente. Você também verá o texto da consulta, incluindo quaisquer parâmetros.
As ferramentas de visualização populares Explain.depesz e Explain.dalibo aceitam planos de consulta no formato TEXT, mas também suportam o formato JSON. Se alguns de sua equipe preferirem usar ferramentas como PEV e pgMustard, que suportam apenas o formato JSON, talvez você queira definir isso como o formato. Para clientes no ScaleGrid, optamos pelo formato JSON, em parte porque queríamos analisá-lo mais facilmente para nosso próprio recurso de análise de consulta lenta.
Aqui está uma lista completa dos parâmetros auto_explain e seus padrões:
Parâmetro | Padrões PostgreSQL | Padrões do ScaleGrid |
---|---|---|
auto_explain.log_min_duration | -1 | 100 |
auto_explain.log_analyze | Desativado | Ligado |
auto_explain.log_timing | Ligado (com log_analyze) | Ligado |
auto_explain.log_buffers | Desativado | Ligado |
auto_explain.log_verbose | Desativado | Ligado |
auto_explain.log_triggers | Desativado | Desativado |
auto_explain.log_nested_statements | Desativado | Desativado |
auto_explain.log_settings (v12) | Desativado | Desativado |
auto_explain.log_wal (v13) | Desativado | Desativado |
auto_explain.log_format | TEXTO | JSON |
auto_explain.log_level | LOG | LOG |
auto_explain.sample_rate | 1 | 1 |
Instalando auto_explain
No ScaleGrid, auto_explain está ativado por padrão, com um limite de 100ms. Você pode configurar isso em Admin -> Config.
No Vanilla PostgreSQL, você pode instalar o auto_explain simplesmente adicionando-o a uma das Assim, uma configuração básica para auto_explain pode ser assim: Se você estiver usando um provedor de hospedagem diferente, vale a pena verificar se eles suportam auto_explain. Por exemplo, o RDS Postgres tem, mas ao contrário do ScaleGrid, ele está desativado por padrão, então você precisará editar a configuração para executá-lo. Se você não quiser que o auto_explain seja executado em sessões automaticamente, como superusuário, você também tem a opção de carregá-lo em uma única sessão: Isso pode ser incrivelmente útil para sessões de depuração únicas, mas naturalmente é desnecessário se você já puder executá-lo. Já mencionamos alguns deles de passagem, mas parece um momento sensato para nos lembrarmos de algumas das desvantagens e limitações do auto_explain. Em primeiro lugar, especialmente ao rastrear os tempos por operação, pode haver uma sobrecarga mensurável ao usar auto_explain. Pode ser baixo, mesmo com os tempos sendo medidos, mas como sempre vale a pena fazer seus próprios testes. Em segundo lugar, os tempos de auto_explain são exclusivos do tempo de planejamento da consulta. O tempo de planejamento geralmente é pequeno em consultas lentas, mas, em casos excepcionais, pode ser responsável pela maior parte do problema. Como tal, lembre-se de que esses casos podem não aparecer em seus logs ou, se aparecerem, uma discrepância com o que você está vendo na latência total pode estar relacionada ao tempo de planejamento. Um manual Depois de ter a saída de explicação para suas consultas mais lentas, você pode começar a acelerá-las! Você precisará obter os planos de consulta dos logs, para os quais você pode usar o pgBadger se não estiver usando um serviço gerenciado que faça isso para você. Revisar os planos EXPLAIN é um tópico enorme por si só. A documentação do PostgreSQL inclui uma boa, mas breve introdução ao uso do EXPLAIN, e o artigo do Thoughbot sobre a leitura do EXPLAIN ANALYZE é um bom próximo passo. Se você preferir uma conversa de uma hora, EXPLAIN Explained por Josh Berkus foi excelente. Para mais informações, Depesz tem uma série de posts chamados Explicando o inexplicável e a equipe pgMustard tem um glossário EXPLAIN bastante abrangente. Se você precisar de ajuda de especialistas do PostgreSQL para gerenciar seus bancos de dados e acelerar suas consultas lentas, experimente o ScaleGrid. Fornecemos suporte de nível empresarial gratuito 24 horas por dia, 7 dias por semana, que pode orientá-lo nessas consultas lentas e ajudá-lo a otimizá-las. Nossa avaliação gratuita de 30 dias oferece muito tempo para você experimentar nossos diversos recursos para o PostgreSQL e nossos outros bancos de dados suportados. Esperamos que isso dê a você tudo o que você precisa para começar com o auto_explain e começar a acelerar as consultas lentas que você tiver. Se houver mais alguma coisa que você gostaria de saber, entre em contato. session_preload_libraries
ou shared_preload_libraries
. O primeiro tem as vantagens de a) não exigir reinicialização (mas só será carregado em novas sessões) eb) possibilitar ativá-lo apenas para alguns usuários (definindo este parâmetro com ALTER ROLE SET ).
session_preload_libraries = auto_explain
auto_explain.log_min_duration = 100
auto_explain.log_analyze = true
auto_explain.log_buffers = true
auto_explain.log_format = JSON
Carregando auto_explain em uma única sessão
LOAD 'auto_explain';
auto_explain limitações e pegadinhas
EXPLAIN ANALYZE
irá ajudá-lo rapidamente a identificar isso.
Como usar a saída de explicação para acelerar as consultas