it-swarm.com.de

Was macht eine SQL-Anweisung so wertvoll?

Per Definition (zumindest nach dem, was ich gesehen habe) bedeutet sargable, dass eine Abfrage in der Lage ist, den von der Abfrage verwendeten Ausführungsplan von der Abfrage-Engine zu optimieren. Ich habe versucht, die Antworten nachzuschlagen, aber es scheint nicht viel zu dem Thema zu geben. Die Frage ist also, was macht eine SQL-Abfrage sargable oder nicht? Jede Dokumentation wäre sehr dankbar.

Als referenz: SARGable

234
DForck42

Das häufigste, was eine Abfrage zu einer nicht sargierbaren Abfrage macht, ist das Einfügen eines Feldes in eine Funktion in die where-Klausel:

SELECT ... FROM ...
WHERE Year(myDate) = 2008

Das SQL-Optimierungsprogramm kann keinen Index für myDate verwenden, selbst wenn einer vorhanden ist. Diese Funktion muss buchstäblich für jede Zeile der Tabelle ausgewertet werden. Viel besser zu bedienen:

WHERE myDate >= '01-01-2008' AND myDate < '01-01-2009'

Einige andere Beispiele:

Bad: Select ... WHERE isNull(FullName,'Ed Jones') = 'Ed Jones'
Fixed: Select ... WHERE ((FullName = 'Ed Jones') OR (FullName IS NULL))

Bad: Select ... WHERE SUBSTRING(DealerName,4) = 'Ford'
Fixed: Select ... WHERE DealerName Like 'Ford%'

Bad: Select ... WHERE DateDiff(mm,OrderDate,GetDate()) >= 30
Fixed: Select ... WHERE OrderDate < DateAdd(mm,-30,GetDate()) 
237
BradC

Mach das nicht:

WHERE Field LIKE '%blah%'

Dies führt zu einem Tabellen-/Index-Scan, da der LIKE-Wert mit einem Platzhalterzeichen beginnt.

Mach das nicht:

WHERE FUNCTION(Field) = 'BLAH'

Das führt zu einem Table/Index Scan.

Der Datenbankserver muss FUNCTION () für jede Zeile in der Tabelle auswerten und dann mit 'BLAH' vergleichen.

Wenn möglich, mache es in umgekehrter Reihenfolge:

WHERE Field = INVERSE_FUNCTION('BLAH')

Dadurch wird INVERSE_FUNCTION () für den Parameter einmal ausgeführt und die Verwendung des Index weiterhin zugelassen.

75
beach

In dieser Antwort gehe ich davon aus, dass die Datenbank über ausreichende Deckungsindizes verfügt. Es gibt genug Fragen zu dieses Thema .

In vielen Fällen wird die Ladbarkeit einer Abfrage durch den Wendepunkt der zugehörigen Indizes bestimmt. Der Tipppunkt definiert den Unterschied zwischen dem Suchen und Scannen eines Indexes beim Verknüpfen einer Tabelle oder Ergebnismenge mit einer anderen. Ein Suchlauf ist natürlich viel schneller als das Durchsuchen einer ganzen Tabelle, aber wenn Sie viele Zeilen durchsuchen müssen, kann ein Suchlauf sinnvoller sein.

Daher ist eine SQL-Anweisung unter anderem dann sinnvoller, wenn das Optimierungsprogramm erwartet, dass die Anzahl der resultierenden Zeilen einer Tabelle unter dem Kipppunkt eines möglichen Indexes für die nächste Tabelle liegt.

Einen ausführlichen Beitrag und ein Beispiel finden Sie hier .

Damit eine Operation als sargable betrachtet werden kann, reicht es nicht aus, nur einen vorhandenen Index zu verwenden. Im obigen Beispiel würde das Hinzufügen eines Funktionsaufrufs für eine indizierte Spalte in der where-Klausel höchstwahrscheinlich den definierten Index nutzen. Es "scannt" aka ruft alle Werte aus dieser Spalte (Index) ab und entfernt dann diejenigen, die nicht mit dem angegebenen Filterwert übereinstimmen. Es ist immer noch nicht effizient genug für Tabellen mit einer hohen Anzahl von Zeilen. Was die Zuverlässigkeit wirklich definiert, ist die Abfragefähigkeit, den B-Tree-Index mithilfe der binären Suchmethode zu durchlaufen, die auf der Eliminierung der halben Menge für das sortierte Elementarray beruht. In SQL würde es im Ausführungsplan als "Indexsuche" angezeigt.

4
user2011845