CodeGym /Cursos /SQL SELF /Monitorando queries lentas com pg_stat_statements<...

Monitorando queries lentas com pg_stat_statements

SQL SELF
Nível 42 , Lição 2
Disponível

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.

Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION