🚀 Oferta especial: 60% OFF no CrazyStack - Últimas vagas!Garantir vaga →
Backend

Desafio de Performance: Otimizando SQL Real em Postgres

Você precisa de uma query 100x mais rápida? Veja como atacar gargalos de SQL no Postgres em bancos com milhões de linhas.

CrazyStack
15 min de leitura
SQLPostgresPerformanceOtimizaçãoBanco de DadosDesenvolvimento

Por que isso é importante

Se sua query demora mais de 1 segundo, o usuário não pensa: ele abandona. Milhões de linhas em bancos SQL se tornam gargalos fatais em relatórios, dashboards ou qualquer rotina crítica. Saber identificar e atacar esses problemas separa um programador júnior de um profissional pronto para o mercado real. Performance salva projetos, evita crises e multiplica sua empregabilidade.

O desafio: relatórios lentos e bancos gigantes

Imagine precisar calcular o total de vendas por cliente, rápido o bastante para não ser cobrado pelo chefe ou perder um cliente – mas o banco tem 10 milhões de linhas. A mesma query que rodava em milissegundos agora trava por 18 segundos ou mais. O desafio real: descobrir o gargalo de performance e transformá-lo em velocidade.

⚠️Atenção

Consultas lentas são invisíveis na planilha pequena, mas viram bombas em produção. Toda query lenta se torna um ticket urgente com o crescimento dos dados. Teste performance com volumes grandes desde já.

Estrutura das tabelas e a simulação

O cenário exige prática: uma tabela de clientes (id, nome, cidade) e uma tabela de vendas (id, data, valor total, status, loja_id, cliente_id). Com scripts, populam-se 1 milhão de vendas e 100 mil clientes, forçando o banco a mostrar seu real comportamento em escala. Este laboratório permite testar qualquer ajuste de performance antes do desastre ocorrer no sistema real.

ℹ️Dica técnica

Monte o banco localmente com scripts de geração de dados realistas e não poupe quantidade: quanto mais registros, melhor para revelar where e joins que escalam mal.

A consulta lenta: sintomas e indícios

A query: soma vendas por cliente, faz join entre vendas e clientes, filtra por status ‘concluída’ e faz um group by em múltiplas colunas, com um subselect de count. Resultado: ou trava por minutos, ou consome toda sua paciência – sem entregar valor.

Alerta de erro

Subqueries desnecessárias dentro de selects fazem cada linha provocar mais scans, multiplicando tempo de execução. Cada SELECT COUNT extra pode ser um buraco negro de performance quando os dados explodem.

Primeiro ataque: a importância dos índices

O maior vilão de bancos SQL lentos: falta de índices. Verifique se há índices sobre colunas chave do filtro WHERE – como status e data da venda – e sobre as colunas usadas em junção (joins) e ordenações (ORDER BY). Sem índice, o banco fará um Seq Scan: leitura completa de todas as linhas, sempre.

ℹ️O que é Seq Scan?

Seq Scan obriga o banco a ler todas as linhas, mesmo quando só precisa de 1%. Index Scan, após índices, acessa só o necessário, cortando drasticamente o tempo de consulta. Use o EXPLAIN ANALYZE para ver qual modo está ocorrendo – e sempre fuja do Seq Scan.

Plano de execução: como entender o gargalo real

Aplicar EXPLAIN ANALYZE na consulta mostra detalhadamente cada passo e onde o banco desperdiça mais tempo. Compare antes e depois da criação de índices para ver, na prática, a troca de Seq Scan por Index Scan e a evolução do tempo.

⚠️Alerta prático

Sempre rode a query ruim antes, crie os índices e rode novamente. Monitorar os ganhos reais no EXPLAIN ANALYZE é a chave para compreender cada otimização de verdade.

Filtro de data: o corte que ninguém pode ignorar

Filtros por data, aparentemente triviais, são essenciais. Bancos com anos de movimentação geram relatórios arrastados quando o SQL não restringe os períodos. O ideal é sempre filtrar por datas adequadas ao relatório – e garantir índices para acelerar esse filtro.

⚠️Atenção

Relatórios sem WHERE de data podem acionar scans em milhões de linhas desnecessárias. Nunca monte consultas em bancos gigantes sem considerar intervalos de tempo.

Eliminando a subquery: menos é mais

Simplesmente remover a subquery COUNT de dentro do SELECT já faz a consulta correr em milissegundos mesmo sem índices, em muitos casos. Sempre questione se o que parece necessário realmente é; subselects só devem existir com motivo forte.

Dica de ouro

Teste ambas as versões: com e sem subqueries. Meça os tempos. O que não agrega valor pode ser removido sem prejuízo para o resultado do business.

Criando índices simples e compostos

Usar CREATE INDEX sobre as colunas status, data_venda e cliente_id já muda o jogo. Índices compostos (que pegam mais de uma coluna) têm ainda mais potencial. Eles atendem filtros combinados do WHERE, acelerando análises multi-facetais do banco.

ℹ️O que muda com índice composto?

Um índice composto cobre todos os filtros do WHERE em um só acesso, otimizando buscas que combinam, por exemplo, status + data + cliente_id ao mesmo tempo.

CTE: Otimizando com Common Table Expressions

CTE permite montar blocos intermediários, pré-filtrando dados antes do join. Usar WITH vendas_filtradas como base agiliza tudo: first, reduz milhões de registros para milhares, cortando drasticamente I/O antes de cada agrupamento ou order by.

ℹ️Conceito Avançado

CTEs (WITH) ajudam a ‘dividir para conquistar’ consultas grandes. Filtre logo no CTE, evitando joins desnecessários e agrupando dados já resumidos. O plano executor te agradece.

Comparando resultados: antes e depois do tuning

Antes: consulta travava o banco, planos de execução repletos de Seq Scan e scans desnecessários. Depois: index scan aparente, queries subsegundo, consumo de I/O mínimo, resultado instantâneo para o usuário.

⚠️Atenção ao monitorar

O tempo percebido pelo usuário e o tempo real do banco podem divergir. Acompanhe sempre ambos os cenários, validando cada ganho no EXPLAIN ANALYZE.

Checklist para consultas ágeis

1. Sempre filtre por datas
2. Índices sobre colunas de filtro e join
3. Evite subqueries sem ganho real
4. Use CTE para reduzir o volume antes de joins
5. Sempre valide antes/depois do EXPLAIN ANALYZE

Quando devemos refatorar queries antigas?

Queries que ganham lentidão conforme o crescimento da base precisariam ser revistas assim que relatórios passarem de 1 ou 2 segundos com amostra realista de dados. Monitoramento contínuo e alerta em produção são essenciais.

ℹ️Não confie em feeling

Só EXPLAIN ANALYZE entrega o diagnóstico real. A sensação de velocidade em queries pequenas engana – sempre teste versões com muitos registros antes de ir para produção.

Prepare seu ambiente: scripts e ferramentas

Use PGAdmin ou ferramentas como DBeaver, Datagrip, ou até scripts SQL puros para montar o ambiente simulado. Scripts para criar tabelas e popular com massivos inserts (generate_series) aceleram a aula prática de performance.

Siga para níveis avançados e pratique

Otimização de consulta é skill indispensável para qualquer programador backend e deve ser treinada em bancos grandes, sempre. Pratique com diferentes queries, múltiplos índices e variações de planos – e aproveite para conferir desafios reais no canal Dev Doido no YouTube, onde problemas de verdade são resolvidos na tela com código aberto.

⚠️Atenção

Sem treino, performance só existe no papel. Repita o laboratório, poste dúvidas e dicas, compartilhe resultados práticos – e compare seu EXPLAIN ANALYZE com a comunidade.

Resumo final: como pensar performance todos os dias

Toda solução de relatórios e sistemas de vendas enfrenta crescimento explosivo no volume de dados. Não espere o banco travar em produção: antecipe, monitore, indexe e otimize. Torne EXPLAIN ANALYZE seu hábito – e nunca pare de buscar a query perfeita.

Sucesso

Com poucas mudanças, seu sistema já pode rodar 100x mais rápido. O segredo não está só no hardware – está em como você pensa e entrega cada SQL.

Domine React e Node com o CrazyStack

Aprenda técnicas avançadas de React com nosso curso completo