Performance

SQL Server – Como evitar funções na cláusula WHERE para performance

Saiba como melhorar a performance ao evitar funções na cláusula WHERE do SQL Server

 

O SQL Server oferece muitas funções úteis que podem ser usadas na cláusula SELECT ou na cláusula WHERE. Para a maior parte dessas funções o SQL fornece codificações complexas que seria muito difícil obter essa mesma funcionalidade sem essas funções. Além das funções do SQL Server nativas, você também tem a capacidade de desenvolver suas próprias funções. Quando as funções são usadas na cláusula SELECT para retornar a saída maiúscula, uma substring ou qualquer outra coisa, ela não afeta muito o desempenho, mas quando as funções são usadas incorretamente na cláusula WHERE, essas funções podem causar problemas de desempenho.

Quando as funções são usadas na cláusula SELECT, a função deve ser executada com cada valor de dados para retornar os resultados corretos. Isso pode não ser uma coisa ruim se você está apenas retornando poucas linhas de dados. Mas quando essas mesmas funções são usadas na cláusula WHERE isso força o SQL Server para fazer uma varredura de tabela ou varredura de índice para obter os resultados corretos em vez de fazer um índice seek que pode ser usado. A razão para isto é que o valor da função tem de ser avaliado para cada linha de dados para determinar se corresponde aos seus critérios.

Abaixo vou mostrar a vocês alguns exemplos que ocorrem quando fazemos isso.

Esse teste foi feito na versão do SQL Server 2014 na base de dados Adventureworks2014:

Este primeiro exemplo usa a função LEFT para obter os dois primeiros caracteres do endereço de e-mail. Uma vez feito isso, cada linha é avaliada para ver se ela corresponde aos critérios. O EmailAddress é indexado, portanto, o SQL Server opta por ler todo o índice de procurar encontrar os dados.

SELECT EmailAddress 
FROM person.EmailAddress 
WHERE left(EmailAddress,2) = 'As'

Outra versão dessa mesma consulta que retorna os mesmos resultados usa a cláusula LIKE em vez disso. Esta consulta usa a cláusula like para obter todos os dados que começa com “As”. Como há um índice na coluna EmailAddress, o SQL Server pode fazer uma busca de índice seek que é muito mais eficiente do que uma verificação de índice scan.

SELECT EmailAddress 
FROM person.EmailAddress 
WHERE EmailAddress LIKE 'As%'

Aqui está outro exemplo onde a cláusula UPPER é usada para transformar o endereço de e-mail em letras maiúsculas antes de avaliar os dados. Novamente o endereço de e-mail é indexado.

SELECT EmailAddress 
FROM person.EmailAddress
WHERE upper(EmailAddress) like 'AS%'

Uma segunda versão desta consulta novamente apenas usa a cláusula LIKE para obter os mesmos resultados porém fazendo uso do índice seek.

SELECT EmailAddress 
FROM person.EmailAddress
WHERE EmailAddress like 'AS%'

Aqui está outro exemplo onde a função DateDiff é usada. A função está obtendo linhas onde a diferença em minutos entre o ModifiedDate e a função getdate () é maior que zero, a coluna ModifiedDate é indexada.

SELECT ModifiedDate 
FROM person.Person
WHERE datediff(minute,ModifiedDate,getdate())>0

Nesta versão estamos apenas fazendo uma comparação direta de ModifiedDate em relação ao getdate (). O cenário de índice mais uma vez faz seek na leitura.

SELECT ModifiedDate 
FROM person.Person 
WHERE ModifiedDate < getdate()

 

 

SQL Server – Como evitar funções na cláusula WHERE para performance
Wesley Mota

Profissional graduado em Banco de Dados e Sistemas de Informação com mais de 7 anos de experiência em empresas de software. Certificado MCSA Microsoft SQL Server possui intensa vivência em administração de banco de dados, Tunning, Performance SQL Server, levantamento de melhorias e monitoramento de banco de dados e servidores SQL Server. Consultoria SQL Server em diversos clientes no Brasil e ao redor do mundo. Escritor no blog dbasqlserverbr.com.br/blog. Onde compartilha conhecimento, experiências e dicas de performance para DBAs SQL Server. Conhecimentos em Oracle e ambientes de alta disponibilidade. Desenvolvimento de softwares web e mobile.Gerenciamento de equipe e projetos.

Share
Published by
Wesley Mota

Recent Posts

Dicas de como 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…

6 anos ago

Como diminuir o RESOURCE_SEMAPHORE_QUERY_COMPILE

Saiba agora mesmo como você pode diminuir o RESOURCE_SEMAPHORE_QUERY_COMPILE no SQL Server. Recentemente eu trabalhei em…

8 anos ago

Funções de Data no SQL Server: Conheça a DATEADD ()

Nós DBA' e desenvolvedores quase sempre temos que trabalhar com datas quando se trata de…

8 anos ago

3 Maneiras Para Proteger a Conta SA no SQL Server

Quais são as diferentes maneiras de proteger o login Senha do Administrador (SA)? Todos estão…

8 anos ago

Alterar a Senha de SA do SQL Server: Como Fazer?

Com os direitos que o login sa tem por padrão no SQL Server, é obrigatório…

8 anos ago

Segurança Para DBAs e Administradores no SQL SERVER

Como um DBA, você tem a responsabilidade de garantir a segurança do aplicativo e dos…

8 anos ago