Dicas de T-SQL – SARGable

Você já ouviu falar do termo “sargable”? Falaremos hoje um pouco a respeito deste conceito, muito comum em discussões no mundo SQL.

Sargable refere-se aos predicados presentes na cláusula WHERE de uma consulta. De maneira geral, quando o Sistema de Gerenciamento de Banco de Dados (SGBD) consegue tirar vantagem do uso de um índice para recuperar os dados de uma consulta de forma mais rápida – tipicamente usando uma operação de SEEK – dizemos que o predicado é sargable. Este termo deriva de “Search ARGument ABLE” – algo que poderia ser traduzido como argumento buscável. De maneira inversa, isto é, quando o SGBD não consegue usar um índice para busca – normalmente realiza um SCAN – dizemos que o predicado é non-sargable.

Existem vários cenários que podem fazer com que um predicado se torne non-sargable. Iremos exemplificar alguns deles:

1. Uso de funções

SELECT COUNT (*)
FROM Production.TransactionHistory
WHERE YEAR (TransactionDate) = 2014 
AND MONTH (TransactionDate) = 5;

Ao aplicarmos as funções YEAR e MONTH sobre a coluna [TransactionDate], tornamos os predicados non-sargable. Isso ocorre porque o SGBD precisa aplicar as funções antes de realizar a busca dos campos, o que acaba fazendo com que todos os registros sejam avaliados:

Uma alternativa de escrita para essa consulta poderia usar um comparativo de datas com operadores de >= e < para poder realizar o filtro do Ano/Mês conforme a consulta original.

SELECT COUNT (*)
FROM Production.TransactionHistory
WHERE TransactionDate >= '2014-05-01' 
AND TransactionDate < '2014-06-01';

O novo plano de consulta, agora realiza um SEEK no índice sobre o campo [TransactionDate]:

2. Like com % no início

Quando utilizamos % no início de uma busca com LIKE, este predicado passa a ser non-sargable.

SELECT Name
FROM Production.Product
WHERE Name LIKE '%LL%';

Desta forma, preferimos não usar o % no início da busca:

SELECT Name
FROM Production.Product
WHERE Name LIKE 'LL%';

As duas consultas produzem resultados diferentes, então fica a dica de que sempre que possível, é preferível não usar % no início da busca.

3. Uso de expressões

O uso de expressões em campos de busca também faz com que o predicado se torne non-sargable:

SELECT COUNT (*)
FROM Production.TransactionHistory
WHERE Quantity + 42 > 100;

Neste exemplo, uma alternativa poderia ser aplicar a expressão no outro lado do predicado:

SELECT COUNT (*)
FROM Production.TransactionHistory
WHERE Quantity > 100 - 42;

Em processos de tuning, um movimento bastante comum é analisar consultas com predicados non-sargable na tentativa de transformá-los em sargable.

Observação: Em nossos exemplos, usamos uma base oficial de treinamento Microsoft – AdventureWorks2017.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *