DEV Community

Saulo Siqueira
Saulo Siqueira

Posted on • Edited on

Dicas PostgreSQL

🐘 Consultas Úteis para Monitorar e Diagnosticar Bancos PostgreSQL

Manter um banco de dados PostgreSQL saudável vai muito além de apenas armazenar dados. É fundamental monitorar o crescimento das tabelas, detectar consultas lentas, identificar índices ausentes e, quando necessário, encerrar sessões problemáticas.

Neste artigo, reuni alguns comandos SQL essenciais para diagnosticar o comportamento do banco e manter a performance em dia.

🔍 Verificando o tamanho das tabelas

Para saber quais tabelas estão ocupando mais espaço no seu banco de dados, use a consulta abaixo.
Ela retorna o tamanho individual e total (incluindo índices) de cada tabela, ordenadas da maior para a menor:

SELECT esquema, tabela,
pg_size_pretty(pg_relation_size(esq_tab)) AS tamanho,
pg_size_pretty(pg_total_relation_size(esq_tab)) AS tamanho_total
FROM (SELECT tablename AS tabela,
schemaname AS esquema,
schemaname||'.'||tablename AS esq_tab
FROM pg_catalog.pg_tables
WHERE schemaname NOT
IN ('pg_catalog', 'information_schema', 'pg_toast') ) AS x
ORDER BY pg_total_relation_size(esq_tab) DESC;

💡 Dica: Ideal para identificar tabelas que podem precisar de manutenção, particionamento ou limpeza de dados antigos.

🛑 Cancelando instruções SQL

Em alguns casos, consultas travadas ou ociosas podem estar consumindo recursos do banco.
Use o comando abaixo para encerrar sessões que estão em estado IDLE:

SELECT
pg_terminate_backend(procpid)
FROM
pg_stat_activity
WHERE
current_query = '<IDLE>';

⚠️ Atenção:
Encerrar processos pode impactar conexões de aplicações ativas.
Sempre verifique antes com um SELECT * FROM pg_stat_activity;

📊 Encontrando tabelas sem índices adequados

Consultas que fazem full table scans (varredura completa) podem indicar a ausência de índices.
Use a consulta abaixo para identificar possíveis pontos de melhoria:

SELECT
relname AS TableName,
seq_scan - idx_scan AS TotalSeqScan,
CASE WHEN seq_scan - idx_scan > 0
THEN 'Missing Index Found'
ELSE 'Missing Index Not Found'
END AS MissingIndex,
pg_size_pretty(pg_relation_size(relname::regclass)) AS TableSize,
idx_scan AS TotalIndexScan
FROM pg_stat_all_tables
WHERE schemaname = 'public'
AND pg_relation_size(relname::regclass) > 100000
ORDER BY 2 DESC;

📈 Resultado:
Você verá quais tabelas estão sendo mais varridas sem uso de índice — ótimos candidatos para otimização.

⏱️ Consultas que estão rodando há mais de 1 minuto

Para visualizar queries longas em execução, rode:
SELECT
CURRENT_TIMESTAMP - query_start AS runtime,
datname,
usename,
query
FROM
pg_stat_activity
WHERE
state = 'active'
AND CURRENT_TIMESTAMP - query_start > '1 min'
ORDER BY
1 DESC;

🧠 Uso prático:
Ajuda a identificar gargalos, deadlocks ou consultas que precisam ser otimizadas.

💬 Conclusão

Essas consultas são extremamente úteis para:

  • Auditar o consumo de espaço no banco;
  • Diagnosticar lentidão em consultas;
  • Detectar índices ausentes;
  • Controlar sessões problemáticas.

Manter essas práticas no seu dia a dia de DBA ou DevOps pode evitar grandes dores de cabeça e garantir uma operação mais estável e performática no PostgreSQL. 🚀

✍️ Autor: Saulo José Eduardo de Siqueira
💻 Gerente de Projetos & Desenvolvedor PHP/Laravel apaixonado por DevOps e performance de sistemas.

Top comments (0)