Ein Prädikat ist ein bedingter Ausdruck, aus dem, zusammen mit den logischen Operatoren AND und OR, die Reihe von Bedingungen in einer WHERE-, HAVING- oder ON-Klausel besteht. In SQL wird ein Prädikat, das als UNKNOWN aufgelöst wird, als FALSE interpretiert.
Ein Prädikat, das einen Index verwenden kann, um Zeilen aus einer Tabelle abzurufen, wird sargable (als Suchargument nutzbar) genannt. Diese Bezeichnung ist abgeleitet aus search argument-able (suchargumentfähig). Prädikate, die Vergleiche einer Spalte mit Konstanten, anderen Spalten oder Ausdrücken beinhalten, können "sargable" sein.
Das Prädikat in der folgenden Anweisung ist "sargable". SQL Anywhere kann es unter Verwendung des primären Indexes der Employees-Tabelle effizient auswerten.
SELECT * FROM Employees WHERE Employees.EmployeeID = 102; |
Im Plan erscheint dies folgendermaßen: Employees<Employees>
Im Gegensatz dazu ist das folgende Prädikat nicht sargable. Auch wenn die EmployeeID-Spalte im primären Index indiziert ist, beschleunigt die Verwendung dieses Indexes die Berechnung nicht, weil das Ergebnis alle Zeilen, oder alle bis auf eine Zeile, enthält.
SELECT * FROM Employees where Employees.EmployeeID <> 102; |
Im Plan erscheint dies folgendermaßen: Employees<seq>
Gleichermaßen kann kein Index eine Suche unterstützen, bei der alle Mitarbeiter gesucht werden, deren Vorname mit k endet. Auch hier besteht die einzige Möglichkeit zum Berechnen dieses Ergebnisses darin, jede Zeile einzeln zu prüfen.
Im Allgemeinen ist ein Prädikat, das eine Funktion für den Spaltennamen hat, nicht "sargable". Beispielsweise würde für die folgende Abfrage kein Index verwendet werden:
SELECT * FROM SalesOrders WHERE YEAR ( OrderDate ) ='2000'; |
Um die Verwendung einer Funktion zu vermeiden, können Sie eine Abfrage neu schreiben, um sie "sargable" zu machen. Die Abfrage oben können Sie z.B. wie folgt neu schreiben:
SELECT * FROM SalesOrders WHERE OrderDate > '1999-12-31' AND OrderDate < '2001-01-01'; |
Eine Abfrage, die eine Funktion verwendet, wird sargable, wenn Sie die Funktionswerte in einer berechneten Spalte speichern und einen Index für diese Spalte erstellen. Eine berechnete Spalte ist eine Spalte, deren Werte aus anderen Spalten stammen. Wenn beispielsweise in einer Spalte namens OrderDate das Datum einer Bestellung enthalten ist, können Sie eine berechnete Spalte mit dem Namen OrderYear erstellen, in der die Werte für das Jahr enthalten sind, die aus der Spalte OrderDate extrahiert wurden.
ALTER TABLE SalesOrders ADD OrderYear INTEGER COMPUTE ( YEAR( OrderDate ) ); |
Sie können dann ganz normal einen Index für die Spalte OrderYear hinzufügen:
CREATE INDEX IDX_year ON SalesOrders ( OrderYear ); |
Wenn Sie dann die folgende Anweisung ausführen, erkennt der Datenbankserver, dass eine Spalte mit Index vorhanden ist, die diese Informationen enthält, und verwendet diesen Index, um auf die Abfrage zu antworten.
SELECT * FROM SalesOrders WHERE YEAR( OrderDate ) = '2000'; |
Die Domäne der berechneten Spalte muss der Domäne des COMPUTE-Ausdrucks entsprechen, damit die Spaltenersetzung vorgenommen
werden kann. Wenn im Beispiel oben für YEAR( OrderDate )
eine Zeichenfolge anstelle einer Ganzzahl zurückgegeben worden wäre, hätte der Optimierer den Ausdruck nicht durch die berechnete
Spalte ersetzt, und der Index "IDX_year" hätte nicht zum Abrufen der erforderlichen Zeilen verwendet werden können.
Weitere Informationen zu berechneten Spalten finden Sie unter Mit berechneten Spalten arbeiten.
In jedem dieser Beispiele handelt es sich bei den Attributen x und y um Spalten einer einzigen Tabelle. Das Attribut z ist in einer separaten Tabelle enthalten. Für jedes dieser Attribute gibt es einen Index.
sargable | Nicht sargable |
---|---|
x = 10 | x < > 10 |
x IS NULL | x IS NOT NULL |
x > 25 | x = 4 OR y = 5 |
x = z | x = y |
x IN (4, 5, 6) | x NOT IN (4, 5, 6) |
x LIKE 'pat%' | x LIKE '%tern' |
x = 20 - 2 | x + 2 = 20 |
Manchmal ist es nicht offensichtlich, ob ein Prädikat sargable ist. In diesen Fällen könnten Sie das Prädikat neu schreiben, damit es sargable wird. Zum Beispiel könnten Sie das Prädikat x LIKE 'pat%' neu schreiben, unter Berücksichtigung der Tatsache, dass "u" im Alphabet der nächste Buchstabe nach "t" ist: x >= 'pat' und x < 'pau'. In dieser Form hilft ein Index auf dem Attribut x, die Werte im eingeschränkten Bereich aufzufinden. SQL Anywhere führt diese spezielle Transformation automatisch durch.
Ein sargable-Prädikat, das für einen indizierten Abruf in einer Tabelle verwendet wird, nennt man übereinstimmendes Prädikat. Eine WHERE-Klausel kann viele übereinstimmende Prädikate haben. Welches das geeignetste Prädikat ist, kann von der Join-Strategie abhängen. Der Optimierer bewertet seine Auswahl von übereinstimmenden Prädikaten erneut, wenn er verschiedene Join-Strategien bewertet. Weitere Hinweise finden Sie unter Nutzbare Bedingungen durch Prädikat-Inferenz suchen.
Kommentieren Sie diese Seite in DocCommentXchange. Senden Sie uns Feedback über diese Seite via E-Mail. |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |