SQL Server Performance

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

Funções na Cláusula Where

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'

Query Plan 1

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%'

Query Plan 2

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%'

Query Plan 3

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%'

Query 4

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

Query Plan 5

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()

Query Plan 6

 

 

SQL Server – Como evitar funções na cláusula WHERE para performance
The following two tabs change content below.

Wesley Mota

DBA SQL Server
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.

Latest posts by Wesley Mota (see all)