pg_stat_statements é uma extensão nativa do PostgreSQL que deixa você de olho no que realmente tá rolando no banco e como as queries se comportam. Basicamente, é tipo aquele assistente silencioso mas super atento, que anota cada passo: quais queries SQL rodaram, quanto tempo demoraram, quantas vezes foram executadas e o quanto pesaram no sistema.
Pra que serve isso? Primeiro, pra achar as queries problemáticas. Às vezes o banco fica lento não por causa de um vilão só, mas por causa de várias queries pesadas rodando toda hora. Segundo, as estatísticas ajudam a ver quais queries estão devorando recursos — CPU, memória, disco. E ainda dá pra sacar se os índices tão funcionando como você planejou: pode ser que em algum lugar eles nem estejam sendo usados, ou então tá faltando índice onde precisava.
pg_stat_statements te permite parar de chutar e ver os números reais — aí sim dá pra tirar conclusões e otimizar de verdade.
Como achar queries lentas?
Agora começa a parte legal! Usando a tabela pg_stat_statements, dá pra caçar aquelas queries que demoram pra rodar ou que tão sobrecarregando o servidor.
A ideia principal:
Cada linha na tabela pg_stat_statements mostra as estatísticas de uma query. As queries são agrupadas pelo texto (campo query), e pra cada uma delas são calculadas essas métricas:
total_time— tempo total de execução da query, em milissegundos.calls— número de execuções da query.mean_time— tempo médio de execução da query (total_time / calls).rows— quantidade de linhas que a query retornou.
Exemplo de análise simples
Bora achar as queries mais lentas pelo tempo médio de execução:
SELECT
query,
mean_time,
calls,
rows
FROM
pg_stat_statements
ORDER BY
mean_time DESC
LIMIT 5;
Essa query mostra o TOP 5 das queries que demoram mais pra rodar. Fica de olho no campo mean_time: se os valores ali passam de 500-1000 milissegundos, é sinal de que precisa otimizar essas queries.
Exemplo de análise de queries lentas
Bora ver um exemplo:
Aqui tá o resultado da query anterior:
| query | mean_time | calls | rows |
|---|---|---|---|
| SELECT * FROM orders WHERE status = 'new'; | 1234.56 | 10 | 10000 |
| SELECT * FROM products | 755.12 | 5000 | 100 |
| SELECT * FROM customers WHERE id = $1 | 543.21 | 1000 | 1 |
O que a gente vê?
Query na tabela orders: roda bem pouco (só 10 execuções), mas cada vez puxa 10 mil linhas. Provavelmente a tabela é gigante e a query não tá usando índice.
Query na tabela products: roda milhares de vezes, talvez num loop da aplicação. Cada busca retorna só 100 linhas, mas pela frequência essa query também pode ser um problema.
Query na tabela customers: executa rápido (543 ms), mas roda vezes demais.
Otimização de queries lentas
Agora que achamos as queries problemáticas, bora olhar o plano de execução delas com EXPLAIN ANALYZE. Por exemplo, pra query na tabela orders:
EXPLAIN ANALYZE
SELECT * FROM orders WHERE status = 'new';
O que dá pra ver?
Seq Scan: se a query tá usando varredura sequencial, precisa criar um índice:
CREATE INDEX idx_orders_status ON orders (status);
Problemas de filtragem: se a query tá puxando linha demais, repensa o texto da query. Talvez precise colocar mais condições ou limitar o resultado:
SELECT * FROM orders WHERE status = 'new' LIMIT 100;
Exibindo estatísticas de tempo de execução
Às vezes as queries problemáticas não são tão óbvias. Por exemplo, queries que chamam funções ou subqueries toda hora. Nesses casos, é bom olhar a coluna total_time:
SELECT
query,
total_time,
calls,
mean_time
FROM
pg_stat_statements
ORDER BY
total_time DESC
LIMIT 10;
Essa query mostra as queries mais "caras" em tempo total de execução.
Otimização de indexação
Muitas vezes as queries lentas tão ligadas à falta de índices. Usa o pg_stat_statements pra sacar quais queries não tão usando índice. Se você vê várias queries com os mesmos filtros (tipo pelo campo status), mas elas são lentas, cria o índice certo:
CREATE INDEX idx_orders_status ON orders (status);
Depois disso, testa a performance da query de novo com EXPLAIN ANALYZE.
Usando o pg_stat_statements, você consegue monitorar a performance das queries, achar os gargalos e melhorar a performance do seu banco. Lembra: quanto antes você começar a analisar as queries, mais fácil vai ser otimizar o sistema todo.
GO TO FULL VERSION