Dicas SQL Server

Dicas de como a função UPPER() no SQL Server pode degradar a performance

Dicas e cuidados com a função UPPER() no SQL Server pode degradar a performance

Saiba como a função UPPER() no SQL Server pode degradar a performance das suas consultas

Olá pessoal, neste post eu gostaria de compartilhar algumas dicas e cuidados de como a função UPPER() no SQL Server pode degradar a performance.

Sabemos que a função UPPER() é bastante utilizada por nossos colegas programadores e dba’s SQL Server. É uma ótima função, porém ela pode ser utilizada em casos de necessidade ou nos locais corretos.

O que a consulta UPPER() no SQL Server faz?

Segundo a documentação do SQL Server, essa função retorna caracteres em MAIÚSCULO.

Isso é ótimo pois conhecemos alguns sistemas que ao consultar um cadastro nosso no banco de dados, normalmente aquele cadastro está em letras maiúsculas.

Agora, qual seria o problema em utilizar a função UPPER? Quais lugares não são menos recomendáveis?

Funções de modo geral no SQL Server existem, são uteis, mas em termos de performance, não ajudam bastante. Ao executar uma consulta no banco de dados o SQL Server fará leituras das páginas que você precisa.

Se o dado que está armazenado no SQL Server precisa ser “alterado” para que fique legível, aí meu caro amigo, mora o problema. Funciona mais ou menos assim:

Digamos que eu diga para você pegar buscar para mim papéis que estão em uma caixa, até aí tudo bem para você, isso é fácil é só pegar e me entregar, mas eu quero que você pegue todos os papéis um por um dobre-os no meio antes de me entregar, pois eu gosto deles dobrados.

O que eu fiz? Eu dei um trabalho para você certo? Agora imagina se essa caixa é bem grande e tem muitos papéis. Vai demorar mais tempo para você me trazer tudo isso dobrado do jeito que eu quero.

Funções no SQL Server geram mais custos para o banco de dados e não ajudam muito a estimar quantidade de dados a serem processados, vejamos a seguir um exemplo usando a função UPPER().

Eu tenho aqui a base de dados AdventureWorks2017 no SQL Server 2017, com a collation SQL_Latin1_General_CP1_CI_AS, vou explicar melhor sobre isso depois.

Vamos executar a consulta a seguir e analisar o plano de execução.

SELECT  
AddressID 
,AddressLine1 
,AddressLine2 
--,UPPER (City) AS CITY 
, City 
,StateProvinceID 
,PostalCode 
,SpatialLocation 
,rowguid 
,ModifiedDate 
 FROM Person.Address 
WHERE City = UPPER('Seattle') 

Cardinality using function SQL

Como podemos ver, o SQL estimou que faria leituras de 34,111 linhas, quando que na verdade leu apenas 141 linhas.

Vamos entender o código, você precisa de todos os endereços das pessoas que moram na cidade de Seattle, mas por que você procurou o nome da cidade letras maiúsculas?

Vamos falar brevemente aqui sobre collation, atualmente estamos utilizando SQL_Latin1_General_CP1_CI_AS significa que alí aonde está escrito CI é case insensitive, então ‘GYZ’ deverá ser igual a ‘gyz’.

Logo, não há necessidade de colocar a função UPPER() do SQL Server pois os registros que retornarão serão os mesmos.

Ao retirar a função você terá a mesma informação com o SQL estimando a quantidade de linhas corretamente.

SQL função UPPER performance SQL

 

Se a collation do seu banco de dados é case sentitive, converse com a equipe de desenvolvimento para vocês procurarem melhores alternativas a fim de eliminar as funções das suas querys.

Faça testes, mostre os ganhos de performance e proponha mudanças para melhorar essas consultas.

Fica então essa dica de como a função UPPER() no SQL Server pode degradar a performance

Quaisquer dúvidas, deixe seu comentário abaixo. Um grande abraço a todos!

Você está com problemas de performance no seu banco de dados? Entre em contato para solicitar um DBA SQL Server Remoto para sua empresa.

Dicas de como a função UPPER() no SQL Server pode degradar a performance
The following two tabs change content below.

Wesley Mota