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.