## EXPLAIN-Anweisung für SELECT-Anweisungen mit Unterabfragen

Um die Kosten für Suchstrategien zu ermitteln, bei denen der Wert einer Spalte mit den Trefferzeilen einer Unterabfrage (Subquery) verglichen wird, muss der SQL-Optimierer die Anzahl der Trefferzeilen kennen. Die Anzahl der Trefferzeilen ist jedoch erst nach der Abarbeitung der Unterabfrage bekannt.

Die EXPLAIN-Anweisung für eine SELECT-Anweisung mit Unterabfragen ermittelt die möglichen Suchstrategien, ohne die enthaltenen Unterabfragen auszuführen. Daher wird in der Regel für die äußere SQL-Anweisung die Suchstrategie NO STRATEGY NOW (ONLY AT EXECUTION TIME) angezeigt.

### Beispiele

Die bei den Erläuterungen zum SQL-Optimierer verwendeten Beispiele stützen sich auf die Demo-Datenbank DEMODB und ihre vollständigen Demo-Daten im Schema HOTEL.

Konzepte des Datenbanksystems, Objekte im Schema HOTEL

EXPLAIN
SELECT name FROM hotel.city
WHERE name IN (SELECT name FROM hotel.hotel)

Qualifikation: name IN (SELECT name FROM hotel.hotel)
Primärschlüssel der Tabelle CITY: zip
Primärschlüssel der Tabelle HOTEL: cno
Indizes über qualifizierte Spalten: keine
genutzte Suchstrategie äußeres SELECT: TABLE SCAN
genutzte Suchstrategie Subquery: TABLE SCAN

Ergebnis der EXPLAIN-Anweisung

TABLENAME | COLUMN_OR_INDEX | STRATEGY | PAGECOUNT
HOTEL |  | TABLE SCAN | 8
CITY |  | TABLE SCAN | 11
|  | RESULT IS COPIED COSTVALUE IS | 101

Es werden alle Städtenamen selektiert, nach denen ein Hotel benannt ist. Da für beide Tabellen kein passender Index existiert und nicht auf die Primärschlüsselspalten eingeschränkt wird, werden beide SELECT-Anweisungen mit einem TABLE SCAN abgearbeitet.

EXPLAIN
SELECT cno, name FROM hotel.customer
WHERE cno = ANY(SELECT cno FROM hotel.reservation WHERE arrival > '2005-01-01')

Qualifikation: cno = ANY(SELECT cno FROM hotel.reservation WHERE arrival > '2005-01-01')
Primärschlüssel der Tabelle CUSTOMER: cno
Primärschlüssel der Tabelle RESERVATION: rno
Indizes über qualifizierte Spalten: keine
genutzte Suchstrategie äußeres SELECT: NO STRATEGY NOW (ONLY AT EXECUTION TIME)
genutzte Suchstrategie Subquery: TABLE SCAN

Ergebnis der EXPLAIN-Anweisung

TABLENAME | COLUMN_OR_INDEX | STRATEGY | PAGECOUNT
RESERVATION |  | TABLE SCAN | 24
CUSTOMER |  | NO STRATEGY NOW (ONLY AT EXECUTION TIME) |
|  | RESULT IS COPIED COSTVALUE IS |

Es werden alle Kunden angezeigt, die alle Buchungen ab einem vorgegebenen Datum getätigt haben. Für die Tabelle RESERVATION wird ein TABLE SCAN durchgeführt. Für die äußere SELECT-Anweisung wird die Suchstrategie NO STRATEGY NOW (ONLY AT EXECUTION TIME) angezeigt.

Weitere einfache Beispiel-SQL-Anweisungen finden Sie im SQL-Tutorial, Subquery: Innere Abfragen.

Siehe auch:

SUBQ CONDITION FOR KEY

SUBQ CONDITION FOR INDEX

Liste aller Suchstrategien

SQL-Referenzhandbuch, Subquery (subquery)