Willians Tavares

📃 Monitorando Consultas no PostgreSQL

Você já se deparou com aquela situação onde o banco de dados está lento e você precisa descobrir qual consulta está causando o problema? Ou então precisou cancelar uma query que travou e está consumindo recursos do servidor?

Se você trabalha com PostgreSQL, conhecer as ferramentas de monitoramento de consultas é essencial. Neste artigo, vou compartilhar algumas técnicas que uso no dia a dia para identificar e gerenciar consultas em execução.

A view pg_stat_activity

O PostgreSQL possui uma view chamada pg_stat_activity que é uma verdadeira mão na roda para quem precisa monitorar o que está acontecendo no banco. Ela fornece informações sobre todas as conexões ativas e as consultas que estão sendo executadas.

Visualizando todas as consultas em execução

Para ver todas as queries que estão rodando neste momento, você pode usar:

SELECT pid, usename, query_start, state, query 
FROM pg_stat_activity 
WHERE state = 'active' 
  AND pid <> pg_backend_pid();

O filtro pid <> pg_backend_pid() serve para excluir a própria consulta que estamos executando do resultado.

Identificando consultas lentas

Uma das situações mais comuns é precisar encontrar aquela consulta que está demorando mais do que deveria. Para isso, podemos ordenar pelo tempo de execução:

SELECT 
    pid, 
    usename, 
    query_start, 
    now() - query_start AS duration, 
    state, 
    query 
FROM pg_stat_activity 
WHERE state = 'active' 
  AND pid <> pg_backend_pid() 
ORDER BY duration DESC;

Filtrando consultas por tempo de execução

Se você quer ver apenas as consultas que estão rodando há mais de um minuto (geralmente um sinal de alerta), use:

SELECT 
    pid, 
    usename, 
    query_start, 
    now() - query_start AS duration, 
    state, 
    query 
FROM pg_stat_activity 
WHERE state = 'active' 
  AND now() - query_start > interval '1 minute' 
ORDER BY duration DESC;

Gerenciando consultas problemáticas

Encontrou a consulta problemática? Agora você tem duas opções para lidar com ela:

Cancelar uma consulta

A forma mais "gentil" de interromper uma consulta é usando pg_cancel_backend:

SELECT pg_cancel_backend(12345);

Substitua 12345 pelo PID da consulta que você identificou anteriormente. Essa função envia um sinal de cancelamento para a query, permitindo que ela termine de forma controlada.

Encerrar uma conexão forçadamente

Se o cancelamento não funcionar (às vezes a query está em um estado que não responde ao sinal), você pode forçar o encerramento da conexão:

SELECT pg_terminate_backend(12345);

⚠️ Atenção: Use esta opção com cuidado, pois ela encerra a conexão inteira, não apenas a consulta. Qualquer transação em andamento será revertida.

Dica bônus: Identificando consultas por comentário

Uma prática que adotei em projetos é adicionar comentários identificadores nas queries da aplicação. Isso facilita muito na hora de rastrear qual parte do sistema está gerando determinada consulta:

SELECT pid, usename, query_start, state, query 
FROM pg_stat_activity 
WHERE query ILIKE '%/* ModuloPedidos */%' 
  AND state = 'active';

Dessa forma, você consegue filtrar rapidamente todas as consultas de um módulo específico.

Considerações finais

Monitorar consultas é fundamental para manter a saúde do seu banco de dados. Essas técnicas são simples, mas extremamente úteis no dia a dia. Lembre-se de que você precisa ter as permissões adequadas para visualizar consultas de outros usuários e para cancelá-las.

Espero que essas dicas sejam úteis para você! Se tiver alguma dúvida ou quiser compartilhar outras técnicas, fique à vontade para entrar em contato.