Database
 sql >> Base de Dados >  >> RDS >> Database

Introdução ao auto_explain:como registrar automaticamente planos de consulta lentos do Postgres

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 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 ).

Assim, uma configuração básica para auto_explain pode ser assim:

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

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.

Carregando auto_explain em uma única sessão

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:

LOAD 'auto_explain';

Isso pode ser incrivelmente útil para sessões de depuração únicas, mas naturalmente é desnecessário se você já puder executá-lo.

auto_explain limitações e pegadinhas

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 EXPLAIN ANALYZE irá ajudá-lo rapidamente a identificar isso.

Como usar a saída de explicação para acelerar as consultas

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.