it-swarm.com.de

Was bedeutet das Wort "SARGable" wirklich?

SQL Server-Benutzer verwenden Sie 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 als nicht sargable bezeichnet, aber einige RDBMS können Indizes für solche verwenden Abfragen . Was bedeutet dann "nicht sargable" ?

Weitere Referenzen

26
Evan Carroll

Der Begriff "sargable" wurde erstmals von P. Griffiths Selinger et al. in ihrer 1979 erschienenen Veröffentlichung "Access Path Selection in einem relationalen Datenbankverwaltungssystem", veröffentlicht von ACM . Für Nicht-ACM-Mitglieder gibt es eine Kopie dieses Dokuments unter http://cs.stanford.edu/people/chrismre/cs345/rl/selinger.pdf

Der Begriff wird in diesem Absatz definiert:

Sowohl Index als auch Segment1 Scans können optional eine Reihe von Prädikaten verwenden, die als Suchargumente (SARGS) bezeichnet werden und auf ein Tupel angewendet werden, bevor es an den RSI zurückgegeben wird2 Anrufer. Wenn das Tupel die Prädikate erfüllt, wird es zurückgegeben. Andernfalls wird der Scan fortgesetzt, bis entweder ein Tupel gefunden wird, das den SARGS erfüllt, oder das Segment oder der angegebene Indexwertbereich erschöpft ist. Dies reduziert die Kosten, da der Aufwand für RSI-Aufrufe für Tupel entfällt, die innerhalb des RSS effizient abgelehnt werden können. Nicht alle Prädikate haben die Form, die zu SARGS werden kann. Ein sarkierbares Prädikat ist eines der Form (oder das in das Formular eingefügt werden kann) "Spaltenvergleichsoperatorwert". SARGS werden als boolescher Ausdruck solcher Prädikate in disjunktiver Normalform ausgedrückt.

Mit anderen Worten, ein sargable Prädikat ist ein solches, das von der Speicher-Engine (Zugriffsmethode) durch direktes Beobachten der Tabelle oder des Indexdatensatzes aufgelöst werden kann. Umgekehrt erfordert ein nicht sargable Prädikat eine höhere Ebene des DBMS, um Maßnahmen zu ergreifen. Zum Beispiel kann das Ergebnis von WHERE lastname = 'Doe' Von der Speicher-Engine bestimmt werden, indem einfach der Inhalt des Feldes lastname jedes Datensatzes betrachtet wird. Andererseits erfordert WHERE UPPER(lastname) = 'DOE' die Ausführung einer Funktion durch die SQL-Engine, was bedeutet, dass die Speicher-Engine alle gelesenen Zeilen (vorausgesetzt, sie stimmen mit möglichen anderen, sargable Prädikaten überein) an die SQL-Engine zurückgeben muss zur Auswertung entstehen zusätzliche CPU-Kosten.

Aus der ursprünglichen Definition geht hervor, dass sargable Prädikate nicht nur für Index-Scans gelten können, sondern auch für Tabellen-Scans (Segment in System R-Terminologie), sofern die Bedingungen "Spaltenvergleich-Operator-Wert" erfüllt sind und daher erfüllt sein können von der Speicher-Engine ausgewertet. Dies ist in der Tat bei Db2 der Fall, einem Nachkommen von System R in vielerlei Hinsicht :

Index-sargable Prädikate werden nicht zum Einklammern einer Suche verwendet, sondern bei Auswahl aus dem Index ausgewertet, da die am Prädikat beteiligten Spalten Teil des Indexschlüssels sind. Diese Prädikate werden auch vom Indexmanager ausgewertet.

Datensargable Prädikate sind Prädikate, die vom Indexmanager nicht ausgewertet werden können, aber von Data Management Services (DMS) ausgewertet werden können. In der Regel erfordern diese Prädikate den Zugriff auf einzelne Zeilen aus einer Basistabelle. Falls erforderlich, ruft DMS die Spalten ab, die zur Auswertung des Prädikats erforderlich sind.

Die Tatsache, dass in SQL Server sprechende sargable Prädikate nur solche sind, die mithilfe von Indexsuchen aufgelöst werden können, wird wahrscheinlich durch die Unfähigkeit der Speicher-Engine bestimmt, solche Prädikate während Tabellenscans anzuwenden.

Sargable und nicht sargable Prädikate werden manchmal als Prädikate "Stufe 1" bzw. "Stufe 2" beschrieben (dies kommt auch von 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 gegebenenfalls den Bedingungen der Stufe 1 entsprechen, werden an die nächste Stufe, Stufe 2, der Bewertung gesendet.


1 - Segment in System R ist die physische Speicherung der Tupel einer Tabelle. Ein Segment-Scan entspricht in etwa einem Tabellenscan in anderen DBMS.

2 - RSI - RSS3 Schnittstelle, eine Tupel-orientierte Abfrageschnittstelle. Die für diese Diskussion relevante Schnittstellenfunktion ist NEXT, die die Prädikate für die nächste Zeilenübereinstimmung zurückgibt.

3 - RSS oder Research Storage System, das Speichersubsystem von System R.

34
mustaccio

Für mich bedeutet SARGable, dass SQL Server eine Indexsuche unter Verwendung Ihrer Suchprädikate durchführen kann.

Sie können nicht einfach sagen, dass das DBMS einen Index "ausnutzen" kann, da SQL Server mit einem nicht sargierbaren Prädikat möglicherweise einen nicht gruppierten Index scannt.

19
Brent Ozar

Laut Pro SQL Server Internals von Dmitri Korotkevitch :

Ein ABLE-Prädikat für Search ARgument ist eines, bei dem SQL SERVER eine Indexsuchoperation verwenden kann, wenn ein Index vorhanden ist.

Ein SARGable-Prädikat ist ein Prädikat, bei dem SQL Server den einzelnen Wert oder den Bereich der zu verarbeitenden Indexschlüsselwerte isolieren kann

SARGable-Prädikate umfassen die folgenden Operatoren: =, >, >=, <, <=, IN, BETWEEN und LIKE ( im Fall der Präfixübereinstimmung)

Nicht SARGable-Operatoren umfassen: NOT, NOT IN, <> und LIKE ( kein Präfixabgleich) sowie die Verwendung von Funktionen oder Berechnungen für die Tabelle und Typkonvertierungen, bei denen der Datentyp den erstellten Index nicht erfüllt .

Beispiel :

WHERE name like 'SARGable%'
WHERE name like '%non-SARGable%'

Demo :

DROP TABLE dbo.Testing;
GO

CREATE TABLE Testing (
    WeirdDatatype   int NOT NULL,
    SomethingElse   char(200)
);

CREATE NONCLUSTERED INDEX IDX_ALWAYS_SARGable
    ON dbo.Testing( SomethingElse);

CREATE NONCLUSTERED INDEX IDX_NOT_ALWAYS_SARGable
    ON dbo.Testing(SomethingElse);

INSERT INTO dbo.Testing
        ( WeirdDatatype, SomethingElse )
SELECT TOP 1000 m.message_id, CONVERT(char(200), m.text)
FROM sys.messages AS m;

Jetzt rennen wir:

SELECT *
FROM dbo.Testing AS t
WHERE  t.WeirdDatatype = 1001;
SELECT *
FROM dbo.Testing AS t
WHERE t.SomethingElse LIKE 'Line%'
SELECT *
FROM dbo.Testing AS t
WHERE t.SomethingElse LIKE '%Line%'
     AND t.WeirdDatatype = 1001;

Die Ergebnisse sind:

([1]

Schauen wir uns die Eigenschaften der SARGable-Abfrage an (Index Seek)

(enter image description here

Das Abfrageoptimierungsprogramm kann ein Limit im Index von Start und Ende definieren. Es gibt ein Suchargument zum Abfragen.

Nun die nicht SARGable Abfrage:

(enter image description here

Sie können am Anfang des Prädikats sehen, dass '% non ..%' dem Abfrageoptimierer nicht erlaubt, einen Anfang und ein Ende oder einen Bereich im Index zu definieren. Es muss nun die gesamte Tabelle durchsuchen (Scan).

11
Vic Work