Wenn die SQL-Anweisung Suchbedingungen für indizierte Spalten enthält, kann der SQL-Optimierer folgende Suchstrategien verwenden:
Suchbedingung |
Suchstrategie des SQL-Optimierers |
Gleichheitsbedingung für die indizierten Spalten |
Es wird auf die Zeilen zugegriffen, deren Schlüssel in der zugehörigen Invertierungsliste enthalten sind. |
IN-Bedingung für indizierte Spalten |
Es wird auf die Zeilen zugegriffen, deren Schlüssel in den Invertierungslisten enthalten sind. |
Bereichsbedingungen mit nur einer Bedingung ( <, <=, >, >= ) für eine der beiden Bereichsgrenzen (Unter- bzw. Obergrenze). |
Es wird auf die Zeilen zugegriffen, deren Schlüssel in den Invertierungslisten enthalten sind, die durch den Bereich bestimmt wurden. |
Bereichsbedingungen, bei denen beide Bereichsgrenzen angegeben sind. Für die Auswahl der Suchstrategie ist es unerheblich, ob diese Angabe durch einen BETWEEN-Operator oder durch zwei durch AND verknüpfte Bedingungen ( <= bzw. >= ) für dieselbe Spalte erfolgt. |
Es wird auf die Zeilen zugegriffen, deren Schlüssel in den Invertierungslisten enthalten sind, die durch den Bereich bestimmt wurden. |
Im Fall der Gleichheit/IN-Bedingungen und der Bereichsbedingungen gibt es auch Anfragen, bei denen darauf verzichtet werden kann, auf die Zeilen zuzugreifen, da alle notwendigen Werte bereits in der/den Invertierungsliste(n) enthalten sind.
Die bei den Erläuterungen zum SQL-Optimierer verwendeten Beispiele stützen sich auf die Demo-Datenbank DEMODB und ihre Demo-Daten im Schema HOTEL.
Konzepte des Datenbanksystems, Objekte im Schema HOTEL
SELECT * FROM hotel.customer
WHERE name = 'Wagner'
Qualifikation: name =
'Wagner'
Primärschlüssel der Tabelle CUSTOMER:
cno
Indizes über qualifizierte Spalten: FULL_NAME_INDEX (name, firstname)
genutzte Suchstrategie: RANGE CONDITION FOR
INDEX
Da die Gleichheitsbedingung nur über die erste Indexspalte angegeben ist, muss diese SQL-Anweisung mit einer RANGE CONDITION abgearbeitet werden – es kann im Index mehrere Einträge mit dem Wert Wagner geben.
Der Startschlüssel wird beim ersten Satz gesetzt, der die Gleichheitsbedingung in der ersten Indexspalte erfüllt (Wagner). Der Stoppschlüssel liegt bei dem ersten Satz, der der Bedingung nicht mehr genügt (Walker).
Ergebnis der EXPLAIN-Anweisung
TABLENAME |
COLUMN_OR_INDEX |
STRATEGY |
PAGECOUNT |
CUSTOMER |
FULL_NAME_INDEX |
RANGE CONDITION FOR INDEX |
34 |
|
NAME |
(USED INDEX COLUMN) |
|
|
|
RESULT IS NOT COPIED,
|
|
SELECT * FROM hotel.customer
WHERE name IN ('Smith',
'Miller')
Qualifikation: name = IN
('Smith', 'Miller')
Primärschlüssel der Tabelle CUSTOMER:
cno
Indizes über qualifizierte Spalten: FULL_NAME_INDEX (name, firstname)
genutzte Suchstrategie: IN CONDITION FOR
INDEX
Die SQL-Anweisung wird mit einer IN-Bedingung abgearbeitet. Der SQL-Optimierer hat auch die entsprechende RANGE-Bedingung bewertet, diese wäre bei den gegebenen Werten jedoch teurer.
Ergebnis der EXPLAIN-Anweisung
TABLENAME |
COLUMN_OR_INDEX |
STRATEGY |
PAGECOUNT |
CUSTOMER |
FULL_NAME_INDEX |
IN CONDITION FOR INDEX |
34 |
|
NAME |
(USED INDEX COLUMN) |
|
|
|
RESULT IS NOT COPIED,
|
|
Legen Sie einen einspaltigen Index EMPLOYEE_ENO über die Spalte ENO an.
Siehe auch:
SQL-Referenzhandbuch, CREATE INDEX-Anweisung (create_index_statement)
SELECT eno, hno FROM hotel.employee
WHERE eno >= 8
Qualifikation: eno >=
8
Primärschlüssel der Tabelle EMPLOYEE:
hno, eno
Indizes über qualifizierte Spalten: EMPLOYEE_ENO (eno)
genutzte Suchstrategie: RANGE CONDITION FOR
INDEX
Diese SQL-Anweisung kann mit einer INDEX ONLY-Strategie abgearbeitet werden, weil nur Spalten aus dem Index und dem Primärschlüssel in der SELECT-Liste angegeben sind und im Indexbaum die Primärschlüsselspalten mit abgelegt sind.
Der Zugriff erfolgt über den Index EMPLOYEE_ENO. Der Startschlüssel wird beim ersten Satz gesetzt, der die Größer-Bedingung erfüllt – also beim Wert 8. Der Stoppschlüssel wird auf den letzten Satz des Index gesetzt.
Ergebnis der EXPLAIN-Anweisung
TABLENAME |
COLUMN_OR_INDEX |
STRATEGY |
PAGECOUNT |
EMPLOYEE |
EMPLOYEE_ENO |
RANGE CONDITION FOR INDEX |
45 |
|
|
ONLY INDEX ACCESSED |
|
|
ENO |
(USED INDEX COLUMN) |
|
|
|
RESULT IS NOT COPIED,
|
|
Bei einer BETWEEN-Bedingung wird der Stoppschlüssel nicht auf das Ende des Index gesetzt, sondern auf den letzten Eintrag, der der RANGE-Bedingung entspricht.
Weitere einfache Beispiel-SQL-Anweisungen
finden Sie im SQL-Tutorial.
Siehe auch: