Published on

August 30, 2023

Otimizando Consultas no SQL Server: Evitando Funções na Cláusula WHERE

Ao escrever consultas SQL no SQL Server, é importante considerar as implicações de desempenho ao usar funções na cláusula WHERE. Embora as funções possam ser úteis para manipular dados, elas podem impactar significativamente o desempenho da consulta, especialmente para tabelas grandes.

Então, por que as funções na cláusula WHERE são um problema? Quando uma função é usada na cláusula WHERE, o SQL Server precisa calcular a função para cada linha na tabela. Isso pode ser demorado e pode impedir que o SQL Server use efetivamente índices nas colunas usadas na função. Essencialmente, isso transforma uma pesquisa indexada em uma varredura completa da tabela.

Um cenário comum em que as funções são usadas na cláusula WHERE é ao converter strings para maiúsculas para fins de comparação. Por padrão, as comparações de strings no SQL Server são sensíveis a maiúsculas e minúsculas. Isso significa que ‘Smith’ e ‘smith’ não seriam considerados iguais em uma colação binária. Para contornar isso, alguns desenvolvedores usam a função UPPER (ou LOWER) para converter todas as strings para a mesma caixa antes da comparação.

No entanto, como discutimos, o uso de funções na cláusula WHERE pode afetar o desempenho. Uma solução mais eficiente é usar a cláusula COLLATE para especificar uma colação que não diferencia maiúsculas de minúsculas para a comparação. Isso permite que o SQL Server faça uma comparação sem diferenciação de maiúsculas e minúsculas sem converter todas as strings, o que pode ser muito mais eficiente.

Vamos dar uma olhada em um exemplo do mundo real para ver a diferença de desempenho entre o uso de funções e a cláusula COLLATE. Considere as seguintes consultas executadas na tabela Person no banco de dados AdventureWorks2019:

SET STATISTICS IO ON

-- 211 registros
SELECT *
FROM AdventureWorks2019.Person.Person
WHERE UPPER(LastName) LIKE 'DIAZ%';

-- 211 registros
SELECT *
FROM AdventureWorks2019.Person.Person
WHERE LastName COLLATE SQL_Latin1_General_CP1_CI_AS LIKE 'DIAZ%';

-- 1 registro
SELECT *
FROM AdventureWorks2019.Person.Person
WHERE UPPER(LastName) LIKE 'JARVIS%';

-- 1 registro
SELECT *
FROM AdventureWorks2019.Person.Person
WHERE LastName COLLATE SQL_Latin1_General_CP1_CI_AS LIKE 'JARVIS%';

As primeiras e terceiras consultas usam a função UPPER na cláusula WHERE, enquanto as segundas e quartas consultas usam a cláusula COLLATE. As estatísticas dessas consultas mostram que a cláusula COLLATE realiza significativamente menos leituras lógicas em comparação com a função UPPER.

É importante observar que o benefício de desempenho do uso da cláusula COLLATE se deve principalmente à existência de um índice na coluna LastName. Se não houvesse um índice na coluna, a diferença de desempenho entre os dois métodos pode não ser significativa.

Em conclusão, o uso de funções na cláusula WHERE pode impactar significativamente o desempenho de suas consultas no SQL Server. Ao entender as razões por trás disso e saber como evitar o uso de funções na cláusula WHERE, você pode otimizar suas consultas e melhorar a eficiência geral das operações do seu banco de dados. Sempre leve em consideração o tipo de dados, a colação e a estratégia de indexação ao escrever suas consultas SQL para garantir um desempenho ideal.

Sinta-se à vontade para entrar em contato comigo no Twitter se tiver alguma dúvida ou quiser saber mais sobre a otimização de consultas no SQL Server.

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.