
Você acabou de entrar na empresa. Na primeira reunião com o time de dados, te dizem:
“Esse relatório aqui está demorando demais pra rodar. Consegue resolver?”
Parece simples, mas por trás de uma query lenta podem existir vários gargalos invisíveis. Neste artigo, você vai entender como pensar estrategicamente ao otimizar um relatório SQL, desde a análise do problema até as ações práticas para melhorar a performance.
1. Diagnóstico Inicial: O Que Está Deixando o Relatório Lento?
Antes de mexer no código, você precisa levantar algumas perguntas:
- Qual é o volume de dados envolvido?
- Quais tabelas e joins estão sendo usados?
- Há filtros mal aplicados?
- Existem funções ou subconsultas custosas?
- A estrutura do banco está bem indexada?
O erro mais comum é sair alterando sem entender o cenário. Primeiro, investigue.
2. Comece Usando o EXPLAIN
ou EXPLAIN ANALYZE
Essa ferramenta mostra como o banco de dados está executando a query. Com ela, você descobre:
- Se está usando índice ou fazendo varredura completa (full scan)
- A ordem de execução dos joins
- Quais etapas estão consumindo mais tempo
EXPLAIN SELECT ... -- sua query
📌 Esse passo é obrigatório em qualquer processo de otimização.
3. Principais Ações de Otimização (Com Exemplos)
✅ Evite SELECT *
Selecionar todas as colunas aumenta o volume de dados processado.
-- Ruim: SELECT * FROM pedido;
-- Melhor: SELECT ID_PEDIDO, VALOR_TOTAL FROM pedido;
✅ Use índices em colunas usadas em filtros e joins
Se você filtra por DATA_PEDIDO
, por exemplo:
CREATE INDEX idx_data_pedido ON pedido(DATA_PEDIDO);
✅ Cuidado com funções em colunas
Evite fazer isso:
WHERE YEAR(DATA_PEDIDO) = 2024
Prefira:
WHERE DATA_PEDIDO BETWEEN '2024-01-01' AND '2024-12-31'
✅ Substitua subqueries por joins, quando possível
-- Subquery lenta:
SELECT * FROM cliente WHERE ID_CLIENTE IN (
SELECT ID_CLIENTE FROM pedido WHERE VALOR_TOTAL > 100
);
-- Join mais eficiente:
SELECT DISTINCT C.*
FROM cliente C
JOIN pedido P ON C.ID_CLIENTE = P.ID_CLIENTE
WHERE P.VALOR_TOTAL > 100;
✅ Quebre queries muito grandes em etapas com CTEs ou views
Ajuda na legibilidade e muitas vezes melhora o desempenho.
WITH pedidos_confirmados AS (
SELECT * FROM pedido WHERE STATUS = 'confirmado'
)
SELECT C.NOME, SUM(P.VALOR_TOTAL)
FROM cliente C
JOIN pedidos_confirmados P ON C.ID_CLIENTE = P.ID_CLIENTE
GROUP BY C.NOME;
4. Acompanhe a Performance com Métricas Reais
Após aplicar as melhorias, compare:
- Tempo de execução antes e depois
- Volume de dados processado
- Uso de índices (via EXPLAIN)
📌 Otimização sem métrica é só tentativa e erro.
Conclusão (Resumo e Próximos Passos)
Quando você recebe um relatório lento para otimizar, sua missão não é só “deixar mais rápido”. É entender o problema, agir com lógica e garantir um resultado consistente e sustentável.
- Comece com diagnóstico
- Use
EXPLAIN
para ver o que está por trás - Aplique boas práticas como filtros eficientes, joins otimizados e uso de índices
- Meça o impacto real da sua mudança
📢 Já precisou otimizar uma query lenta? O que você encontrou? Compartilha nos comentários! 📚 E se quiser aprender a escrever SQL rápido, limpo e profissional, conheça o curso SQL Simplificado — feito pra quem quer deixar de apenas consultar e começar a pensar performance.
Nos vemos no próximo artigo do Blog do SQL! 🚀
0 Comentários