18.3 Parallele Joins
Zur Reduzierung des Optimierungsproblems betrachten die meisten Implementierungen und Verfahrensvorschläge lediglich lineare Operatorbäume, bei denen ein Mehr-Wege-Join durch eine lineare Folge von Zwei-Wege-Joins realisiert wird. Hierbei kann unterschieden werden zwischen den in Abb. 18-7 gezeigten links-tiefen (left deep) und rechts-tiefen (right deep) Operatorbäumen [Ze89, SD90][85]. Unbeschränkte Operatorbäume (bushy trees, Abb. 18-7c) bieten dagegen offensichtlich ein größeres Optimierungspotential als lineare Bäume. Insbesondere kann mit ihnen Datenparallelität weitgehender genutzt werden, da auf unterschiedlichen Relationen arbeitende Teilbäume vollständig parallel ausführbar sind (z.B. R1R2 und R3R4 in Abb. 18-7c). Allerdings ist der Optimierungsaufwand für unbeschränkte Operatorbäume komplexer Anfragen vielfach prohibitiv.
Beim rechts-tiefen Baum (Abb. 18-7b) wird durch verstärkte Nutzung von Parallelität eine Join-Bearbeitung in zwei Schritten erreicht. Dabei werden im ersten Schritt N-1 der N Basisrelationen ("linke" Operanden) parallel in die Hauptspeicher der Join-Rechner geladen. Im zweiten Schritt wird dann sukzessive die Join-Berechnung mit der N-ten Relation unter Nutzung von Pipeline-Parallelität durchgeführt. Dieser Ansatz hat jedoch den Nachteil eines sehr hohen Speicherbedarfs. Gestattet jedoch die Hauptspeicherkapazität das vollständige Laden der N-1 Relationen ergeben sich deutliche Vorteile gegenüber links-tiefen Bäumen [SD90]. Der geringere Speicherbedarf links-tiefer Bäume ist dagegen vor allem bei hoher Join-Selektivität sehr ausgeprägt.
Links- und rechts-tiefe Bäume stellen Extremansätze hinsichtlich des Ressourcenbedarfs sowie der Anzahl benötigter Verarbeitungsschritte dar. Als Alternative dazu wurden in [ZZB93] sogenannte Zick-Zack-Bäume vorgeschlagen, welche lineare (tiefe) Operatorbäume darstellen, bei denen jedoch für Teilbäume zwischen links-tiefer und rechts-tiefer Vorgehensweise gewechselt werden kann. So kommt im Beispiel von Abb. 18-8a zunächst ein links-tiefer Teilbaum zur Auswertung, um den Join zwischen R1 und R2 zu berechnen. Das Ergebnis dieser Join-Operation bildet die "linke" Eingabe zu einem rechts-tiefen Teilbaum, ebenso wie die Relationen R3 und R4, die parallel in die Hauptspeicher der betreffenden Rechner gebracht werden. Die abschließende Probing-Phase mit R5 kann erst beginnen, nachdem das Join-Ergebnis von R1R2 vollständig vorliegt. Eine solche Kompromißlösung ermöglicht einen reduzierten Ressourcenbedarf gegenüber rechts-tiefen sowie einen höheren Parallelitätsgrad gegenüber links-tiefen Bäumen. Der Suchraum zur Optimierung erhöht sich dafür, da rechts- bzw. links-tiefe Bäume als Spezialfälle weiterhin möglich sind.
Die Eingrenzung des Suchraumes durch strukturelle Beschränkungen der Operatorbäume stellt nur einen Ansatz zur Reduzierung des Optimierungsaufwandes für komplexe Anfragen (z.B. Mehr-Wege-Joins) dar. Eine Alternative besteht in der Wahl einer effizienten Suchstrategie, die den hohen Aufwand für eine enumerative Bewertung nahezu aller Pläne umgeht, wie er mit dem klassischen Ansatz der dynamischen Programmierung [Se79] entsteht. Dies kann u.a. mit zufallsgesteuerten Suchstrategien wie Simulated Annealing oder iterativer Verbesserung erreicht werden, die eine bestimmte Ausgangslösung bis zum Erreichen eines lokalen Optimums verbessern. Auch wenn damit nicht immer das globale Optimum erreicht wird, findet sich mit geringem Aufwand meist eine gute Lösung. In [LVZ93] wurde gezeigt, daß die Anwendung solcher Suchstrategien auf einem unbeschränkten Suchraum (bushy trees) vielfach wirkungsvoller ist als der Einsatz enumerativer Suchstrategien auf einem beschränkten Suchraum.