5. Basisalgorithmen für DB-Operationen ■ Datenbankparameter ■ Komplexität von Grundalgorithmen ■ Unäre Operationen (Scan, Selektion, Projektion) ■ Binäre Operationen: Mengenoperationen ■ Berechnung von Verbunden VL Datenbank-Implementierungstechniken – 3–1 Einordnung MOS Mengenorientierte Schnittstelle Datensystem SOS Satzorientierte Schnittstelle Zugriffssystem ISS Interne Satzschnittstelle Speichersystem SPS Systempufferschnittstelle Pufferverwaltung DS Dateischnittstelle Betriebssystem GS Geräteschnittstelle VL Datenbank-Implementierungstechniken – 3–2 Datenbankparameter ■ Komplexitätsbetrachtungen (O(n2)) ■ Aufwandsabschätzungen (konkret) ■ Datenbankparameter als Grundlage ■ müssen im Katalog des Datenbanksystems gespeichert werden VL Datenbank-Implementierungstechniken – 3–3 Datenbankparameter (II) ■ nr : Anzahl Tupel in Relation r ■ br : Anzahl von Blöcken (Seiten), die Tupel aus r beinhalten ■ sr : (mittlere) Größe von Tupeln aus r (s für size) ■ fr : Blockungsfaktor (Tupel aus r pro Block) fr = bs , sr mit bs Blockgröße ■ Tupel einer Relation kompakt in Blöcken: nr br = fr VL Datenbank-Implementierungstechniken – 3–4 Datenbankparameter (III) ■ V (A, r): Anzahl verschiedener Werte für das Attribut A in der Relation r (V für values): V (A, r) = |πA (r)| ■ A Primärschlüssel: V (A, r) = nr ■ SC(A, r): Selektionskardinalität (selection cardinality); durchschnittliche Anzahl von Ergebnistupeln bei σ A=x (r) für x ∈ πA (r) ■ Schlüsselattribut A: SC(A, r) = 1 ■ Allgemein: SC(A, r) = nr V (A, r) Weiterhin: Verzweigungsgrad bei B-Baum-Indexen, Höhe des Baums, Anzahl von Blätterknoten VL Datenbank-Implementierungstechniken – 3–5 Komplexität von Grundalgorithmen Grundannahmen ■ Indexe B+ -Bäume ■ dominierender Kostenfaktor: Blockzugriff ■ Zugriff auf Hintergrundspeicher auch für Zwischenrelationen ■ Zwischenrelationen zunächst für jede Grundoperation ■ Zwischenrelationen hoffentlich zum großen Teil im Puffer ■ einige Operationen (Mengenoperationen) auf Adreßmengen (TID-Listen) VL Datenbank-Implementierungstechniken – 3–6 Hauptspeicheralgorithmen wichtig für den Durchsatz des Gesamtsystems, da sie sehr oft eingesetzt werden ■ Tupelvergleich (Duplikate erkennen, Sortierordnung angeben, . . . ) iterativ durch Vergleich der Einzelattribute, Attribute mit großer Selektivität zuerst ■ TID-Zugriff TID innerhalb des Hauptspeichers: übliche Vorgehensweise bei der Auflösung indirekter Adressen VL Datenbank-Implementierungstechniken – 3–7 Zugriffe auf Datensätze ■ Relationen: interner Identifikator RelID ■ Indexe: interner Identifikator IndexID ◆ Primärindex, etwa I(Personen(PANr))) bei A = a wird maximal ein Tupel pro Zugriff ◆ Sekundärindex, etwa I(Ausleihe(PANr))) Bsp.: PANr = 4711 liefert i.a. mehrere Tupel Indexzugriffe: Ergebnis TID-Listen VL Datenbank-Implementierungstechniken – 3–8 Zugriffe auf Datensätze (II) ■ fetch-tupel Direktzugriff auf Tupel mittels TID-Wertes holt Tupel in Tupel-Puffer fetch-tupel(RelID, TID) → Tupel-Puffer ■ fetch-TID: TID zu (Primärschlüssel-)Attributwert bestimmen fetch-TID(IndexID, Attributwert) → TID ■ weiterhin auf Relationen und Indexen: Scans VL Datenbank-Implementierungstechniken – 3–9 Beispiel in SQL select * from KUNDE where KName =’Meier’ ■ Gleichheitsanfrage über einen Schlüssel ■ put: hier Anzeige des Ergebnisses aktuellerTID := fetch-TID(KUNDE-KName-Index, ‘Meyer’); aktuellerPuffer:= fetch-tupel(KUNDE-RelationID, aktuellerTID); put(aktuellerPuffer); VL Datenbank-Implementierungstechniken – 3–10 Externe Sortieralgorithmen sort Andreas 24 Gunter Dieter 4 Gunter 42 Andreas 24 merge 42 Andreas 24 Berta 77 Chris 7 Andreas 21 Andreas 24 4 Chris 7 Berta 77 Berta 77 Chris 7 Elle 36 Elle 36 Tamara 99 Dieter 2 Dieter 2 Elle 36 Mario 9 Mario 9 Dieter 2 Gunter 42 Peer 43 Tamara 99 Dieter 11 Mario 9 Dieter 11 Mario 9 Peer 43 Peer 43 Tamara 99 Tamara 99 Andreas 21 Dieter 11 Peer 43 4 Elle 36 Gunter 42 merge Dieter Andreas 21 merge Andreas 21 partition Dieter Berta 77 Chris 7 Dieter 2 Dieter 4 Dieter 11 Externes Sortieren durch Mischen; Komplexität O(n log n) Vertauschoperationen VL Datenbank-Implementierungstechniken – 3–11 Unäre Operationen Scan durchläuft Tupel einer Relation ■ Relationen-Scan (full table scan) durchläuft alle Tupel einer Relation in beliebiger Reihenfolge Aufwand: br ■ Index-Scan nutzt Index zum Auslesen der Tupel in Sortierreihenfolge Aufwand: Anzahl der Tupel plus Höhe des Indexes Vergleich ■ Relationen-Scan besser durch Ausnutzung der Blockung ■ Index-Scan besser, falls wenige Daten benötigt, aber schlechter beim Auslesen vieler Tupel VL Datenbank-Implementierungstechniken – 3–12 Operationen auf Scans ■ Relationen-Scan öffnen open-rel-scan(RelationenID) → ScanID liefert ScanID zurück, die bei folgenden Operationen zur Identifikation genutzt wird ■ Index-Scan initialisieren open-index-scan(IndexID, Min, Max) → ScanID liefert ScanID zurück; Min und Max bestimmen Bereich einer Bereichsanfrage ■ next-TID liefert nächsten TID; Scan-Cursor weitersetzen ■ end-of-scan liefert true, falls kein TID mehr im Scan abzuarbeiten ■ close-scan schließt Scan VL Datenbank-Implementierungstechniken – 3–13 Beispiel: Scan select * from Personen where Nachname between ’Heuer’ and ’Jagellowsk’ VL Datenbank-Implementierungstechniken – 3–14 Beispiel: Relationen-Scan aktuellerScanID := open-rel-scan(Personen-RelationID); aktuellerTID := next-TID(aktuellerScanID); while not end-of-scan(aktuellerScanID) do begin aktuellerPuffer := fetch-tupel(Personen-RelationID,aktuellerTID); if aktuellerPuffer.Nachname >= ’Heuer’ and aktuellerPuffer.Nachname <= ’Jagellowsk’ then put (aktuellerPuffer); endif; aktuellerTID := next-TID(aktuellerScanID); end; close (aktuellerScanID); VL Datenbank-Implementierungstechniken – 3–15 Beispiel: Index-Scan aktuellerScanID := open-index-scan(Personen-Nachname-IndexID, ’Heuer’,’Jagellowsk’); aktuellerTID := next-TID(aktuellerScanID); while not end-of-scan(aktuellerScanID) do begin aktuellerPuffer := fetch-tupel(Personen-RelationID,aktuellerTID); put(aktuellerPuffer); aktuellerTID := next-TID(aktuellerScanID); end; close (aktuellerScanID); VL Datenbank-Implementierungstechniken – 3–16 Selektion ■ exakte Suche, Bereichsselektionen, komplex zusammengesetzte Selektionskriterien ■ zusammengesetztes Prädikat ϕ aus atomaren Prädikaten (exakte Suche, Bereichsanfrage) mit and, or, not Tupelweises Vorgehen ■ Gegeben σϕ (r) ■ Relationen-Scan: für alle t ∈ r auswerten ϕ(t) ■ Aufwand O(nr ), genauer br VL Datenbank-Implementierungstechniken – 3–17 Selektion: Konjunktive Normalform ■ Zugriffspfade bei komplexen Prädikaten einsetzen ⇒ ϕ analysieren und geeignet umformen ■ etwa ϕ in konjunktive Normalform KNF überführen; bestehend aus Konjunkten ■ heuristisch Konjunkt auswählten, das sich besonders gut durch Indexe auswerten laßt (etwa bei A = c und über A Index) ■ ausgewähltes Konjunkt auswerten; für Ergebnis-TID-Liste andere Konjunkte tupelweise ■ oder mehrere geeignete Konjunkte auswerten und die sich ergebenden TID-Listen schneiden VL Datenbank-Implementierungstechniken – 3–18 Selektion: Filtermethoden ■ bei Filtermethode alle Bedingungen auf true setzen, die nicht durch eine Zugriffsmethode unterstützt werden ■ resultierendes Prädikat: ϕ0 . ■ r 0 = σϕ0 (r) unter Ausnutzung der Indexe auswerten ■ σϕ (r 0 ) auf dem (hoffentlich viel kleineren) Zwischenergebnis r 0 mittels tupelweisem Vorgehen auswerten ■ Filtermethoden nur gut, wenn ϕ0 tatsächlich Datenvolumen reduziert (Vorsicht bei Disjunktionen) VL Datenbank-Implementierungstechniken – 3–19 Projektion ■ Relationenalgebra: mit Duplikateliminierung ■ SQL: keine Duplikateliminierung, wenn nicht mit distinct gefordert (modifizierter Scan) ■ mit Duplikateliminerung: ◆ sortierte Ausgabe eines Indexes hilft bei der Duplikateliminierung ◆ Projektion auf indexierte Attribute ohne Zugriff auf gespeicherte Tupel VL Datenbank-Implementierungstechniken – 3–20 Projektion (II) ■ Projektion πX (r): 1. r nach X sortieren 2. t ∈ r werden in das Ergebnis aufnehmen, für die t(X) 6= previous(t(X)) gilt ■ Zeitaufwand: O(nr log nr ) ■ Falls r schon sortiert nach X : O(nr ) ■ Schlüssel K ⊆ X : O(nr ) VL Datenbank-Implementierungstechniken – 3–21 Scan-Semantik ■ bei Scan-basierten (positionalen) Änderungsoperationen: Festlegung einer Scan-Semantik ; Wirkungsweise nachfolgender Scan-Operationen ■ Beispiel: Löschen des aktuellen Satzes ■ Zustände: vor dem ersten Satz, auf einem Satz, in Lücke zwischen zwei Sätzen, hinter dem letzten Satz, in leerer Menge ■ weiterhin: Übergangsregeln für Zustände VL Datenbank-Implementierungstechniken – 3–22 Scan-Semantik (II) Helloween-Problem (System R): ■ SQL-Anweisung: update employee e set salary = salary * 1.05 ■ satzorientierte Auswertung mittels Index-Scan über Iemployee (salary) und sofortige Index-Aktualisierung ■ ohne besondere Vorkehrungen: unendliche Anzahl von Gehaltserhöhungen VL Datenbank-Implementierungstechniken – 3–23 Binäre Operationen: Mengenoperationen Binäre Operationen meist auf Basis von tupelweisem Vergleich der einzelnen Tupelmengen ■ Nested-Loops-Technik oder Schleifeniteration ◆ für jedes Tupel einer äußeren Relation s wird die innere Relation r komplett durchlaufen ◆ Aufwand: O(ns ∗ nr ) ■ Merge-Technik oder Mischmethode ◆ r und s (sortiert) schrittweise in der vorgegebenen Tupelreihenfolge durchlaufen ◆ Aufwand: O(ns + nr ) ◆ Falls Sortierung noch vorzunehmen: Sort-Merge-Technik ◆ Aufwand nr log nr und/oder ns log ns VL Datenbank-Implementierungstechniken – 3–24 Mengenoperationen (II) ■ Hash-Methoden ◆ kleinere der beiden Relationen in Hash-Tabelle ◆ Tupel der zweiten Relation finden ihren Vergleichspartner mittels Hash-Funktion ◆ idealerweise Aufwand O(ns + nr ) VL Datenbank-Implementierungstechniken – 3–25 Klassen binärer Operationen r s A B C VL Datenbank-Implementierungstechniken – 3–26 Klassen binärer Operationen (II) Ergebnisextensionen A B C A∪B A∪C B∪C A∪B∪C Übereinstimmung auf allen Attributen Differenz r − s Übereinstimmung auf einigen Attributen Anti-SemiVerbund Schnitt r ∩ s Verbund, SemiVerbund Differenz s − r Anti-SemiVerbund Left Outer Join symmetrische Dif- Anti-Verbund ferenz (r − s) ∪ (s − r) Right Outer Join Vereinigung r ∪ s Full Outer Join VL Datenbank-Implementierungstechniken – 3–27 Vereinigung mit Duplikateliminierung Vereinigung durch Einfügen ■ Variante der Nested-Loops-Methoden ■ Kopie einer der beiden Relationen r2 unter dem Namen r20 anlegen, dann Tupel t1 ∈ r1 in r20 einfügen (Zeitaufwand abhängig von Organisationsform der Kopie) Spezialtechniken für die Vereinigung ■ r ■ und s verketten Projektion auf alle Attribute der verketteten Relation Zeitaufwand: O((nr + ns ) × log(nr + ns )) (wie Projektion) VL Datenbank-Implementierungstechniken – 3–28 Vereinigung (II) Vereinigung durch Merge-Techniken (merge-union) 1. r und s sortieren, falls nicht bereits sortiert 2. r und s mischen ■ tr ∈ r kleiner als ts ∈ s: tr in das Ergebnis, nächstes tr ∈ r lesen ■ tr ∈ r größer als ts ∈ s: ts in das Ergebnis, nächstes ts ∈ s lesen ■ ts = tr : tr in das Ergebnis, nächste tr ∈ r bzw. ts ∈ s lesen ■ Zeitaufwand: O(nr × log nr + ns × log ns ) mit Sortierung, O(nr + ns ) ohne Sortierung VL Datenbank-Implementierungstechniken – 3–29 Berechnung von Verbunden Varianten ■ Nested-Loops-Verbund ■ Block-Nested-Loops-Verbund ■ Merge-Join ■ Hash-Verbund ■ ... VL Datenbank-Implementierungstechniken – 3–30 Nested-Loops-Verbund doppelte Schleife iteriert über alle t1 ∈ r und alle t2 ∈ s bei einer Operation r ./ s r ./ϕ s: for each tr ∈ r do begin for each ts ∈ s do begin if ϕ(tr , ts ) then put(tr · ts ) endif end end VL Datenbank-Implementierungstechniken – 3–31 Nested-Loops-Verbund mit Scan R1ScanID := open-rel-scan(R1ID); R1TID := next-TID(R1ScanID); while not end-of-scan(R1ScanID) do begin R1Puffer := fetch-tupel(R1ID,R1TID); R2ScanID := open-rel-scan(R2ID); R2TID := next-TID(R2ScanID); while not end-of-scan(R2ScanID) do begin .../* Scan über innere Relation */ end; close (R2ScanID); R1TID := next-TID(R1ScanID); end; close (R1ScanID); VL Datenbank-Implementierungstechniken – 3–32 Nested-Loops-Verbund mit Scan II /* Scan über innere Relation */ R2Puffer := fetch-tupel(R2ID,R2TID); if R1Puffer.X = R2Puffer.Y then insert into ERG (R1.Puffer.A1, ..., R1.Puffer.An, R1.Puffer.X, R2.Puffer.B1, ..., R1.Puffer.Bm); endif; R2TID := next-TID(R2ScanID); Verbesserung: Nested-Loops-Verbund verbindet alle t 1 ∈ r mit Ergebnis von σX=t1 (X) (s) (gut bei Index auf X in r2 ) VL Datenbank-Implementierungstechniken – 3–33 Block-Nested-Loops-Verbund statt über Tupel über Blöcke iterieren for each Block Br of r do begin for each Block Bs of s do begin for each Tupel tr ∈ Br do begin for each Tupel ts ∈ Bs do begin if ϕ(tr , ts ) then put(tr · ts ) endif end end end end Aufwand: br ∗ bs VL Datenbank-Implementierungstechniken – 3–34 Merge-Techniken X := R ∩ S ; falls nicht bereits sortiert, zuerst Sortierung von r und s nach X 1. tr (X) < ts (X), nächstes tr ∈ r lesen 2. tr (X) > ts (X), nächstes ts ∈ s lesen 3. tr (X) = ts (X), tr mit ts und allen Nachfolgern von ts , die auf X mit ts gleich, verbinden 4. beim ersten t0s ∈ s mit t0s (X) 6= ts (X) beginnend mit ursprünglichem ts mit den Nachfolgern t0r von tr wiederholen, solange tr (X) = t0r (X) gilt VL Datenbank-Implementierungstechniken – 3–35 Merge-Techniken: Aufwand ■ alle Tupel haben den selben X -Wert: O(nr × ns ) ■ X ■ Schlüssel von R oder S : O(nr log nr + ns log ns ) bei vorsortierten Relationen sogar: O(nr + ns ) VL Datenbank-Implementierungstechniken – 3–36 Merge-Join mit Scan ■ Verbund-Attribute auf beiden Relationen Schlüsseleigenschaft ■ min(X) und max(X): minimaler bzw. maximaler gespeicherter Wert für X VL Datenbank-Implementierungstechniken – 3–37 Merge-Join mit Scan (II) R1ScanID := open-index-scan(R1XIndexID, min(X), max(X)); R1TID := next-TID(R1ScanID); R1Puffer := fetch-tupel(R1ID,R1TID); R2ScanID := open-index-scan(R2YIndexID, min(Y), max(Y)); R2TID := next-TID(R2ScanID); R2Puffer := fetch-tupel(R2ID,R2TID); while not end-of-scan(R1ScanID) and not end-of-scan(R2ScanID) do begin .../* merge */ end; close (R1ScanID); close (R2ScanID); VL Datenbank-Implementierungstechniken – 3–38 Merge-Join mit Scan (III) /* merge */ if R1Puffer.X < R2Puffer.Y then R1TID := next-TID(R1ScanID); R1Puffer := fetch-tupel(R1ID,R1TID); else if R1Puffer.X > R2Puffer.y then R2TID := next-TID(R2ScanID); R2Puffer := fetch-tupel(R2ID,R2TID); else insert into ERG (R1.Puffer.A1, ..., R1.Puffer.An, R1.Puffer.X, R2.Puffer.B1, ..., R1.Puffer.Bm); R1TID := next-TID(R1ScanID); R1Puffer := fetch-tupel(R1ID,R1TID); R2TID := next-TID(R2ScanID); R2Puffer := fetch-tupel(R2ID,R2TID); endif; endif; VL Datenbank-Implementierungstechniken – 3–39 Verbund durch Hashing ■ Idee: ◆ Ausnutzung des verfügbaren Hauptspeichers zur Minimierung der Externspeicherzugriffe ◆ Finden der Verbundpartner durch Hashing ◆ Anfragen der Form r 1r.A=s.B s VL Datenbank-Implementierungstechniken – 3–40 Classic Hashing ■ Vorbereitung: kleinere Relation wird r ■ Ablauf 1. Tupel von r mittels Scan in Hauptspeicher lesen und mittels Hashfunktion h(r.A) in Hashtabelle H einordnen 2. wenn H voll (oder r vollständig gelesen): Scan über S und mit h(s.B) Verbundpartner suchen 3. falls Scan über r nicht abgeschlossen: H neu aufbauen und erneuten Scan über S durchführen ■ Aufwand: O(br + p ∗ bs ) mit p ist Anzahl der Scans über s VL Datenbank-Implementierungstechniken – 3–41 Partitionierung mittels Hashfunktion ■ Tupel aus r und s über X in gemeinsame Datei mit k Blöcken (Buckets) „gehasht“ ■ Tupel in gleichen Buckets durch Verbundalgorithmus verbinden VL Datenbank-Implementierungstechniken – 3–42 Partitionierung mittels Hashfunktion (II) h 0 s join 0 ... h 1 join 1 join 2 ... r max ... ... 2 join max VL Datenbank-Implementierungstechniken – 3–43 Partitionierung mittels Hashfunktion (III) for each tr in r do begin i := h(tr (X)); Hir := Hir ∪ tr (X); end; for each ts in s do begin i := h(ts (X)); His := His ∪ ts (X); end; for each k in 0 . . . max do Hkr ./ Hks ; VL Datenbank-Implementierungstechniken – 3–44 Vergleich der Techniken s r s r Nested-Loops-Join s r Merge-Join Hash-Join VL Datenbank-Implementierungstechniken – 3–45 Aggregation & Gruppierung ■ Anfragen: select A, count(*) from T group by A ■ Algebraoperator: γcount(*),A (r(t)) ■ Implementierungsvarianten: ◆ Nested Loops ◆ Sortierung ◆ Hashing VL Datenbank-Implementierungstechniken – 3–46 Basisalgorithmen für spezielle DBS ■ Verteilte DBS ◆ Datenverteilung ◆ Verbundoperationen für verteilte DBS ■ Parallele DBS ◆ Partitionierung ◆ Paralleles Sortieren ◆ Parallele Verbundoperationen VL Datenbank-Implementierungstechniken – 3–47 VDBS: Fragmentierung & Allokation ■ Verteilung von Daten in verteilten DBS ◆ logische Ebene (prädikative Beschreibung) ; Fragmentierung ◆ physische Ebene (Festlegung des Speicherortes; redundant/nicht redundant) ; Allokation VL Datenbank-Implementierungstechniken – 3–48 Fragmentierung ■ horizontal ◆ durch Selektionsprädikat: ri = σP (rg ) [ ri ◆ Gesamtrelation: rg = i=1...n ■ vertikal ◆ durch Projektion und Einbeziehung des Primärschlüssels in alle Partitionen: ri = πK,Aj ...Aj+m (rg ) ◆ Gesamtrelation: rg = r1 1 r2 1 · · · 1 rn ■ abgeleitet horizontal ◆ Zerlegungsinformation wird aus anderer Relation abgeleitet VL Datenbank-Implementierungstechniken – 3–49 Verbundoperationen ■ einfache Strategie: Verbundberechnung an einem Knoten ship whole: Transfer der kompletten Relation ◆ fetch as needed: satzweises Anfordern der Verbundpartner ◆ ■ Bewertung: ◆ „fetch as needed“ mit hoher Nachrichtenanzahl ◆ „ship whole“ mit höherem Datenvolumen VL Datenbank-Implementierungstechniken – 3–50 Semi-Join ■ Idee: Anfordern der Verbundpartner in einem Schritt ■ Basis: r 1 s = r 1 (s n r) = r 1 (s 1 πA (r)) (A ist Verbundattribut) ■ Ablauf: 1. Knoten Kr : Bestimmung von πA (r) und Übertragung an Knoten Ks 2. Knoten Ks : Bestimmung von s0 = s 1 πA (r) = s n r und Übertragen an Kr 3. Knoten Kr : Bestimmung von r 1 s0 = r 1 s VL Datenbank-Implementierungstechniken – 3–51 Bitvektor-Join ■ auch Hashfilter-Join ■ Idee: Vermeidung des Übertragens der kompletten Verbundattributwerte durch Abbildung auf Bitvektor B[1 . . . n] ■ Abbildung: Hashfunktion h zur Abbildung der Attributwerte auf Wertebereich 1 . . . n ◆ Setzen des zugeordneten Bits im Vektor für Attributwert ◆ VL Datenbank-Implementierungstechniken – 3–52 Bitvektor-Join (II) ■ Ablauf: 1. Knoten Kr : für jeden Wert v von πA (r) setze zugehöriges Bit B[h(v)] und Übertragung des Bitvektors B an Ks 2. Knoten Ks : Bestimmung von r0 = {t ∈ s | B[h(t.A)] ist gesetzt } und Übertragung an Kr 3. Knoten Kr : Bestimmung von r 1 s0 = r 1 s VL Datenbank-Implementierungstechniken – 3–53 Bitvektor-Join (III) ■ Bewertung: ◆ ◆ Einsparung von Übertragungsvolumen Hash-Abbildung nicht injektiv → nur potentielle Verbundpartner im Bitvektor ; ausreichend großes n und geeignete Hashfunktion h notwendig VL Datenbank-Implementierungstechniken – 3–54 Parallele DBS ■ Parallelisierung von Anfragen ◆ Unabhängige Parallelität – parallele Ausführung mehrerer (verschiedener) Operationen, z.B. verschiedene Teile eines Mehrwegeverbundes ◆ Pipelining-Parallelität – Pipelining von Operatoren eines Plans ◆ Intra-Operator-Parallelität – Parallelisierung einzelner Operationen (parallele Selektion, paralleler Join) VL Datenbank-Implementierungstechniken – 3–55 Unabhängige Parallelität Daten Operation 1 P1 Daten Operation 2 P2 Ergebnis Ergebnisberechnung ..... Daten Operation n Pn VL Datenbank-Implementierungstechniken – 3–56 Pipelining-Parallelität P1 Daten P2 Operation 1 Operation 2 .. Pn Operation n Ergebnis Datenströme VL Datenbank-Implementierungstechniken – 3–57 Intra-Operator-Parallelität Operation P1 Daten Splitter Operation P2 Mischer Ergebnis ..... Operation Pn VL Datenbank-Implementierungstechniken – 3–58 Datenpartitionierung ■ Ziel: Nutzung mehrerer Prozessoren/Disks durch Partitionierung der zu verarbeitenden Relation r in Fragmente r1 , . . . , rn ◆ Zerlegung einer Anfrage in parallel auszuführende Teilanfragen/-operationen ◆ Beschleunigung der Anfrageverarbeitung, da |r i | ≤ |r| ■ Anforderungen ◆ alle Fragmente ungefähr gleich groß ◆ Fragmente unterstützen die auszuführenden Operationen ■ Zuordnung zu Prozessoren P1 , . . . , Pn : vorab oder dynamisch VL Datenbank-Implementierungstechniken – 3–59 Partitionierungsstrategien ■ Round Robin-Fragmentierung Zerlegung in M Fragmente Satz der Relation wird Fragment (i mod M ) + 1 zugordnet ◆ günstige Lastbalancierung, falls Tupel mit gleicher Wahrscheinlichkeit referenziert werden ◆ aber: da keine Berücksichtigung der Attributwerte bei Verteilung ; für jede Anfrage ist Bearbeitung aller M Fragmente notwendig ◆ ◆ iter VL Datenbank-Implementierungstechniken – 3–60 Partitionierungsstrategien (II) ■ Bereichsfragmentierung Definition der Datenverteilung über Attributwerte disjunkte und vollständige Unterteilung des Wertebereichs ◆ notwendig: Kenntnis über Werteverteilung/Wertebereich ◆ Vorteil: bei exact match queries und range queries (bzgl. Verteilungsattribut) ist Beschränkung auf relevante Fragmente möglich ◆ Nachteil: u.U. ungünstige Parallelisierung (Ausnutzung nur weniger Prozessoren) ◆ ◆ VL Datenbank-Implementierungstechniken – 3–61 Partitionierungsstrategien (III) ■ Hash-Fragmentierung Verteilung auf Basis einer Hashfunktion über Verteilungsattribut ◆ notwendig: geeignete Hashfunktion zur Gleichverteilung ◆ Vorteil: exact-match queries bzgl. Verteilungsattribut kann durch Hashfunktion auf relevantes Fragment beschränkt werden ◆ VL Datenbank-Implementierungstechniken – 3–62 Partitionierungsstrategien (IV) ... ... range ... round robin hash VL Datenbank-Implementierungstechniken – 3–63 Parallelisierung unärer Operatoren ■ Selektion: [ [ σP (ri ) ri ⇒ σP (r) = r= ■ Projektion ohne Duplikateleminierung: dito ■ Duplikateleminierung: durch Sortierung ■ Aggregatfunktionen: ◆ min(r .Attr) = min(min(r1 .Attr), . . . , min(rn .Attr)) ◆ max(r .Attr) = min(max(r1 .Attr), . . . , max(rn .Attr)) i i VL Datenbank-Implementierungstechniken – 3–64 Parallelisierung unärer Operatoren (II) ■ Aggregatfunktionen (falls keine Duplikateliminierung nötig): X count(ri .Attr) ◆ count(r .Attr) = i ◆ sum(r.Attr) = X sum(ri .Attr) i ◆ avg(r.Attr) = sum(r.Attr) / count(r.Attr) VL Datenbank-Implementierungstechniken – 3–65 Paralleles Sortierung ■ Klassifikation bzgl. der Anzahl der Ein- und Ausgabeströme: ◆ 1:1, 1:viele, viele:1, viele:viele ■ Anforderungen für (?:viele): Teilergebnis an jedem Knoten ist sortiert ◆ sortiertes Gesamtergebnis durch einfaches Aneinanderfügen der Teilergebnisse ◆ VL Datenbank-Implementierungstechniken – 3–66 Parallel Binary Merge Sort ■ Viele:1-Verfahren ■ Ablauf: paralleles Sortieren aller Fragmente an allen beteiligten Knoten (Quicksort, External Merge Sort) Phase 2: Mischen der sortierten Fragmente durch andere Knoten (Mischknoten) bis ein einzelnes sortiertes Gesamtergebnis entstanden ist Phase 1: ■ Mischen kann parallel und in Pipeline erfolgen VL Datenbank-Implementierungstechniken – 3–67 Parallel Binary Merge Sort (II) P1: 3,6 P1: 1,3,4,6 P2: 1,4 P3: 2,3 P2: 1,2,3,3,3,4,6,6 P3: 2,3,3,6 P4: 3,6 P4: 1,1,1,2,2,3,3,3,4,4,5,6,6,7,8,9 P5: 1,5 P6: 1,7 P7: 2,8 P5: 1,1,5,7 P6: 1,1,2,4,5,7,8,9 P7: 2,4,8,9 P8: 4,9 VL Datenbank-Implementierungstechniken – 3–68 Block Bitonic Sort 1. Sort-Split-Ship (a) Sortierung der Fragmente an jedem beteiligten Knoten (b) Aufteilung der sortieren Fragmente in jeweils zwei Subfragmente gleicher Größe ■ jeder Wert des einen Subfragmentes (unteres Subfragment) ≤ alle Werte des oberen Subfragments (c) jedes Subfragment wird zu anderen Knoten übertragen VL Datenbank-Implementierungstechniken – 3–69 Block Bitonic Sort (II) 2. 2-Way-Merge Split (a) bei Eintreffen von zwei Subfragmenten: 2-Wege-Mischen zur Erzeugung eines sortierten Fragments (b) Splitten des Fragments und Weiterleiten entsprechend 1(b) bis (1) jeder Knoten Pi besitzt sortiertes Fragment und (2) jeder Wert an Pi ≤ jeder Wert an Pj für i ≤ j ■ eindeutige Festlegung der Übertragungsziele notwendig (siehe Beispiel) ■ Anzahl der Schritte: 1 2 log 2n(log 2n + 1) für n Knoten VL Datenbank-Implementierungstechniken – 3–70 Block Bitonic Sort (III) P1: 3,4,1,6 P2: 6,3,2,3 P3: 1,7,1,5 P4: 2,8,4,9 P1 L: 1,3 H: 4,6 P1 L: 1,3 H: 3,6 P1 L: 1,2 H: 3,3 P1 L: 1,2 H: 8,9 P1 L: 1,2 H: 2,3 P1 L: 1,1 P2 H: 3,6 L: 2,3 P2 L: 2,3 H: 4,6 P2 L: 3,4 H: 6,6 P2 L: 3,3 H: 5,7 P2 L: 1,1 H: 3,3 P2 L: 2,3 P3 H: 5,7 L: 1,1 P3 H: 5,7 L: 2,4 P3 H: 8,9 L: 5,7 P3 L: 2,3 H: 4,4 P3 L: 4,4 H: 8,9 P3 L: 4,4 P4 L: 2,4 P4 H: 8,9 P4 H: 2,4 P4 L: 1,1 P4 L: 5,6 P4 L: 6,7 H: 8,9 L: 1,1 L: 1,1 H: 6,6 H: 6,7 H: 1,2 H: 3,3 H: 5,6 H: 8,9 VL Datenbank-Implementierungstechniken – 3–71 Parallele Verbundberechnung ■ Dynamische Replikation ◆ Replikation der kleineren Relation r an jeden Knoten ◆ Ausführung des Verbundes durch Join-Prozessor ◆ Gesamtergebnis durch Vereinigung der lokalen Join-Ergebnisse ■ Dynamische Partitionierung ◆ partitionierte Umverteilung der Tupel an jeweils einen Knoten ◆ Verteilungsfunktion: Hashfunktion h oder Bereichsartitionierung VL Datenbank-Implementierungstechniken – 3–72 Dynamische Replikation 1. Koordinator: Initiiere Join auf allen Knoten Ri und Rj (i = 1 . . . n, j = 1 . . . m) 2. Scan-Phase: parallel an jedem S -Knoten: lies lokale Partition sj und sende sie an jeden Knoten Ri 3. Join-Phase: parallel an jedem R-Knoten mit Partition r i : [ ■ s := sj ■ ■ Berechne ti := r1 s (impliziert Lesen von ri ) Sende ti an Koordinator 4. Koordinator: Empfange und mische alle ti VL Datenbank-Implementierungstechniken – 3–73 Dynamische Replikation (II) r1 r2 rn Join-Knoten (R-Knoten) S-Datenknoten s1 sm VL Datenbank-Implementierungstechniken – 3–74 Dynamische Partitionierung 1. Koordinator: Initiiere Join auf allen R-, S - und Join-Knoten 2. Scan-Phase ■ parallel auf jedem R-Knoten: lies lokale Partition ri und sende jedes Tupel an zuständigen Join-Knoten ■ parallel auf jedem S -Knoten: lies lokale Partition si und sende jedes Tupel an zuständigen Join-Knoten VL Datenbank-Implementierungstechniken – 3–75 Dynamische Partitionierung (II) 3. Join-Phase: parallel auf jedem Join-Knoten k(k = 1 . . . p) [ ■ rk0 := rik (Menge der von Join-Knoten k empfangenen r-Tupel) [ ■ s0k := sik (Menge der von Join-Knoten k empfangenen s-Tupel) ■ berechne tk := rk0 1 s0k ■ Sende tk an Koordinator 4. Koordinator: Empfange und mische alle tk VL Datenbank-Implementierungstechniken – 3–76 Dynamische Partitionierung (III) Join-Knoten r1 r2 rn R-Datenknoten s1 sm S-Datenknoten VL Datenbank-Implementierungstechniken – 3–77 Simple Hash Join ■ Erweiterung des Hash-Verbundes ■ Ablauf: 1. Partitionierung der kleineren Relation r unter Verwendung einer Hashfunktion h1 (A) → Senden des iten Fragments an Prozessor Pi 2. an jedem Prozessor Pi : erzeuge Hashtabelle Hi unter Verwendung von h2 (A) → Tupel mit gleichen Werten von A in gleiche Buckets 3. Partitioniere s unter Anwendung von h1 und sende ites Fragment von s an Pi 4. an jedem Prozessor Pi : Tupel von si lesen und unter Anwendung von h2 (s.A) auf Verbundpartner aus ri prüfen VL Datenbank-Implementierungstechniken – 3–78 Simple Hash Join: Überlaufbehandlung ■ Bereich der Hashwerte vorab auswählen und nur betroffene Tupel in Hashtabelle einfügen ■ verbleibende Tupel in temporärer Relation sichern (für r und s) ■ anschließend: rekursive Behandlung der temporären Relationen ■ Verbundkandidaten können nur in temporären Relationen sein! VL Datenbank-Implementierungstechniken – 3–79 GRACE Hash Join ■ Ziel: Vermeidung von Überläufen ■ Idee: Vorab-Partitionierung der Relation und Ausführung des Simple Hash Joins ■ Ablauf: 1. Partitionierungsphase ◆ r und s in N Fragmente partitionieren und auf Disk sichern ◆ N so wählen, dass jedes Fragment in Hauptspeicher passt ◆ Verbundpartner von ri nur in si ! 2. Fragment-Join-Phase ◆ Verbund ri 1 si für 1 ≤ i ≤ N parallel berechnen VL Datenbank-Implementierungstechniken – 3–80 Hybrid Hash Join ■ Verbesserung des GRACE Hash Joins ■ Ausnutzung des Hauptspeichers während der Partitionierungsphase ◆ Allokation der Hashtabelle für s1 während des Lesens und Partitionierens von s ■ kombiniert Vorteile von Simple Hash Join und GRACE Hash Join Fall 1: großer Hauptspeicher ; N = 1 identisch zu Simple Hash Join Fall 2: kleiner Hauptspeicher ; großes N Vorteil gegenüber GRACE Hash Join durch initiale Hashtabelle VL Datenbank-Implementierungstechniken – 3–81