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()
Wesley Mota
Latest posts by Wesley Mota (see all)
- The Ultimate Guide to Gry Online Ruletka - novembro 14, 2024