Consultas SQL complexas são excelentes para tornar as pesquisas de banco de dados muito específicas e flexíveis, mas também podem ser difíceis de entender e quase impossíveis de depurar - e você pode esquecer de reutilizá-las.
Quando as consultas vão além dos comandos SELECT e WHERE padrão, você pode até descobrir que o desempenho do SQL Server começa a sofrer porque os otimizadores de consulta têm problemas para processar consultas longas e complexas.
Se você perceber que suas consultas SQL usam um número excessivo de junções e subconsultas complexas, aninham consultas em cláusulas WHERE e dependem de muitas cláusulas AND e OR, provavelmente é um bom momento para voltar atrás e procurar maneiras de minimizar parte da complexidade.
Dicas para minimizar a complexidade de consulta do SQL Server
Como mencionamos acima, os otimizadores de consulta do SQL Server não adoram consultas SQL complexas. Aqui estão cinco maneiras de tornar suas consultas menos complexas para que possam ser otimizadas para melhorar o desempenho.
1. Elimine as cláusulas OR quando possível
A maneira mais fácil de tornar as consultas menos complexas é eliminar as cláusulas OR sempre que possível. Como OR é inclusivo, o SQL Server precisa processar cada componente da cláusula separadamente, o que realmente torna as operações mais lentas.
Quando não for possível remover OR, a próxima melhor opção é dividir consultas longas e complexas em menores. Parece um pouco contra-intuitivo que processar mais consultas seja mais rápido do que processar uma, mas quando se trata de OU, é melhor fazer várias consultas.
2. Afinar pesquisas de string
O SQL Server faz muitas coisas bem, mas pesquisas de strings difusas não são uma delas. Pesquisas de caracteres curinga, especialmente em tabelas grandes, são ineficientes e ruins para o desempenho.
Existem alguns ajustes que você pode aplicar às pesquisas de strings que ajudam a minimizar o impacto no desempenho.
- Use uma pesquisa de string inicial em vez de uma pesquisa de curinga (ou seja, altere "%For%" para "For%")
- Aplique filtros como data ou hora à consulta para reduzir o tamanho dos dados antes de executar a pesquisa de string
- Aplicar indexação de texto completo para gerar índices que permitem pesquisa de string flexível em colunas de texto
3. Cuidado com grandes operações de gravação
Grandes operações de gravação causam contenção e geram muitos arquivos de log. Se não forem verificadas, grandes operações de gravação podem bloquear recursos de usuários e criar problemas de latência, além de preencher logs de transações ou até mesmo armazenamento físico.
Como você nem sempre pode evitar grandes operações de gravação, esteja ciente de quando as executa (quanto menos ocupado o servidor, melhor) ou reduza o número de linhas modificadas por operação para minimizar o risco de contenção.
4. Limpar índices
Os índices são um dos principais culpados quando se trata de baixo desempenho, mas quando você está tentando otimizar consultas SQL complexas, os índices exigem algumas considerações especiais.
O SQL Server tem várias ferramentas que informam quando os índices ausentes estão afetando o desempenho da consulta. Mas antes de começar a adicionar índices, você precisa determinar se o índice adicional melhorará a consulta o suficiente para valer a pena o esforço. Por exemplo, se a consulta for executada 1 milhão de vezes por dia e o índice melhorar em 25%, provavelmente valerá a pena. Se a consulta raramente for usada, pode não fazer sentido.
Algumas outras coisas a serem consideradas antes de começar a adicionar índices são se os índices existentes podem ser ajustados para cobrir esse caso de uso sem adicionar um novo e se esse índice já existe, mas o otimizador o está ignorando por algum motivo.
Outras maneiras pelas quais os índices podem afetar o desempenho da consulta são tabelas de indexação excessiva ou insuficiente e tabelas que não possuem um índice clusterizado ou uma chave primária. A resolução desses problemas ajudará no desempenho de consultas SQL complexas.
5. Manter a contagem regressiva da mesa
Sempre que você adiciona uma tabela a uma consulta, a consulta se torna mais complexa. Tabelas excessivas geralmente resultam em planos de execução ruins porque o otimizador de consulta não pode funcionar com eficiência.
Se você perceber que uma consulta complexa está tendo um desempenho insatisfatório e tem muitas tabelas, esse pode ser um daqueles momentos em que dividir a consulta em consultas menores é a melhor escolha, pois aliviará parte da carga do otimizador.
As ferramentas de ajuste de desempenho podem ajudar a minimizar a complexidade do SQL Server
Quando consultas complexas atrapalham o otimizador de consultas, você geralmente acaba com um plano de execução ineficiente e o desempenho é prejudicado. Além das dicas acima, as ferramentas de ajuste de desempenho são um recurso valioso para minimizar a complexidade das consultas do SQL Server e otimizar o desempenho.
Abaixo estão alguns dos recursos a serem procurados ao pesquisar soluções de ajuste de desempenho.
Análise do plano de execução do SQL Server
A ferramenta de ajuste deve analisar seu plano de execução e determinar o que precisa ser alterado para que o SQL Server execute operações com mais eficiência.
Visualização do plano de execução do SQL Server
A ferramenta de ajuste deve apresentar o plano de execução de maneira fácil de entender e ajudar a localizar as operações que estão retardando a execução.
Otimização SQL automatizada
A ferramenta de ajuste deve analisar seu SQL e reescrevê-lo automaticamente até atingir a melhoria máxima do tempo de execução.
Comparação de instruções SQL otimizadas e originais
A ferramenta de ajuste deve destacar as alterações na instrução SQL para que você possa comparar as versões original e otimizada antes de implantar as alterações.
Comparação de planos de execução do SQL Server
As ferramentas de ajuste devem fornecer uma comparação dos planos de execução originais e otimizados para que você saiba o que mudou entre as versões.
Prova estatística
Sua ferramenta de ajuste deve fornecer dados que mostrem por que o SQL otimizado é executado mais rapidamente do que a instrução SQL original.
Consultas complexas do SQL Server podem ter um impacto negativo no desempenho do sistema. Use essas dicas e uma solução de ajuste de desempenho de alta qualidade para limpar a complexidade e otimizar a eficiência de sua consulta SQL.