Diagnosticando Banco — Health Check PostgreSQL
Skill para diagnosticos de saude, performance e otimizacao do banco PostgreSQL.
ESCOPO: Esta skill executa checks read-only no banco. Nao modifica dados nem estrutura. Para consultas de dados de negocio, use
consultando-sql. Para metricas de infra (CPU, memoria, HTTP), usemcp__render__get_metrics.
Quando NAO Usar Esta Skill
| Situacao | Ferramenta Correta | Por que? |
|---|---|---|
| Consultas de dados de negocio | consultando-sql | Health check e sobre infra, nao dados |
| Metricas CPU/memoria do servico | mcp__render__get_metrics | Metricas de container, nao de banco |
| Logs de aplicacao/request | mcp__render__list_logs | Logs de app, nao de banco |
| Status de deploys | mcp__render__list_deploys | Deploys sao infra, nao banco |
DECISION TREE — Qual Check Usar?
| Se a pergunta menciona... | Use este check | O que retorna |
|---|---|---|
| Saude geral, visao completa | --all --resumo |
Resumo executivo de todos os checks |
| Indices nao usados | --check unused_indexes |
Indices com 0 scans + espaco desperdicado |
| Indices duplicados | --check duplicate_indexes |
Indices com mesma definicao na mesma tabela |
| Queries lentas | --check top_queries |
Top N queries por tempo total (requer pg_stat_statements) |
| Cache / buffer | --check cache_hit_rate |
Hit rate de heap e index cache |
| Conexoes | --check connections |
Breakdown por estado + utilizacao |
| Bloat de indices | --check index_bloat |
Maiores indices com analise de eficiencia |
| Maiores tabelas | --check table_sizes |
Top N tabelas por tamanho total |
| Vacuum / dead tuples | --check vacuum_stats |
Tabelas com dead tuples + ultimo vacuum |
| Sequences / overflow | --check sequence_capacity |
Uso % de sequences (risco INTEGER overflow) |
Combinando Checks
# Checks especificos combinados
health_check_banco.py --check unused_indexes cache_hit_rate connections
# Todos com resumo executivo
health_check_banco.py --all --resumo
Modos de Execucao
Modo 1: Script Local (dev/staging)
source .venv/bin/activate && \
python .claude/skills/diagnosticando-banco/scripts/health_check_banco.py --all --resumo
Modo 2: Render MCP (producao)
Para producao, executar as SQLs diretamente via mcp__render__query_render_postgres com postgresId = "dpg-d13m38vfte5s738t6p50-a".
SQLs prontas para uso direto — ver secao "SQL Templates para Render MCP" abaixo.
SQL Templates para Render MCP
Quando nao puder executar o script (ex: producao via agente web), usar estas queries diretamente:
Indices Nao Usados
SELECT s.relname AS tabela, s.indexrelname AS indice,
pg_size_pretty(pg_relation_size(s.indexrelid)) AS tamanho,
s.idx_scan AS scans
FROM pg_stat_user_indexes s
JOIN pg_index i ON s.indexrelid = i.indexrelid
WHERE s.idx_scan = 0 AND NOT i.indisunique AND NOT i.indisprimary
AND s.schemaname = 'public'
ORDER BY pg_relation_size(s.indexrelid) DESC LIMIT 20;
Cache Hit Rate
SELECT round(sum(heap_blks_hit)::numeric /
NULLIF(sum(heap_blks_hit) + sum(heap_blks_read), 0) * 100, 2) AS hit_rate_pct
FROM pg_statio_user_tables;
Top Queries Lentas (requer pg_stat_statements)
SELECT substring(query, 1, 200) AS query, calls,
round(total_exec_time::numeric, 2) AS tempo_total_ms,
round(mean_exec_time::numeric, 2) AS tempo_medio_ms, rows
FROM pg_stat_statements
WHERE query NOT LIKE 'SET %' AND query NOT LIKE 'BEGIN%'
AND userid = (SELECT usesysid FROM pg_user WHERE usename = current_user)
ORDER BY total_exec_time DESC LIMIT 10;
Conexoes Ativas
SELECT state, count(*) AS quantidade,
max(extract(epoch from (now() - state_change)))::integer AS max_duracao_seg
FROM pg_stat_activity WHERE pid <> pg_backend_pid()
GROUP BY state ORDER BY quantidade DESC;
Maiores Tabelas
SELECT relname AS tabela,
pg_size_pretty(pg_total_relation_size(relid)) AS tamanho_total,
n_live_tup AS linhas_vivas, n_dead_tup AS linhas_mortas
FROM pg_stat_user_tables WHERE schemaname = 'public'
ORDER BY pg_total_relation_size(relid) DESC LIMIT 20;
Sequences (Risco de Overflow INTEGER)
SELECT sequencename, last_value,
round(last_value::numeric / 2147483647 * 100, 4) AS uso_pct
FROM pg_sequences WHERE schemaname = 'public' AND last_value IS NOT NULL
ORDER BY last_value DESC;
Nota: Query assume INTEGER (2.1B limite). No Render MCP, data_type causa erro de casting — usar versao simplificada acima.
Interpretacao de Resultados
Cache Hit Rate
| Faixa | Status | Acao |
|---|---|---|
| >= 99% | EXCELENTE | Nenhuma |
| 95-99% | BOM | Monitorar |
| 90-95% | ATENCAO | Avaliar shared_buffers |
| < 90% | CRITICO | Aumentar shared_buffers ou otimizar queries |
Sequences
| Uso | Risco | Acao |
|---|---|---|
| < 10% | Nenhum | Monitorar |
| 10-50% | Baixo | Planejar migracao para BIGINT |
| > 50% | ALTO | Migrar para BIGINT urgentemente |
Vacuum
| Dead Ratio | Status | Acao |
|---|---|---|
| < 5% | OK | Autovacuum funcionando |
| 5-10% | Atencao | Verificar autovacuum config |
| > 10% | Problema | Executar VACUUM ANALYZE manual |
Script Principal
health_check_banco.py
source .venv/bin/activate && \
python .claude/skills/diagnosticando-banco/scripts/health_check_banco.py [opcoes]
Para parametros completos, retornos JSON e exemplos: LER SCRIPTS.md
Pre-requisitos
| Extensao | Necessaria para | Status Render |
|---|---|---|
| pg_stat_statements | top_queries |
Instalada (v1.10) |
| HypoPG | Indices hipoteticos | NAO disponivel |
Referencia Cruzada
| Skill / Ferramenta | Quando usar em vez desta |
|---|---|
| consultando-sql | Consultas de dados de negocio |
| mcp__render__get_metrics | Metricas de infra (CPU, memoria) |
| mcp__render__list_logs | Logs de aplicacao |
| mcp__render__list_deploys | Status de deploys |