Hash-Join lgorithmen dvanced Topics in Databases Ws08/09 atthias ichly
Einleitung 2 Grundlage ist das Paper: Join Processing in Database Systems With Large ain emories Quelle: C Transactions on Database Systems (TODS) Volume 11, No. 3 Pages: 239 264 September 1986 utor: Leonard D. Shapiro Professor of Computer Science
Gliederung 3 Hash-Join lgorithmen allgemein Einfacher Hash-Join GCE Hash-Join Hybrid Hash-Join Vergleich der lgorithmen Partition Overflow
Hash-Join lgorithmen allgemein 4 klassisch: kleinere elation passt in Hauptspeicher Erzeuge Hash-Tabelle für Tupel aus in Hauptspeicher, gehasht auf die Join-ttribute lies andere elation S sequenziell, berechne für jedes Tupel den Hashwert und prüfe unter diesem Wert in der Hash-Tabelle, ob es passende Tupel gibt hier: kleinere elation passt nicht in Hauptspeicher partitioniere zunächst und S in disjunkte Teilmengen, joine dann sich entsprechende Teilmengen Partitionierung: teile Wertebereich der Hashfunktion h in Teilmengen H 1,,H n ; ein Tupel t landet in Partition P i, wenn h(t) H i lgorithmen erfordern, dass die Partitionierung Partitionen bestimmter Größe liefert
Notation/nnahmen 5 zu berechnen ist der Equijoin der elationen und S, beide sind weder geordnet noch indiziert - nzahl der Blöcke, die belegt (entsprechend für S) S - für Join zu Verfügung stehender Hauptspeicher - nzahl der zu Verfügung stehenden Blöcke im HS ( Large ain emory ) die Partitionierung funktioniert perfekt, keine Partition wird größer als erwartet bei I/O-Kosten: erstes Einlesen und usgabe des Join- Ergebnisses zählen nicht mit
Einfacher Hash-Join 6 lgorithmus: wähle eine Hashfunktion h und eine Teilmenge H ihres Wertebereichs, so dass alle -Tupel, die in H gehasht werden, gerade in passen lies, für jedes Tupel r: wenn h(r) H, füge es in Hashtabelle in ein; sonst schreibe es in eine extra Datei auf Disk lies S, für jedes Tupel s: wenn h(s) H, suche in Hashtabelle nach atches und gib diese aus; sonst schreibe s in eine extra Datei auf Disk wiederhole die Schritte für die übrig gebliebenen Tupel aus den beiden extra Dateien, solange bis keine -Tupel mehr übrig bleiben
Einfacher Hash-Join - nimation 7 Hauptspeicher einlesen S einlesen Hash-Tabelle atch? Join- Ergebnis h(t) H? Drop -est S-est S
8 Einfacher Hash-Join I/O-Kosten lgorithmus benötigt Durchläufe Schreiben und wieder Einlesen der -Tupel in/aus extra Datei: Schreiben und wieder Einlesen der S-Tupel in/aus extra Datei: nnahme: Gleichverteilung der Join-ttribute in und S gesamt: ( ) ( ) i i i i i 2 1 1 2 2 2 1 1 1 ( ) ( ) S S S i S S i S i i i 2 1 1 2 2 2 1 1 1 ( ) ( ) ( ) + + S S 1 2 1 1 2
Einfacher Hash-Join Fazit 9 gut, wenn fast ganz in Hauptspeicher passt große Teile von und S werden dann nur einmal gelesen schlecht, wenn nur wenig von in Hauptspeicher passt viele Durchläufe nötig
GCE Hash-Join 10 Phase 1 Phase 2 lgorithmus: wähle Hashfunktion h und Teilmengen ihres Wertebereichs, so dass alle -Partitionen etwa gleich groß werden, lege für jede Partition einen usgabepuffer in an lies, für jedes Tupel r: berechne h(r) und füge r in den entsprechenden usgabepuffer ein; wenn ein Puffer voll ist, schreibe ihn auf Disk; am Ende schreibe alle Puffer auf Disk lies S, verfahre wie bei für jede -Partition i : lies i in und erzeuge dabei Hashtabelle lies S i, für alle Tupel s: berechne h(s) und prüfe in Hashtabelle auf atches, gib diese ggf. aus
GCE Hash-Join nimation (Phase 1) 11 Hauptspeicher einlesen S einlesen h(t)? Bucket1 Bucket2 -Bucket1 -Bucket2 S S-Bucket1 S-Bucket2
GCE Hash-Join nimation (Phase 2) 12 Hauptspeicher Hash-Tabelle atch? Join- Ergebnis Drop -Bucket1 -Bucket2 S S-Bucket1 S-Bucket2
GCE Hash-Join I/O-Kosten 13 Schreiben der partitionierten elationen auf Disk + S Einlesen der partitionierten elationen von Disk + S I/O Einsparungen, wenn mehr als Blöcke HS zur Verfügung stehen Blöcke können zwischengespeichert werden min( + S, - ) 2 gesamt: 2 (( + S ) - min( + S, - ))
GCE Hash-Join Fazit 14 gut, wenn wenig (nicht viel mehr als ) Blöcke Hauptspeicher zur Verfügung stehen vermeidet im Ggs. zum einfachen Hash-Join, dass Blöcke wiederholt eingelesen werden müssen schlecht, wenn große Teile von in den Hauptspeicher passen immer 2 Durchläufe
Hybrid Hash-Join 15 Idee: kombiniere die Vorteile von den beiden vorangegangenen lgorithmen nutze so wenig wie möglich Blöcke von, um in Phase 1 Partitionen zu erzeugen, die in Phase 2 gerade in passen; verfahre mit diesen wie beim GCE Hash-Join nutze den est der Blöcke von, um für eine Partition eine Hashtabelle in aufzubauen, die schon in Phase 1 zum Joinen verwendet wird (einfacher Hash-Join) Konstante B mindestens benötigte nzahl an Partitionen, die in Phase 1 auf Disk erzeugt werden, so dass jede entstehende -Partition nicht mehr als Blöcke verbraucht
Hybrid Hash-Join 16 lgorithmus: wähle Hashfunktion h und Teilmengen H 0,,H B ihres Wertebereichs, so dass für eine Partition 0 mit -B Blöcken entsteht, und Partitionen 1,, B gleicher Größe ( Blöcke) entstehen verwende B Blöcke von als usgabepuffer und den est für eine Hashtabelle der Partition 0 Phase 1 lies, für jedes Tupel r: berechne h(r); wenn h(r) H 0, füge r in Hashtabelle ein, sonst in den entsprechenden Puffer; ist Puffer voll: schreibe auf Disk, am Ende alle Puffer auf Disk schreiben lies S, für jedes Tupel s: berechne h(s); wenn h(s) H 0, prüfe auf atches in der Hashtabelle von 0 und gib Tupel ggf. aus, sonst schreibe s in den entsprechenden Puffer, Phase 2 (GCE) wiederhole für i 1,,B lies i und erzeuge Hashtabelle davon in lies S i, für jedes Tupel s: berechne h(s) und prüfe in Hashtabelle von i auf atches, gib ggf. Tupel aus
Hybrid Hash-Join nimation (Phase 1) B 1 17 Hauptspeicher einlesen S einlesen h(t) H 0? atch? Join- Ergebnis Puffer 1 0 Hash-Tabelle Drop S -Bucket1 S-Bucket1
Hybrid Hash-Join nimation (Phase 2) 18 B 1 Hauptspeicher Hash-Tabelle atch? Join- Ergebnis Drop S -Bucket1 S-Bucket1
Hybrid Hash-Join 19 Herleitung der Formel für Konstante B: B mindestens benötigte nzahl an Partitionen, die in Phase 1 auf Disk erzeugt werden, so dass jede entstehende -Partition nicht mehr als Blöcke verbraucht B B B ( 1) nzahl der Blöcke von, die in Phase 2 bearbeitet werden müssen B Blöcke im Hauptspeicher B B B ( B) 1 + B ist das theoretische inimum, also : B 1
Hybrid Hash-Join I/O-Kosten 20 q: nteil von 0 an q 0 / ( -B) / Größe von S 0 q S nnahme: Gleichverteilung der Join-ttribute in und S d.h. der nteil von und S, der auf Disk geschrieben wird ( 1 B und S 1 S B ), ist (1-q) Schreiben und wieder Einlesen der Partitionen von und S auf Disk 2 ( + S ) (1-q)
Hybrid Hash-Join Fazit 21 verbindet die Vorteile von einfachen Hash-Join und GCE-Join wenn wenig Hauptspeicher ( ) zur Verfügung steht GCE-Join wenn viel Hauptspeicher zur Verfügung steht, können große Teile schon in Phase 1 verjoint werden ( einfacher Hash-Join)
I/O-Kosten-Vergleich der lgorithmen 22 Hybrid Hash-Join dominiert einfachen Hash-Join identisch, wenn mehr als /2 Blöcke in passen sonst: einfacher Hash-Join schreibt und liest einige Blöcke mehrfach Hybrid Hash-Join dominiert GCE Hash-Join GCE: 2 (( + S ) - min( + S, - )) Hybrid: 2 (( + S ) - q ( + S )) GCE Hash-Join dominiert Sort-erge-Join in typischen Fällen usnahme: und S sind ähnlich groß Hybrid Hash-Join dominiert Sort-erge-Join Einfluss von Partition Overflows auf Laufzeit von Hashbasierten lgorithmen nicht im Paper beschrieben; Kostenabschätzungen sind zu optimistisch
I/O-Kosten-Vergleich der lgorithmen 23 Beispiel 800, S 1600 Blockgröße: 512 kbytes, Lesen / Schreiben eines Blocks: 30 ms Sort-erge einfacher Hash-Join GCE Hybrid Hash-Join 300,00 benötigte Zeit für I/O in Sekunden 250,00 200,00 150,00 100,00 50,00 0,00 0 100 200 300 400 500 600 verfügbarer Hauptspeicher in Bytes
Partition Overflow 24 nnahme, dass man die Hashfunktion/Teilmengen so wählen kann, dass entstehende Partitionen genau die gewünschte Größe haben, ist unrealistisch benötigt genaues Wissen über die Werteverteilung der Joinattribute in den elationen bei speziellen Verteilungen auch gar nicht möglich in der ealität werden manche Partitionen zu leer bleiben und andere ihre Größenbeschränkung überschreiten, also nicht mehr in passen nur relevant für Partitionen der kleineren elation
Partition Overflow - Lösungsansätze 25 Partition Overflow auf Disk: zu große Partitionen überarbeiten teilen in 2 (oder mehr) kleinere Partitionen oder: teilen in eine große Partition, die gerade in passt und est zu einer anderen, zu leer gebliebenen Partition hinzufügen Partition Overflow in (einfacher Hash): einige Buckets der Hashtabelle in zu den anderen, nicht bearbeiteten Tupeln, auf Disk schreiben Partition Overflow in (Hybrid Hash): ( 0 wird zu groß) einige Buckets zu einer neuen Partition B+1 zuordnen und auf Disk schreiben
bschluss 26 ENDE FGEN???