Bei SQL-Anweisungen, die mit OR verknüpfte Suchbedingungen enthalten, analysiert der SQL-Optimierer zunächst jede Suchbedingung einzeln.
b1 AND b2 AND (b3 OR (b4 AND b5))
Die Ausdrücke b1, b2 und (b3 OR (b4 AND b5)) werden zunächst einzeln analysiert. Wenn der Optimierer bei b1 oder b2 eine Gleichheitsbedingung auf Schlüsselspalten findet, dann muss er (b3 OR (b4 AND b5)) bei der Auswahl der Suchstrategie nicht berücksichtigen, weil der Suchbereich nicht sinnvoll weiter eingegrenzt werden kann.
Wenn keine Gleichheitsbedingung für Schlüsselspalten gefunden wird, werden die bis dahin nicht betrachteten, mit OR verknüpften Suchbedingungen weiter analysiert. Dabei geht der SQL-Optimierer folgendermaßen vor:
..
1. Umformen in die disjunktive Normalform
b1 AND b2 AND (b3 OR (b4 AND b5))
ergibt in der disjunktiven Normalform
(b1 AND b2 AND b3) OR (b1 AND b2 AND b4 AND b5)
2.
Analyse des neuen Ausdrucks
Die neu gebildeten Klammerausdrücke werden separat analysiert.
3.
Kostenermittlung
Die Kosten
der verschiedenen Suchstrategien für die Klammerausdrücke der disjunktiven
Normalform werden summiert. Wenn diese Summe kleiner als die anfangs
ermittelten Kosten für die Suchstrategie ohne Betrachtung der mit OR
verknüpften Suchbedingungen ist, werden diese verschiedenen Suchstrategien
verwendet.
Wenn die Summe der Kosten von (b1 AND b2 AND b3) und (b1 AND b2 AND b4 AND b5) kleiner ist als die Kosten für die Suchstrategie für b1 und b2, dann werden Strategien für (b1 AND b2 AND b3) und (b1 AND b2 AND b4 AND b5) angewendet.
4. Die kostengünstigste Suchstrategie wird verwendet, um die SQL-Anweisung auszuführen.
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.
Konzeptes des Datenbanksystems, Objekte im Schema HOTEL
SELECT * FROM hotel.customer
WHERE name = 'Smith' AND firstname = 'Sally'
OR name = 'Miller' AND firstname =
'Sally'
Qualifikation: name =
'Smith' AND firstname = 'Sally'
OR name = 'Miller' AND firstname =
'Sally'
Primärschlüssel der Tabelle CUSTOMER:
cno
Indizes über qualifizierte Spalten: FULL_NAME_INDEX (name,
firstname)
genutzte Suchstrategie 1. Prädikat: EQUAL CONDITION FOR INDEX
genutzte Suchstrategie 2. Prädikat: EQUAL CONDITION FOR INDEX
Mehrere AND-Terme sind mit einer OR-Bedingung verknüpft. Die AND-Bedingung hat eine höhere Priorität als die OR-Bedingung. Für jeden AND-Term wird die beste Zugriffstrategie bestimmt. Beide AND-Terme qualifizieren die beiden Index-Spalten mit einer Gleichheitsbedingung. Daher können sie jeweils mit einer EQUAL CONDITION FOR INDEX abgearbeitet werden. Die ADDL. QUALIFICATION ON INDEX wird ausgegeben, da die OR-verknüpften Spalten auch im Index überprüft werden.
Ergebnis der EXPLAIN-Anweisung
TABLENAME |
COLUMN_OR_INDEX |
STRATEGY |
PAGECOUNT |
CUSTOMER |
|
34 |
|
|
FULL_NAME_INDEX |
EQUAL CONDITION FOR INDEX |
|
|
|
ADDNL. QUALIFICATION ON INDEX |
|
|
NAME |
(USED INDEX COLUMN)) |
|
|
FIRSTNAME |
(USED INDEX COLUMN)) |
|
|
FULL_NAME_INDEX |
EQUAL CONDITION FOR INDEX |
|
|
|
ADDNL. QUALIFICATION ON INDEX |
|
|
NAME |
(USED INDEX COLUMN)) |
|
|
FIRSTNAME |
(USED INDEX COLUMN)) |
|
|
|
RESULT IS COPIED, |
14 |
Weitere einfache Beispiel-SQL-Anweisungen
finden Sie im SQL-Tutorial.
Siehe auch: