Noen ytelsesproblemer i SQL Server er komplekse.
Andre starter med noe veldig enkelt: Hvordan WHERE-klausulen i queryen din er skrevet. Et sentralt begrep her er SARGable.
Hva betyr SARGable?
SARGable kommer fra uttrykket: Search ARGument ABLE
Det betyr at SQL Server kan bruke et søkeargument (predikatet ditt) til å navigere direkte i en indeks. Når en betingelse er SARGable, kan optimizer gjøre en index seek. Når den ikke er det, må den ofte gjøre en scan.
Forskjellen er stor når tabellen vokser.
Kort sagt:
-
SARGable = SQL Server kan bruke indeksen effektivt
-
Ikke SARGable = SQL Server må lese mer data enn nødvendig
Eksempel
Vi har tabellen Orders med clustered eller non-clustered index på kolonnen OrderDate. Følgende query:
SELECT *
FROM Orders
WHERE YEAR(OrderDate) = 2025;
Queryen er korrekt. Den returnerer riktig data. Men den er ikke SARGable. Hvorfor? Fordi vi bruker en funksjon på kolonnen:
YEAR(OrderDate)
Da må SQL Server beregne YEAR() for hver rad før den kan sammenligne. Indeksen på OrderDate kan ikke brukes direkte. Resultatet blir ofte en index scan.
SARGable versjon
SELECT *
FROM Orders
WHERE OrderDate >= ‘2025-01-01’
AND OrderDate < ‘2026-01-01’;
Her står kolonnen uendret.
SQL Server kan:
-
Navigere direkte i indeksen
-
Begrense lesingen til et intervall
-
Estimere radantall mer presist
Dette er SARGable.