SQL (Structured Query Language) é uma linguagem de programação usada para gerenciar bancos de dados relacionais. Com o SQL, você pode criar, ler, atualizar e excluir dados — o famoso conjunto de operações CRUD (Create, Read, Update, Delete).
Neste artigo, veremos algumas das técnicas mais eficazes para otimizar nossas consultas SQL.
1. Use a indexação adequada
Um índice é como um índice de um livro: ele serve pra encontrar informações rapidamente sem ter que "ler" todas as páginas (ou todas as linhas de uma tabela, no caso do banco de dados).
Tipos de índices no SQL Server
- Índice Clustered (agrupado)
A tabela só pode ter um. Ele define a ordem física dos dados na tabela.
Exemplo típico: índice na chave primária.
CREATE CLUSTERED INDEX idx_produtos_id ON produtos(id);
- Índice Non-Clustered (não agrupado)
A tabela pode ter vários. É uma estrutura separada que aponta para os dados reais. Muito útil para buscas em colunas que não são a chave primária.
CREATE NONCLUSTERED INDEX idx_produtos_nome ON produtos(nome);
- Índice Único (Unique Index)
Garante que não existam valores duplicados na coluna ou colunas. Pode ser Clustered ou Non-Clustered.
CREATE UNIQUE INDEX idx_email_unico ON usuarios(email);
- Índice Composto
Usa mais de uma coluna. Ideal quando você faz buscas usando múltiplas colunas ao mesmo tempo.
CREATE NONCLUSTERED INDEX idx_nome_sobrenome ON usuarios(nome, sobrenome);
- Índices filtrados
Só indexam parte dos dados (com base em uma condição). Muito útil para melhorar performance em casos
específicos.
CREATE NONCLUSTERED INDEX idx_ativos ON usuarios(ativo)
WHERE ativo = 1;
Evite usar índices desnecessários. Embora os índices sejam
muito úteis para acelerar as consultas em SELECT, eles podem tornar as
operações em INSERT, UPDATE e DELETE um pouco mais lentas. Isso ocorre porque o
índice precisa ser atualizado sempre que você modificar os dados. Portanto, o
excesso de índices pode tornar as coisas mais lentas, aumentando a sobrecarga
das modificações de dados.
Escolha o tipo de índice correto. Diferentes bancos de dados
oferecem vários tipos de índices. Devemos escolher a que melhor se adapta aos
nossos dados e padrões de consulta. Por exemplo, um índice de árvore B é uma
boa opção se você costuma pesquisar intervalos de valores.
2. Evitar SELECT *
Às vezes, ficamos tentados a usar o SELECT * FROM para
pegar todas as colunas, mesmo aquelas que não são relevantes para nossa
análise. Embora isso possa parecer conveniente, leva a consultas muito
ineficientes que podem reduzir o desempenho.
O banco de dados precisa ler e transferir mais dados do que
o necessário, o que exige maior uso de memória, pois o servidor precisa
processar e armazenar mais informações do que o necessário.
Como prática recomendada geral, devemos selecionar apenas as
colunas específicas de que precisamos. Minimizar os dados desnecessários não só
manterá nosso código limpo e fácil de entender, mas também ajudará a otimizar o
desempenho.
Então, em vez de escrever:
SELECT * FROM PRODUTOS ;

SELECT
ID,
NOME,
CATEGORIA,
UNIDADE
FROM PRODUTOS ;

3. Evite a recuperação de dados redundantes ou
desnecessários
Acabamos de discutir que selecionar apenas colunas
relevantes é considerado uma prática recomendada para otimizar as consultas
SQL. No entanto, também é importante limitar o número de linhas que estamos
recuperando, e não apenas de colunas. As consultas geralmente ficam mais lentas
quando o número de linhas aumenta.
Você pode usar a função TOP para reduzir o número
de linhas retornadas. Esse recurso evita que recuperemos involuntariamente
milhares de linhas de dados quando precisamos trabalhar com apenas
algumas.
A função TOP é especialmente útil para consultas
de validação ou para inspecionar a saída de uma transformação na qual estamos
trabalhando. É ideal para fazer experimentos e entender como nosso código se
comporta. No entanto, ele pode não ser adequado para modelos de dados
automatizados, nos quais precisamos retornar todo o conjunto de dados.
Aqui temos um exemplo de como o TOP funciona:
SELECT
TOP 2
ID,
NOME,
CATEGORIA,
UNIDADE
FROM PRODUTOS
ORDER BY NOME ASC
4. Otimizar as cláusulas WHERE
A cláusula WHERE é essencial nas consultas SQL porque nos
permite filtrar dados com base em condições específicas, garantindo que apenas
os registros relevantes sejam retornados. Ele melhora a eficiência da consulta
ao reduzir a quantidade de dados processados, o que é muito importante para
trabalhar com um grande conjunto de dados.
Portanto, uma cláusula WHERE correta pode ser um aliado
poderoso quando estamos otimizando o desempenho de uma consulta SQL. Vejamos
algumas maneiras pelas quais podemos aproveitar essa cláusula:
Adicione condições de filtragem adequadas com antecedência. Às
vezes, ter uma cláusula WHERE é bom, mas não é suficiente. Precisamos ter
cuidado com o local onde colocamos a cláusula. Filtrar o maior número possível
de linhas no início da cláusula WHERE pode nos ajudar a otimizar a consulta.
Evite usar funções em colunas na cláusula WHERE. Quando
aplicamos uma função a uma coluna, o banco de dados precisa aplicar essa função
a todas as linhas da tabela antes de poder filtrar os resultados. Isso impede
que o banco de dados use os índices de forma eficaz.
Por exemplo, em vez de:
SELECT
ID,
NOME,
CATEGORIA,
UNIDADE,
DATA_CADASTRO
FROM PRODUTOS WHERE YEAR(DATA_CADASTRO)=2025
Devemos usar:
SELECT
ID,
NOME,
CATEGORIA,
UNIDADE,
DATA_CADASTRO
FROM PRODUTOS
WHERE DATA_CADASTRO >= '2025-01-01' AND DATA_CADASTRO < '2025-04-01'
Use operadores apropriados. Devemos escolher as
operadoras mais eficientes que atendam às nossas necessidades. Por
exemplo, = é geralmente mais rápido do que LIKE, e usar intervalos de
datas específicos é mais rápido do que usar funções como MONTH(DATA_CADASTRO).
Então, por exemplo, em vez de realizar essa consulta, você
pode fazer o seguinte:
SELECT * FROM PRODUTOS
WHERE MONTH(DATA_CADASTRO) = 12 AND YEAR(DATA_CADASTRO) = 2024;
Podemos fazer o seguinte:
SELECT * FROM PRODUTOS
WHERE DATA_CADASTRO >= '2024-12-01' AND DATA_CADASTRO < '2024-12-31';
5. Evite ordenação e agrupamento desnecessários
Como profissionais de dados, gostamos de ter nossos dados ordenados e agrupados para que possamos obter insights mais facilmente. Normalmente, usamos ORDER BY e GROUP BY em nossas consultas SQL.
No entanto, ambas as cláusulas podem ser computacionalmente caras, especialmente ao lidar com grandes conjuntos de dados. Ao classificar ou agregar dados, o mecanismo de banco de dados geralmente precisa executar uma varredura completa dos dados e, em seguida, organizá-los, identificar os grupos e/ou aplicar funções agregadas, normalmente usando algoritmos que consomem muitos recursos.
Para otimizar as consultas, você pode seguir algumas destas dicas:
Minimizar a classificação. Devemos usar o ORDER BY
somente quando necessário. Se a classificação não for essencial, a omissão
dessa cláusula pode nos ajudar a reduzir drasticamente o tempo de
processamento.
Use índices. Quando possível, devemos nos certificar de que
as colunas envolvidas em ORDER BY e GROUP BY sejam indexadas .
Envie a classificação para a camada de aplicativos. Se for
possível, devemos empurrar a operação de classificação para a camada do
aplicativo em vez de para o banco de dados.
Dados pré-agregados. Para consultas complexas envolvendo
GROUP BY, poderíamos pré-agregar os dados em um estágio anterior ou em uma
visualização materializada, para que o banco de dados não precise calcular os mesmos agregados repetidamente. banco de
dados não precise computar os mesmos agregados repetidamente.
6. Use UNION ALL em vez de UNION
Quando quisermos combinar resultados de várias consultas em uma única lista, podemos usar as cláusulas UNION e UNION ALL. Ambos combinam os resultados de dois ou mais comandos SELECT quando eles têm os mesmos nomes de coluna. No entanto, eles não são iguais, e sua diferença os torna adequados para diferentes casos de uso.
A cláusula UNION remove as linhas duplicadas, o que exige mais tempo de processamento .
Enquanto que o UNION ALL combina os resultados, mas mantém todas as linhas, inclusive as duplicadas. Portanto, se não precisarmos remover duplicatas, devemos usar UNION ALL para melhorar o desempenho.
-- Consulta menos performática
SELECT
NOME,
CATEGORIA,
UNIDADE,
'LOJA 1' AS LOJA
FROM PRODUTOS
UNION
SELECT
NOME,
CATEGORIA,
UNIDADE,
'LOJA 2' AS LOJA
FROM PRODUTOS_LOJA2
-- Consulta mais performática
SELECT
NOME,
CATEGORIA,
UNIDADE,
'LOJA 1' AS LOJA
FROM PRODUTOS
UNION ALL
SELECT
NOME,
CATEGORIA,
UNIDADE,
'LOJA 2' AS LOJA
FROM PRODUTOS_LOJA2
Comentários
Postar um comentário