Per Definition (zumindest nach dem, was ich gesehen habe) bedeutet sargable, dass eine Abfrage in der Lage ist, dass die Abfrage-Engine den von der Abfrage verwendeten Ausführungsplan optimiert. Ich habe versucht, die Antworten nachzuschlagen, aber es scheint nicht viel zu diesem Thema zu geben. Die Frage ist also, was macht eine SQL-Abfrage sargable oder nicht? Jede Dokumentation wäre sehr dankbar.
Als Referenz: SARGable
sql-server
performance
DForck42
quelle
quelle
Antworten:
Das häufigste, was eine Abfrage nicht sargbar macht, ist das Einfügen eines Felds in eine Funktion in die where-Klausel:
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:
Einige andere Beispiele:
quelle
GROUP BY
Einfügen einer Funktion in eine Abfrage nicht sarkierbar?WHERE ((FullName = 'Ed Jones') OR (FullName IS NULL))
seinSELECT... FROM ... WHERE FullName = 'Ed Jones' UNION SELECT...FROM...WHERE FullName IS NULL
? Mir wurde einmal von einem Optimierer gesagt, dass die Verwendung von OR in der where-Klausel Abfragen aufheben kann.Select ... WHERE isNull(FullName,'Ed Jones') = 'Ed Jones'
undSelect ... WHERE ((FullName = 'Ed Jones') OR (FullName IS NULL))
. Beide verwenden den Index für FullName und führen eine Indexsuche durch.Tu das nicht:
Dies führt zu einem Tabellen- / Index-Scan, da der LIKE-Wert mit einem Platzhalterzeichen beginnt.
Tu das nicht:
Dies führt zu einem Tabellen- / Index-Scan.
Der Datenbankserver muss FUNCTION () für jede Zeile in der Tabelle auswerten und dann mit 'BLAH' vergleichen.
Wenn möglich, machen Sie es umgekehrt:
Dadurch wird INVERSE_FUNCTION () einmal für den Parameter ausgeführt und der Index kann weiterhin verwendet werden.
quelle
In dieser Antwort gehe ich davon aus, dass die Datenbank über ausreichende Abdeckungsindizes verfügt. Es gibt genug Fragen zu diesem Thema .
In vielen Fällen wird die Sargabilität einer Abfrage durch den Wendepunkt der zugehörigen Indizes bestimmt. Der Wendepunkt definiert den Unterschied zwischen dem Suchen und Scannen eines Index beim Verbinden einer Tabelle oder Ergebnismenge mit einer anderen. Eine Suche ist natürlich viel schneller als das Scannen einer ganzen Tabelle, aber wenn Sie viele Zeilen suchen müssen, kann ein Scan sinnvoller sein.
Daher ist eine SQL-Anweisung unter anderem Sargable, wenn der Optimierer erwartet, dass die Anzahl der resultierenden Zeilen einer Tabelle geringer ist als der Wendepunkt eines möglichen Index für die nächste Tabelle.
Einen ausführlichen Beitrag und ein Beispiel finden Sie hier .
quelle
Damit eine Operation als sargbar angesehen werden kann, reicht es nicht aus, nur einen vorhandenen Index verwenden zu können. Im obigen Beispiel würde das Hinzufügen eines Funktionsaufrufs für eine indizierte Spalte in der where-Klausel höchstwahrscheinlich immer noch den definierten Index nutzen. Es werden alle Werte aus dieser Spalte (Index) "gescannt" und dann diejenigen entfernt, 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 Sargabilität wirklich definiert, ist die Abfragefähigkeit, den B-Tree-Index mithilfe der binären Suchmethode zu durchlaufen, die auf der Eliminierung von Halbmengen für das Array sortierter Elemente beruht. In SQL wird es im Ausführungsplan als "Indexsuche" angezeigt.
quelle