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.
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 |
|
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 |
|
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:
SQL-Referenzhandbuch, Subquery (subquery)