Databases Reference
In-Depth Information
14.5
Korrelierte geschachtelte Abfragen
Wir vergleichen jetzt die Abfrage aus Listing 14.13 mit der folgenden, bekannten
Abfrage:
Listing 14.14: Die ältesten Alben
select titel
from alben
where jahr = (
select min(jahr)
from alben)
Abgesehen, davon, dass sie verschiedene Ergebnisse ermitteln, haben sie auch
zwei grundsätzlich verschiedene Qualitäten:
Das Ergebnis der Unterabfrage in Listing 14.14 ist immer 1968. Das RDBMS
muss die Unterabfrage also nur ein einziges Mal ausführen und kann sich das
Ergebnis dann „merken“.
Anders ist das bei den geschachtelten Abfragen aus Listing 14.13. Das Prädikat
reihe.id=alben.reihe hat auf der rechten Seite keinen konstanten Wert,
da sich der Wert von alben.reihe mit jedem Datensatz der übergeordneten
Abfrage ändern kann.
Wenn die Tabelle alben insgesamt p Datensätze und die Tabelle reihen etwa q
Datensätze enthält, dann ist die Laufzeit der Anweisung in Listing 14.13 propor-
tional zu pq , die von Listing 14.14 dagegen nur proportional zu p+q . Abfragen,
bei denen die innere Abfrage von der äußeren Abfrage abhängig ist, heißen auch
korreliert . Korrelierte Unterabfragen können die Laufzeit unserer Abfragen dra-
matisch nach oben treiben. Teilweise kann der Optimierer die Korrelation auflö-
sen. Wenn das Verarbeitungstempo der Abfragen allerdings dürftig ist, kann der
Optimierer die Korrelation möglicherweise nicht auflösen, so dass die manuelle
Auflösung der Korrelation ein Ansatzpunkt zur Leistungssteigerung ist.
In der folgenden Abfrage wird das Ergebnis der Unterabfrage nur ein einziges
Mal ermittelt werden. Das Ergebnis der Abfrage ist aber das gleiche wie das in
der select -Anweisung aus Listing 14.13.
Listing 14.15: Eine aufgelöste Korrelation
select titel
from alben a
where reihe in (
select id
from reihen r
and r.name='Asterix'
)
 
Search WWH ::




Custom Search