## Suchbedingungen für indizierte Spalten

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.

### Beispiele

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

#### Gleichheitsbedingung

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, COSTVALUE IS | 2

#### IN-Bedingung

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, COSTVALUE IS | 21

#### Bereichsbedingung

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, COSTVALUE IS | 45

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:

EXPLAIN-Anweisung

Suchbedingungen für Schlüsselspalten

Liste aller Suchstrategien