Melhores Práticas SQL
Este material apresenta um conjunto de melhores práticas para escrita e otimização de consultas SQL utilizando o Teiid (versão 9.0). O objetivo é garantir melhor desempenho, legibilidade e uso eficiente dos recursos da base de dados, especialmente em ambientes integrados à plataforma Senior X.
Evite utilizar SELECT *. Selecionar todas as colunas aumenta o tráfego de dados e o consumo de memória, principalmente em tabelas com muitas colunas ou em consultas que envolvem JOINs. Prefira sempre especificar apenas as colunas realmente necessárias para a consulta.
Exemplo inadequado:
SELECT * FROM clientes c;
Exemplo recomendado:
SELECT c.nome, c.email FROM clientes c;
Com isso, menos dados são transferidos, resultando em consultas mais rápidas e eficientes.
Utilize na cláusula WHERE, colunas indexadas sempre que possível. Dessa forma, o banco pode usar os índices para localizar registros rapidamente, evitando varreduras completas na tabela.
Exemplo inadequado:
SELECT * FROM pedidos p
WHERE YEAR(p.data_pedido) = 2023;
- Funções sobre colunas anulam o uso de índices.
Exemplo recomendado:
SELECT p.data_pedido FROM pedidos p
WHERE p.data_pedido BETWEEN '2023-01-01' AND '2023-12-31';
Essa forma utiliza o índice da coluna e melhora o tempo de resposta.
- Use filtros claros e simples (comparações diretas, BETWEEN, IN);
- Evite like com
%no início da string (exemplo:like '%valor'); - Dê preferência para filtros em tabelas com maior volume de dados;
- Prefira tipos numéricos a strings em comparações.
Prefira o uso de JOINs no lugar de subconsultas complexas. Subconsultas aninhadas são mais difíceis de otimizar e podem degradar a performance.
Exemplo de inadequado:
SELECT c.nome FROM clientes c
WHERE c.id IN (SELECT p.cliente_id FROM pedidos p);
Exemplo recomendado:
SELECT c.nome
FROM clientes c
INNER JOIN pedidos p ON c.id = p.cliente_id
WHERE p.data >= '2025-01-01';
Os JOINs são geralmente mais performáticos e aproveitam melhor os índices. Sempre filtre o máximo possível antes ou durante o JOIN. Evite JOINs implícitos e use sempre INNER JOIN, LEFT JOIN, entre outros, de forma explícita.
Realize as agregações (como SUM, AVG, COUNT) diretamente no SQL. Isso reduz o volume de dados retornado e melhora o desempenho da consulta.
Exemplo inadequado:
SELECT v.valor_total FROM vendas v;
Retorna milhares de linhas e deixa para somar em outra camada. Isso consome mais recursos e torna a análise mais lenta.
Exemplo recomendado:
SELECT v.cliente_id, SUM(v.valor) AS total_vendas FROM vendas v GROUP BY v.cliente_id;
A soma já é feita no banco, e só o resultado final é retornado.
- Use GROUP BY apenas quando for necessário agrupar dados;
- Nomeie colunas agregadas com AS para melhorar a legibilidade;
- Evite colunas não agregadas fora do GROUP BY.
As operações ORDER BY podem impactar negativamente a performance, especialmente em grandes volumes de dados. Utilize essas cláusulas apenas quando forem realmente necessárias.
Exemplo inadequado:
SELECT * FROM vendas v
ORDER BY v.data_venda;
Exemplo recomendado:
SELECT v.data_venda FROM vendas v
ORDER BY v.data_venda
LIMIT 100;
Ordena apenas o necessário e limita o número de registros retornados.
- Use ORDER BY apenas quando for necessário para a visualização;
- Combine ORDER BY com LIMIT para evitar ordenar grandes volumes;
- Prefira ordenar por colunas numéricas ou indexadas.
Prefira funções que o Teiid consiga traduzir e repassar para a fonte de dados. Isso evita o processamento local, que é mais lento e consome mais recursos.
Saiba mais na documentação oficial do Teiid.
Em consultas que retornam muitos dados, utilize OFFSET <valor_offset> ROWS FETCH NEXT <valor_limit> ROWS ONLY para carregar os resultados em blocos menores. Isso evita o carregamento completo da tabela e melhora o desempenho da visualização.
Exemplo inadequado:
SELECT * FROM vendas v;
Retorna todas as linhas da tabela, o que pode causar lentidão no sistema e alto consumo de memória, especialmente em grandes volumes de dados.
Exemplo recomendado:
SELECT v.pedidos FROM vendas v
OFFSET 4 ROWS FETCH NEXT 2 ROWS ONLY;
Inicia na 5ª linha e retorna as 2 linhas seguintes.
- Utilize a cláusula OFFSET ROWS <valor_offset> para definir o ponto de início da leitura;
- Utilize a cláusula FETCH NEXT <valor_limit> ROWS ONLY para limitar o número de registros retornados.
O uso adequado de CASE melhora a performance e a legibilidade da query. Evite estruturas complexas e coloque primeiro as condições mais prováveis.
Exemplo inadequado:
CASE
WHEN status = 'cancelado' THEN 'Cancelado'
WHEN status = 'reprovado' THEN 'Reprovado'
WHEN status = 'em_analise' THEN 'Em Análise'
WHEN status = 'aprovado' THEN 'Aprovado'
ELSE 'Outro'
END
Avalia condições menos prováveis antes das mais comuns. Pode ter impacto em grandes volumes.
Exemplo recomendado:
CASE
WHEN status = 'em_analise' THEN 'Em Análise'
WHEN status = 'aprovado' THEN 'Aprovado'
WHEN status = 'reprovado' THEN 'Reprovado'
WHEN status = 'cancelado' THEN 'Cancelado'
ELSE 'Outro'
END
Ordena as condições da mais comum para a menos comum, reduzindo comparações desnecessárias.
- Coloque primeiro as condições mais frequentes;
- Evite CASEs aninhados.
Evite o uso de múltiplas funções aninhadas (por exemplo, REPLACE dentro de REPLACE, ou CAST dentro de COALESCE).
O parser SQL utilizado, JSQLParser, possui limite técnico de até 10 níveis de aninhamento em funções como REPLACE. Consultas que excedam esse limite podem falhar ou travar a execução.
Exemplo inadequado:
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(campo, 'a', ''), 'b', ''), 'c', ''), 'd', ''), 'e', '')
Difícil de manter, pode quebrar se passar do limite.
Exemplo recomendado:
Evite aninhamentos desnecessários e, se possível, simplifique a lógica ou trate os dados em etapas separadas.
Importante
Caso não saiba quais colunas possuem índices, entre em contato com o suporte e solicite a documentação das visões (tabelas) dos sistemas disponíveis na base de relatórios (Teiid). Isso ajuda a garantir que suas consultas estejam otimizadas para performance.
English
Español
English
Español


