Särgbar
I relationsdatabaser sägs ett villkor (eller predikat) i en fråga vara sargable om DBMS- motorn kan dra fördel av ett index för att påskynda exekveringen av frågan. Termen härrör från en sammandragning av Search ARGument ABLE . Det användes först av IBM-forskare som en sammandragning av Search ARGument, och har kommit att betyda helt enkelt "kan slås upp av ett index."
En fråga som inte är sargbar är känd som en icke-sargbar fråga och har vanligtvis en negativ effekt på frågetiden, så ett av stegen i frågeoptimering är att konvertera dem till att vara sargbara. Effekten liknar att söka efter en specifik term i en bok som inte har något index, med början på sida ett varje gång, istället för att hoppa till en lista med specifika sidor som identifieras i ett index.
Den typiska situationen som kommer att göra en SQL-fråga icke-sargbar är att i WHERE-satsen inkludera en funktion som verkar på ett kolumnvärde. WHERE-satsen är inte den enda klausulen där sargbarhet kan ha betydelse; det kan också ha en effekt på ORDER BY, GROUP BY och HAVING-satser. SELECT-satsen, å andra sidan, kan innehålla icke-sargerbara uttryck utan att påverka prestandan negativt.
Vissa databashanteringssystem, till exempel PostgreSQL, stöder funktionella index . Begreppsmässigt är ett index helt enkelt en mappning mellan ett värde och en eller flera platser. Med ett funktionsindex är värdet som lagras i indexet resultatet av den funktion som anges när indexet skapas. Denna förmåga utökar det som är sargbart bortom baskolumnuttryck.
- Särgbara operatorer:
= , > , < , >= , <= , BETWEEN , LIKE , IS [ NOT ] NULL , IN
- Särgbara operatörer som sällan förbättrar prestandan:
<> , NOT , NOT IN , NOT LIKE
Enkelt exempel
WHERE-
satser som är sargbara har vanligtvis fältvärden till vänster om operatorn och skalära värden eller uttryck till höger om operatorn.
Ej särgbar:
VÄLJ * FRÅN myTable WHERE SQRT ( myIntField ) > 11.7
Detta är inte sargable eftersom myIntField är inbäddat i en funktion. Om några index var tillgängliga på myIntField kunde de inte användas. Dessutom skulle SQRT () anropas på varje post i myTable.
Särgbar version:
VÄLJ * FRÅN myTable WHERE myIntField > 11.7 * 11.7
Detta är sargable eftersom myIntField INTE ingår i en funktion, vilket gör alla tillgängliga index på myIntField potentiellt användbara. Dessutom utvärderas uttrycket endast en gång, snarare än för varje post i tabellen.
Textexempel
WHERE
... LIKE-
satser som är sargbara har fältvärden till vänster om operatorn och LIKE-
textsträngar som inte börjar med %
till höger.
Ej särgbar:
VÄLJ * FRÅN myTable WHERE myNameField LIKE '%Wales%' -- Börjar med %, inte sargable
Detta är inte sargable. Den måste undersöka varje rad för att hitta fälten som innehåller delsträngen ' Wales'
i valfri position.
Särgbar version:
VÄLJ * FRÅN myTable WHERE myNameField LIKE 'Jimmy%' -- Börjar inte med %, sargable
Detta är sargable. Den kan använda ett index för att hitta alla myNameField-värden som börjar med delsträngen ' Jimmy'
.
Se även
Anteckningar
- ^1 Gulutzan och Pelzer, ( Kapitel 2, Enkla "Sökningar" )
- SQL Performance Tuning av Peter Gulutzan, Trudy Pelzer (Addison Wesley, 2002) ISBN 0-201-79169-2 ( Kapitel 2, Enkla "Sökningar" )
- Microsoft SQL Server 2012 Internals av Kalen Delaney, Connor Cunningham, Jonathan Kehayias, Benjamin Nevarez, Paul S. Randal (O'Reily, 2013) ISBN 978-0-7356-5856-1 (kapitel 11, The Query Optimizer)
externa länkar
- SQL Shack - Hur man använder sargbara uttryck i T-SQL-frågor; prestandafördelar och exempel
- DBA.StackExchange.com - Vad betyder ordet "SARGable" egentligen?