|
Kategorie: ASE: Query Processing und Abstract Plan
Joins: Strategien
ASE stellt hauptsächlich vier Join Strategien zur Verfügung:
-
NestedLoopJoin
-
MergeJoin
-
HashJoin
-
NaryNestedJoin, als Variante des NestedLoopJoin
Vor ASE version 15.0, war die NestedLoopJoin Strategie die primär verwendete Join Strategie.
Joins: NestedLoopJoin Strategie
Bei dieser, einfachsten, Join Strategie bildet die linke Seite des Joins den äußeren Datenbereich die
rechte Seite den inneren. Für jede Zeile des äußeren Datenbereichs muss die innere Seite einmal gescannt
werden. Sind für die aktuelle Zeile des äußeren Datenbereichs alle passenden Zeilen des inneren Datenbereichs
gefunden worden, wird die nächste Zeile des äußeren Bereichs angesprungen und der innere Bereich erneut nach
allen qualifizierenden Zeilen durchsucht, usw., bis der äußere Bereich den "End of Scan" Marker erreicht.
Der NestedLoopJoin ist am effektivsten wenn der innere Datenbereich durch einen brauchbaren
Index
abgedeckt ist.
Joins: MergeJoin Strategie
Beim MergeJoin werden die Datenbereiche, zusätzlich zum Vorgehen beim NestedLoopJoin, nach den
Schlüsselwerten (Spalten) des Joins sortiert.
Die MergeJoin Strategie ist am effektivsten, wenn bei einem Scan des Datenbereichs ein Großteil
der Zeilen verarbeitet werden muß und wenn bei großen Datenbereichen die Werte bereits nach
dem Schlüselwert des Joins sortiert sind.
Joins: HashJoin Strategie
Auch ein HashJoin ist am effektivsten, wenn große Datenmengen verarbeitet werden müssen. Diese werden dann gehasht,
also mit einer möglichst kurzen Identifikation versehen, die jeden Datenwert eindeutig beschreibt und
leichter zu überschauen ist.
Beim HashJoin bildet der äußerere Datenbereich den Eingabedatenstrom (input stream).
Der innere Datenbereich bildet den Probedatenstrom (probe stream).
Jede Zeile des input stream wird gehasht, also durch eine möglichst kurze Identifikation ersetzt, und
in einer Struktur namens "hash bucket" gespeichert.
Anschliessend wird das gleiche mit dem probe stream gemacht und die Hashwerte der beiden Streams werden
auf identische Hashwerte verglichen, aus denen sich dann das Ergebnis des HashJoins herleitet.
Joins: NaryNestedLoopJoin Strategie
Der NaryNestedLoopJoin ist ein Sonderfall des NestedLoopJoin. Er wird vom Optimizer nie
für einen Join in Betracht gezogen, sondern während der Generierung des Codes immer wieder
neu konstruiert. Nämlich dann, wenn mehrere linkslastige NestedLoopJoins gefunden werden, oder
wenn jeder NestedLoopJoin einen "inner join" besitzt und der äußere Datenbereich einen
Scan voraussetzt. Um eine unnötig hohe Anzahl an Scans zu vermeiden nutzt der Optimizer NaryNestedLoop Joins,
die viel weniger I/O produzieren, als ein vergleichbarer NestedLoopJoin.
|