Nessa altura, pode rolar aquela dúvida: por que a gente tem duas ferramentas diferentes pra análise? Qual delas é mais usada: EXPLAIN ANALYZE ou pg_stat_statements? Bora entender esses dois jeitos, os pontos fortes e fracos de cada um, e onde e quando usar cada um deles.
O que cada ferramenta resolve
EXPLAIN ANALYZE: é a ferramenta pra analisar a fundo uma query específica. Se tu quer saber como o PostgreSQL executa uma query, quais nodes ele usa, quantas linhas ele processa e quanto tempo cada operação leva, é essa aqui que tu vai usar. Ela responde à pergunta: "Por que essa query específica tá lenta?"
pg_stat_statements: é a ferramenta pra monitorar tudo de um jeito mais geral, mostrando info de performance de todas as queries que rolam no banco. Usa ela se tu quer ver o panorama geral: "Quais queries no meu banco são as mais lentas?" ou "Quais queries tão pesando mais no servidor?"
Quando usar EXPLAIN ANALYZE
EXPLAIN ANALYZE é tipo tua ferramenta de debug pra entender como o PostgreSQL executa uma query específica. Usa ela nesses casos:
Otimização pontual de query Se alguém reclamou que uma página do teu app tá demorando uma vida pra carregar, a primeira coisa é achar a query responsável e rodar um EXPLAIN ANALYZE. Isso vai te mostrar o plano de execução e as métricas reais, tipo tempo de execução e quantidade de linhas processadas.
Escolha do índice certo Quando tu cria um índice novo ou muda um já existente, usa EXPLAIN ANALYZE pra ver se o PostgreSQL tá usando esse índice. Se não tiver, talvez o índice não tá ajudando a otimizar as queries.
Debug de queries complexas Se tu tá escrevendo uma query cheia de JOIN ou WHERE, analisar o plano real com EXPLAIN ANALYZE vai te ajudar a achar gargalos, tipo aqueles Seq Scan desnecessários.
Exemplo: Otimizando uma query com EXPLAIN ANALYZE
-- Query que tá lenta
SELECT *
FROM students
WHERE name = 'Alice';
-- Analisando o plano de execução
EXPLAIN ANALYZE
SELECT *
FROM students
WHERE name = 'Alice';
Se tu ver que tá rolando um Seq Scan, pode ser que tu esqueceu de criar um índice:
-- Criando índice na coluna name
CREATE INDEX idx_students_name ON students(name);
-- Testando de novo
EXPLAIN ANALYZE
SELECT *
FROM students
WHERE name = 'Alice';
Quando usar pg_stat_statements
Essa ferramenta é indispensável pra analisar a performance do sistema todo. Usa ela nesses cenários:
Monitoramento em produção pg_stat_statements mostra estatísticas das queries executadas num certo período. Tu acha fácil as queries mais lentas olhando a coluna total_time, que mostra o tempo total gasto em cada query.
Achar queries "pesadas" Quer saber quais queries mais pesam no teu banco? Ordena elas pela quantidade de leitura de memória (shared_blks_hit) ou pelo número de linhas processadas (rows).
Descobrir queries que rodam toda hora Às vezes, não é só uma query demorada que dá problema, mas também aquelas que rodam o tempo todo. Tipo, se uma query roda 100 vezes por minuto, até uma otimização pequena pode aliviar bastante o servidor.
Exemplo: Encontrando queries lentas com pg_stat_statements
-- Vendo estatísticas das queries
SELECT query,
calls,
total_time,
rows
FROM pg_stat_statements
ORDER BY total_time DESC
LIMIT 5;
Essa query mostra o top 5 das queries que mais consomem tempo.
Comparando os dois jeitos: qual a diferença?
| Critério | EXPLAIN ANALYZE | pg_stat_statements |
|---|---|---|
| Foco da análise | Uma query específica | Monitoramento global de todas as queries |
| Nível de detalhe | Dados reais de cada node do plano | Estatística resumida de cada query |
| Contexto | Usado durante o desenvolvimento | Usado em ambiente de produção |
| Execução necessária | Executa a query e mede o tempo | Não executa queries, só agrega dados |
| Facilidade de configuração | Não precisa configurar nada | Precisa instalar a extensão |
| Consumo de recursos | Medição pontual | Coleta contínua de estatísticas depende da carga |
Usando as duas ferramentas juntas
Como tudo em programação, não existe botão mágico que resolve tudo. O melhor jeito é usar as duas ferramentas juntas. Por exemplo:
Usa o
pg_stat_statementspra achar as queries mais lentas ou mais frequentes no teu sistema.Depois, analisa essas queries com
EXPLAIN ANALYZEpra entender o motivo delas estarem problemáticas.
Exemplo prático: abordagem completa
-- Passo 1: Achar a query mais lenta
SELECT query, total_time, calls
FROM pg_stat_statements
ORDER BY total_time DESC
LIMIT 1;
-- Passo 2: Analisar essa query
EXPLAIN ANALYZE
<copie a query do passo anterior>;
Erros comuns ao usar essas ferramentas
Ao trabalhar com EXPLAIN ANALYZE e pg_stat_statements, tem uns vacilos que a galera que tá começando costuma cometer:
Esquecer de usar dados reais. Se tu analisa uma query numa tabela vazia, o resultado do
EXPLAIN ANALYZEpode te enganar. Garante que teu banco de testes tem volumes de dados parecidos com o real.Ignorar o consumo de recursos do monitoramento. Se tu ativou o
pg_stat_statementsno servidor de produção, garante que ele tá bem configurado e não tá pesando demais.Ler só o plano teórico e não o real. Lembra que só o
EXPLAINmostra o plano teórico da query. UsaEXPLAIN ANALYZEpra ver os dados reais.
Agora tu já tá com tudo que precisa pra não só resolver queries lentas, mas também evitar que elas apareçam. O PostgreSQL tem ferramentas poderosas, e saber usar elas junto é o segredo pra tirar o máximo de performance até nos sistemas mais puxados.
GO TO FULL VERSION