Em um livro sobre SQL Server 2014, fui aconselhado a evitar
SELECT orderid, orderdate, filler
FROM dbo.Orders
WHERE YEAR(orderdate) = 2014;
e prefiro
SELECT orderid, orderdate, filler
FROM dbo.Orders
WHERE orderdate >= '20140101'
AND orderdate < '20150101';
quando há um índice clusterizado ativado orderdate
porque o uso YEAR
torna a consulta não SARGable.
Isso mudou desde o SQL Server 2014? Em caso afirmativo, em qual versão isso mudou?
Sim - ainda não é sargável ( 2022 Fiddle ).
Algumas solicitações relacionadas no site Connect (links de máquinas wayback) foram
Mas estes nunca foram implementados até agora. A resposta ao segundo (que menciona especificamente
YEAR
) foiPara mim, parece o tipo de coisa que poderia ter sido considerada no slogan do SQL Server 2016 "It Just Runs Faster", mas provavelmente não foi!
A nova
DATETRUNC
função também não é sargável, mas pelo menos entende que quando aplicadaDATETRUNC
em uma coluna preservará a ordem dessa coluna - portanto, pode evitar classificações desnecessárias ao agrupar por ano, por exemplo.Se isso fosse implementado, presumo que poderia muito bem ser feito de maneira semelhante à sargabilidade de
CAST
toDATE
, usando o mecanismo de busca dinâmica .Mesmo neste caso, apenas expressá-lo
>= ... <
diretamente como um intervalo ainda é mais eficiente do que apenas confiar na busca dinâmica para resolvê-lo.