A  B  C  D  E  F  G  H  I  J  K  L  M  N  O  P  Q  R  S  T  U  V  W  X  Y  Z  Sonderzeichen  sybase-tech-blog


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.