SQL Server-Benutzer verwenden den Begriff "sargable" . Ich frage mich, ob es eine objektive implementierungsunabhängige zeitlose Definition für "sargable" gibt.
Zum Beispiel WHERE foo LIKE '%bar%'
wird von vielen gesagt, dass sie nicht sargable sind , aber einige RDBMSs sind in der Lage, Indizes für solche Abfragen zu verwenden . Was heißt dann "nicht sargbar" ?
Weitere Referenzen
terminology
Evan Carroll
quelle
quelle
Antworten:
Der Begriff "sargable" wurde erstmals von P. Griffiths Selinger et al. in ihrem 1979 von ACM veröffentlichten Aufsatz "Zugriffspfadauswahl in einem relationalen Datenbankverwaltungssystem" . Für Nicht-ACM-Mitglieder gibt es eine Kopie dieses Papiers unter http://cs.stanford.edu/people/chrismre/cs345/rl/selinger.pdf
Der Begriff wird in diesem Absatz definiert:
Mit anderen Worten, ein sargables Prädikat ist so beschaffen, dass es von der Speicher-Engine (Zugriffsmethode) aufgelöst werden kann, indem die Tabelle oder der Indexsatz direkt betrachtet werden. Umgekehrt erfordert ein nicht sargierbares Prädikat eine höhere Ebene des DBMS, um Maßnahmen zu ergreifen. Zum Beispiel kann das Ergebnis von
WHERE lastname = 'Doe'
durch die Speicher-Engine bestimmt werden, indem einfach der Inhalt des Feldeslastname
jedes Datensatzes betrachtet wird.WHERE UPPER(lastname) = 'DOE'
Erfordert andererseits die Ausführung einer Funktion durch die SQL-Engine. Dies bedeutet, dass die Speicher-Engine alle gelesenen Zeilen (sofern sie mit möglichen anderen, aufladbaren Prädikaten übereinstimmen) zur Auswertung an die SQL-Engine zurücksenden muss, was zusätzliche CPU-Kosten verursacht .Aus der ursprünglichen Definition geht hervor, dass sargable Prädikate nicht nur für Index-Scans, sondern auch für Tabellen-Scans (Segment in System R-Terminologie) gelten können, sofern die Bedingungen "Spaltenvergleich-Operatorwert" erfüllt sind und daher erfüllt werden können von der Speicher-Engine ausgewertet. Dies ist in der Tat bei Db2, einem Nachkommen von System R, in vielerlei Hinsicht der Fall :
Die Tatsache, dass sargable Prädikate in SQL Server-Sprache nur solche sind, die mithilfe von Indexsuchen aufgelöst werden können, wird wahrscheinlich durch die Unfähigkeit des Speicher-Moduls bestimmt, solche Prädikate während Tabellensuchen anzuwenden.
Sargable und nicht-sargable Prädikate werden manchmal als "Stadium 1" - bzw. "Stadium 2" -Prädikate beschrieben (dies stammt auch aus der Db2-Terminologie ). Prädikate der Stufe 1 können auf der niedrigsten Ebene der Abfrageverarbeitung ausgewertet werden, während Tabellen- oder Indexdatensätze gelesen werden. Zeilen, die den Bedingungen von Stufe 1 entsprechen, werden an die nächste Stufe 2 der Bewertung gesendet.
1 - Segment in System R ist der physische Speicher der Tupel einer Tabelle; Ein Segment-Scan entspricht in etwa einem Tabellenscan in anderen DBMS.
2 - RSI - RSS 3 Interface, eine Tupel-orientierte Abfrageoberfläche. Die für diese Diskussion relevante Schnittstellenfunktion ist NEXT, die die Abfrageprädikate für die nächste Zeile zurückgibt.
3 - RSS oder Research Storage System, das Speichersubsystem von System R.
quelle
= UPPER()
ist ein Funktionsaufruf, aber so ist esmemcmp
für sich. Es wäre relativ einfach, ein Format zu schreibenmemcmp
, das ASCII voraussetzt und Groß- und Kleinschreibung ignoriert (sehen Sie sich nur das zweite Halbbyte an). Macht es das SARGABLE? Siehe auch @ Ypercubes Beispiel, dba.stackexchange.com/questions/162263/…x=0
SARGable? Was-0 = +0
ist mit' ' = ''
oder räumliche Gleichheit? Was wäre mit Sicherheit ein Beispiel für etwas, das SARGable ist? Wenn Sie "ohne Rückgriff auf außerhalb der Speicher-Engine implementierte Datenbankfunktionen" sagen, nehmen Sie an Ypercubes Beispiel teil,DATE()
das in der Speicher-Engine enthalten ist. Warum ist das nicht SARGable für sich?DATE()
keine echte (SQL Server) Funktion ist, sondern (wie ich vermutete) die Kurzform von Mr. Cube für eine Typkonvertierung. Wir können dies auch im Chat besprechen, wenn Sie möchten.Für mich bedeutet SARGable, dass SQL Server eine Indexsuche mit Ihren Suchprädikaten durchführen kann.
Sie können nicht einfach sagen, dass das DBMS einen Index "ausnutzen" kann, da SQL Server bei einem nicht sargierbaren Prädikat möglicherweise einen nicht gruppierten Index scannt.
quelle
Laut Pro SQL Server Internals von Dmitri Korotkevitch :
Beispiel :
Demo :
Jetzt laufen wir:
Die Ergebnisse sind:
Schauen wir uns die Eigenschaften der SARGable-Abfrage an (Index Seek)
Der Abfrageoptimierer kann ein Limit im Index eines Starts und Endes definieren. Es gibt ein Suchargument, mit dem abgefragt werden kann.
Nun die Nicht-SARGable-Abfrage:
Sie können am Anfang des Prädikats sehen, dass '% non ..%' es dem Abfrageoptimierer nicht ermöglicht, einen Anfang und ein Ende oder einen Bereich im Index zu DEFINIEREN. Es muss nun die ganze Tabelle durchsuchen (scan).
quelle
WHERE name like '%non-SARGable%'
, macht dies die Bedingung sargable? Und wenn ja, sprechen wir nicht über einen bestimmten Implementierungsnachteil? IE., Sollten wir nicht sagen "ab SQL Server 2016 nicht sargable"WHERE DATE(datetime_column) = '2001-01-01'
Zum Beispiel ist "sargable" (führt eine Indexsuche durch) in neueren SQL Server-Versionen (glaube ich 2008+), aber nicht in älteren Versionen.