Anfrageoptimierung Java : Assembler (Faktor 2-10) , aber SQL : SQL optimiert (Faktor 1-100 und mehr) - Warum? - Datenbankpuffer - Speicherstrukturen - Logische Anfrageoptimierung - Physische Anfrageoptimierung - Anfragepläne und Planbewertung Datenbanken und Informationssysteme 1 - WS 2004 / 05 - Prof. Dr. Böttcher - S. Anfrageoptimierung / 1 Datenbankpuffer Gefährdete Daten Gesicherte Daten laden Datenbank im Hauptspeicher Datenbank auf Communication-Area speichern Platte Anwendungsprogramm im Hauptspeicher DBMS-eigene Hauptspeicherverwaltung wegen: - kontrolliertes auslagern (notwendig für Recovery-Fähigkeit) - optimierte Seitenverdrängung für Anfrageoptimierung Datenbanken und Informationssysteme 1 - WS 2004 / 05 - Prof. Dr. Böttcher - S. Anfrageoptimierung / 2 1 Speicherstrukturen und Indizes Primär-Index Datenbank Datenbanken und Informationssysteme 1 - WS 2004 / 05 Sekundär-Index - Prof. Dr. Böttcher - S. Anfrageoptimierung / 3 Speicherstrukturen - B-Bäume einheitliche Baumtiefe mindestes p/2 Pointer pro Knoten (außer Wurzel und Blätter) p = maximale Pointer-Zahl q = reale Pointerzahl , q≤ ≤p q-1 = Key-Anzahl Tree Ptr 1 Key Data 1 Ptr 1 Tree Ptr 2 Data B-Tree 1 Key q-1 Data Ptr q-1 Tree Ptr q Data B-Tree 2 B-Tree q Schlüssel in Sub-B-Tree K < Key K < Schlüssel in Sub-B-Tree K+1 Datenbanken und Informationssysteme 1 - WS 2004 / 05 - Prof. Dr. Böttcher - S. Anfrageoptimierung / 4 2 Speicherstrukturen - B-Bäume left sibling Tree Ptr 1 parent Key Data 1 Ptr 1 Tree Ptr 2 q Key q-1 Data B-Tree right sibling Data Ptr q-1 Tree Ptr q Data B-Tree Datenbanken und Informationssysteme 1 - WS 2004 / 05 B-Tree - Prof. Dr. Böttcher - S. Anfrageoptimierung / 5 Speicherstrukturen - B+-Bäume einheitliche Baumtiefe mindestes p/2 Pointer pro Knoten (außer Wurzel und Blätter) p = maximale Pointer-Zahl q = reale Pointerzahl , q≤ ≤p q-1 = Key-Anzahl Tree Ptr 1 Key Data 1 Ptr 1 Tree Ptr 2 Data B+-Tree 1 Key q-1 Data Ptr q-1 Tree Ptr q Data B+-Tree 2 B+-Tree q Schlüssel in Sub-B+-Tree K < Key K < Schlüssel in Sub-B+-Tree K+1 Datenbanken und Informationssysteme 1 - WS 2004 / 05 - Prof. Dr. Böttcher - S. Anfrageoptimierung / 6 3 Blätter von B+-Bäumen • enthalten Zeiger auf die Daten • enthalten keine Zeiger mehr auf Sub-Trees • enthalten Verweis auf Nachfolge-Blatt-Knoten Tree Ptr 1 Key Data 1 Ptr 1 Tree Ptr 2 Key q-1 Data Data LeafPtr q-1 Ptr q Data Schlüssel entsprechen Schlüsseln in den Daten. Datenbanken und Informationssysteme 1 - WS 2004 / 05 - Prof. Dr. Böttcher - S. Anfrageoptimierung / 7 Beispiel zu B+-Bäumen • 64 bit–Adressierung von Daten (=8 Byte für jeden Zeiger) • 4K = 4096 Byte pro Block (bzw. Seite) • 4 Byte für Integer-Schlüssel ==> Blatt-Seiten haben Platz für einen Leaf-Ptr (8 Byte) und 4096 div ( 4+8 ) = 340 (Key,DataPtr) - Paare ==> Verzweigungsgrad 340 innere Seiten haben Platz für einen letzten Teilbaum-Ptr (8 Byte) und 4096 div ( 4+8 ) = 340 (Key,DataPtr) - Paare ==> Verzweigungsgrad 341 B+-Baum-Tiefe 1 2 3 4 minimal bzw. 0 2*170 2*171*170 2*171*171*170 Datenbanken und Informationssysteme 1 - maximal adressierbare Datensätze 340 341*340 ≈ 105 341*341*340 ≈ 4* 107 341*341*341*340 ≈ 1010 WS 2004 / 05 - Prof. Dr. Böttcher - S. Anfrageoptimierung / 8 4 Speicherstrukturen - Hashing Hash-Funktion insert: Suche: h : Key voll ? auch im Bucket (=Datenbehälter) Überlaufbehälter Überlaufbehälter h(Key) Überlaufbehälter Datenbanken und Informationssysteme 1 - WS 2004 / 05 - Prof. Dr. Böttcher - S. Anfrageoptimierung / 9 Selektivität von Anfragen Entscheidend für die Größe eines Zwischenergebnisses Selektivität der Selektion mit Bedingung B : Selektivität ( SB(R) ) = | SB(R) | / | R | Selektivität des Joins mit Bedingung B : Selektivität ( R |X|B S ) = | R |X|B S | / ( | R | * | S | ) geschätzt (z.B. durch Stichproben, Histogramme) Datenbanken und Informationssysteme 1 - WS 2004 / 05 - Prof. Dr. Böttcher - S. Anfrageoptimierung / 10 5 Ziel der logischen Anfrageoptimierung SQL-Anfragen select A1,...,An from R1,..., Rm where B entsprechen Algebra-Ausdruck P(A1,...,An) SB ( R1 x ... x Rm ) - sehr große Zwischenergebnisse ==> Aufgabe: dasselbe Ergebnis mit kleineren Zwischenergebnissen erzielen. z.B. Selektion und Projektion soweit wie möglich nach innen. Datenbanken und Informationssysteme 1 - WS 2004 / 05 - Prof. Dr. Böttcher - S. Anfrageoptimierung / 11 Logische Anfrageoptimierung – Beispiel select S.Vorname, S.Name from Student S, Hört H, Kurs K where K.titel = 'Datenbanken' and K.kursnr = H.kursnr and S.mnr=H.mnr ; 200 P S.Vorname, S.Name | 200 S K.titel = 'Datenbanken' and K.kursnr = H.kursnr and S.mnr=H.mnr | 500.000.000.000 X 500.000.000 / \ 1.000 X K / \ S H Annahme: 10.000 50.000 10000 Studenten, die im Schnitt 5 Kurse hören 1000 Kurse, 2 davon Datenbanken mit je 100 Hörern Datenbanken und Informationssysteme 1 - WS 2004 / 05 - Prof. Dr. Böttcher - S. Anfrageoptimierung / 12 6 Logische Anfrageoptimierung – Beispiel Eine mögliche Optimierung : 200 P S.Vorname, S.Name | |X| 200 K.kursnr = H.kursnr 50.000 2 S K.titel = 'Datenbanken' S.mnr=H.mnr \ / \ \ 1.000 S H K / |X| 10.000 \ 50.000 Annahme: 10000 Studenten, die im Schnitt 5 Kurse hören 1000 Kurse, 2 davon Datenbanken mit je 100 Hörern Datenbanken und Informationssysteme 1 - WS 2004 / 05 - Prof. Dr. Böttcher - S. Anfrageoptimierung / 13 Logische Anfrageoptimierung – Beispiel Eine bessere Optimierung : 200 P S.Vorname, S.Name | 200 |X| S.mnr=H.mnr / S \ |X| 200 K.kursnr = H.kursnr 10.000 / H 50.000 1.000 \ 2 S K.titel = 'Datenbanken' | K Annahme: 10000 Studenten, die im Schnitt 5 Kurse hören 1000 Kurse, 2 davon Datenbanken mit je 100 Hörern Datenbanken und Informationssysteme 1 - WS 2004 / 05 - Prof. Dr. Böttcher - S. Anfrageoptimierung / 14 7 Regeln der logischen Anfrageoptimierung Vereinigung, Durchschnitt, kartesisches Produkt und Join sind kommutativ und assoziativ . R1 U R2 = R2 U R1 R1 Schnitt R2 = R2 Schnitt R1 R1 X R2 = R2 X R1 R1 |X|B R2 = R2 |X|B R1 ( R1 U R2 ) U R3 = R1 U ( R2 U R3 ) ( R1 Schnitt R2 ) Schnitt R3 = R1 Schnitt ( R2 Schnitt R3 ) ( R1 X R2 ) X R3 = R1 X ( R2 X R3 ) ( R1 |X|B R2 ) |X|B R3 = R1 |X|B ( R2 |X|B R3 ) Datenbanken und Informationssysteme 1 - WS 2004 / 05 - Prof. Dr. Böttcher - S. Anfrageoptimierung / 15 Regeln der logischen Anfrageoptimierung Selektionen kann man splitten und untereinander vertauschen : SB1 and B2(R) = SB1(SB2(R)) = SB2(SB1(R)) Selektionen kann man in Vereinigung, Differenz und Schnitt schieben : SB ( R1 U R2 ) = SB ( R1 ) U SB ( R2 ) SB ( R1 - R2 ) = SB ( R1 ) - SB ( R2 ) SB ( R1 Schnitt R2 ) = SB ( R1 ) Schnitt SB ( R2 ) Datenbanken und Informationssysteme 1 - WS 2004 / 05 - Prof. Dr. Böttcher - S. Anfrageoptimierung / 16 8 Regeln der logischen Anfrageoptimierung Selektion in ein Join-Argument schieben werden, SB ( R1 |X|B2 R2 ) = SB ( R1 ) |X|B2 R2 falls B nur Attribute aus R1 verwendet Selektion in ein Argument eines kartesischen Produktes schieben SB ( R1 X R2 ) = SB ( R1 ) X R2 falls B nur Attribute aus R1 verwendet Wenn das weder für R1 noch für R2 geht, d.h., falls B Attribute aus R1 und R2 verwendet: Selektion angewandt auf kartesisches Produkt zu Join machen SB ( R1 X R2 ) = R1 |X|B R2 Datenbanken und Informationssysteme 1 - WS 2004 / 05 - Prof. Dr. Böttcher - S. Anfrageoptimierung / 17 Regeln der logischen Anfrageoptimierung Projektion und Selektion sind vertauschbar, sofern die Projektion alle für die Selektionsbedingung benötigten Attribute erhält: SB ( PA1,...,Am ( R1 ) ) = PA1,...,Am ( SB ( R1 ) ) falls B nur Attribute aus A1,...,Am verwendet. Projektion in Vereinigung schieben PA1,...,Am ( R1 U R2 ) = PA1,...,Am ( R1 ) U PA1,...,Am ( R2 ) Projektion in ein Join-Argument schieben, sofern die Join-Attribute nicht wegprjoziert werden PA1,...,Am ( R1 |X|B R2 ) = PA1,...,Am ( ( PA1,...,Am,AB1,...,ABn ( R1 ) ) |X|B R2 ) wobei AB1,...,ABn die in der Join-Bedingung B benötigten Attribute aus R1 sind. Projektionen können zusammengefasst und zusätzlich eingefügt werden PA1,...,Am ( R1 ) = PA1,...,Am ( PA1,...,Am,AB1,...,ABn ( R1 ) ) Datenbanken und Informationssysteme 1 - WS 2004 / 05 - Prof. Dr. Böttcher - S. Anfrageoptimierung / 18 9 Logische Anfrageoptimierung - Schritte SQL-Anfrage als logischen Anfragebaum darstellen auf diesem Baum folgende Optimierungen durchführen: • Selektionen aufsplitten und nach unten (innen) schieben. • Selektionen und kartesische Produkte zu Joins zusammenfassen. • Joinreihenfolge mit kleinsten Zwischenergebnissen bestimmen. • Projektionen ggf. aufsplitten und möglichst weit nach unten im Anfragebaum schieben. Datenbanken und Informationssysteme 1 - WS 2004 / 05 - Prof. Dr. Böttcher - S. Anfrageoptimierung / 19 Physische Anfrageoptimierung Ziel : Plattenzugriffe minimieren Denn : 1 Plattenzugriff kostet etwa soviel wie 100.000 bis 1000.000 Hauptspeicheroperationen Anfragebaum in gleichwertigen Iteratorbaum übersetzen: Iterator P S.Vorname, S.Name | Iterator |X| 1 Iterator pro Algebra-Operator und 1 Iterator pro Relation S.mnr=H.mnr / Iterator-Rel(S) \ Iterator |X| K.kursnr = H.kursnr / Iterator-Rel(H) \ Iterator S K.titel = 'Datenbanken' | Iterator-Rel(K) Datenbanken und Informationssysteme 1 - WS 2004 / 05 - Prof. Dr. Böttcher - S. Anfrageoptimierung / 20 10 Iterator-Konzept Abstrakter Datentyp Iterator: Open( ) initialisiert des Iterators Next( ) gibt nächstes Tupel zurück/weiter Close( ) schließt Iterator, gibt Ressourcen frei Size( ) schätzt Größe des Ergebnisses auf der Basis der Schätzung für die Eingangsvariablen Cost( ) schätzt Kosten des Ergebnisses auf der Basis der Schätzung für die Eingangsvariablen Datenbanken und Informationssysteme 1 - WS 2004 / 05 - Prof. Dr. Böttcher - S. Anfrageoptimierung / 21 Klassen von Iteratoren Für alle Operationen op R oder R op S versucht man, R und S möglichst selten zu laden. • 1-Pass-Iteratoren genügt es, R (und S) einmal zu laden • Nested-Loop-Iteratoren lesen R einmal und S mehrfach • Mehr-Pass-Iteratoren lesen R (und oft auch S) mehrfach • Sort-basierte Iteratoren benutzen Sortierung • Index-basierte Iteratoren bauen einen Index auf • Hash-basierte Iteratoren bauen eine Hash-Tabelle auf Datenbanken und Informationssysteme 1 - WS 2004 / 05 - Prof. Dr. Böttcher - S. Anfrageoptimierung / 22 11 Merge-Sort Beispiel 3-Wege Merge-Sort mit 4 Hauptspeicherseiten. Für jede Folge F von 4 Blöcken aus R tue { lade F in den Datenbankpuffer im Hauptspeicher ; Quicksort ( Datenbankpuffer ) ; schreibe Datenbankpuffer auf die Platte ; } // Platte enthält sortierte Sequenzen der Länge 4 Solange die Platte mehrere sortierte Sequenzen enthält { mische jeweils (bis zu) 3 sortierte Sequenzen in eine längere sortierte Sequenz } Datenbanken und Informationssysteme 1 - WS 2004 / 05 - Prof. Dr. Böttcher - S. Anfrageoptimierung / 23 1-Pass-Iteratoren für unäre Operatoren Für Operationen op R mit op ∈ { load, store, P, S, removeDup, group, sort, hash } versucht man, mit einem Pass auszukommen, d.h. die ganze Relation nur 1x im Hauptspeicher zu haben für load, store, P, S geht das immer für die anderen Operationen nur, wenn R in den Hauptspeicher passt Datenbanken und Informationssysteme 1 - WS 2004 / 05 Das ist etwas vereinfacht, weil ggf. noch Platz für eine Suchstruktur und Platz für das Sammeln der Ausgabe sein muss. - Prof. Dr. Böttcher - S. Anfrageoptimierung / 24 12 Iterator für Datenbankrelation laden Implementierung der Operationen Open( ) Öffne Relation, lade erste Seite in den Hauptspeicher Next( ) gib nächstes Tupel zurück/weiter Close( ) schließe Relation, gib Hauptspeicher-Ressourcen frei Size( ) gib Größe der Relation zurück Cost( ) Anzahl der Blöcke, die von der Platte in den Hauptspeicher geladen werden müssen. Gleiche Implementierung für auf Platte ausgelagerte Zwischenergebnisse Datenbanken und Informationssysteme 1 - WS 2004 / 05 - Prof. Dr. Böttcher - S. Anfrageoptimierung / 25 1-Pass-Iterator für Projektion Implementierung der Operationen für P(R) verkettet mit vorigem Iterator (der R erzeugt) Open( ) rufe R.Open( ) auf Ergebnis des Eingangs-Iterators (R) ist im Hauptspeicher und wird weiter benutzt Next( ) gib Projektion des aktuellen Tupels R.Next() zurück/weiter Close( ) rufe R.Close( ) auf. Size( ) gib R.Size( ) * Projektionsanteil zurück Cost( ) 0, weil alles schon im Hauptspeicher ist. Datenbanken und Informationssysteme 1 - WS 2004 / 05 - Prof. Dr. Böttcher - S. Anfrageoptimierung / 26 13 1-Pass-Iterator für Standard-Selektion Implementierung der Operationen für SB(R) verkettet mit vorigem Iterator (der R erzeugt) Open( ) rufe R.Open( ) auf Ergebnis des Eingangs-Iterators (R) ist im Hauptspeicher und wird weiter benutzt Next( ) tuple = R.Next() ; while ( tuple≠null and not B(tuple) ) { tuple = R.Next(); } return tuple ; Close( ) rufe R.Close( ) auf. Size( ) gib R.Size( ) * Selektivität von SB zurück Cost( ) 0 für Standard-Selektion, aber R muss bereits im Hauptspeicher liegen Datenbanken und Informationssysteme 1 - WS 2004 / 05 - Prof. Dr. Böttcher - S. Anfrageoptimierung / 27 1-Pass-Iterator für bag-Union Berechnung von R ∪bag S : 1. übertrage jedes Tupel von R nach Output Output R 2. übertrage jedes Tupel von S nach Output Output S cost: 0 , falls R und S bereits im Hauptspeicher sind Platz-Bedarf: 2 Seiten (R bzw. S) und Output Datenbanken und Informationssysteme 1 - WS 2004 / 05 - Prof. Dr. Böttcher - S. Anfrageoptimierung / 28 14 1-Pass-Iteratoren für binäre Operatoren Für Operationen R op S mit op ∈ { ∪set, ∩set, -set, ∩bag, -bag, X, |X| } und S passt in den Hauptspeicher baue Suchstruktur für S auf und lese R (und S) nur einmal R Output Suchbaum Welche Tupel von wo nach Output übertragen? S Datenbanken und Informationssysteme 1 - WS 2004 / 05 - Prof. Dr. Böttcher - S. Anfrageoptimierung / 29 1-Pass-Iteratoren für binäre Operatoren Für Operationen R op S mit op ∈ { ∪set, ∩set, -set, ∪bag, ∩bag, -bag, X, |X| } und S passt in den Hauptspeicher baue Suchstruktur für S auf und lese R (und S) nur einmal R Suchbaum S Output ∩set : übertrage Tupel t von R nach Output, falls t nicht in S gefunden wird. ∪set : 1. übertrage Tupel t von R nach Output, falls t nicht in S gefunden wird. 2. übertrage Tupel aus S nach Output bei ∩bag zähle Anzahl gleicher Tupel im Suchbaum für S Datenbanken und Informationssysteme 1 - WS 2004 / 05 - Prof. Dr. Böttcher - S. Anfrageoptimierung / 30 15 Übungsaufgabe: 1-Pass-Iteratoren für binäre Operatoren R-S und S-R Annahme: S passt in den Hauptspeicher , aber R nicht Wie implementiert man 1. R –set S , 2. S –set R , 3. R –bag S und 4. S –bag R als 1-Pass-Iteratoren, also so, dass man mit einer Suchstruktur für S im Hauptspeicher, einer Eingabeseite für R und einer Ausgabeseite für Output auskommt? Output R Datenbanken und Informationssysteme 1 - Suchbaum WS 2004 / 05 S - Prof. Dr. Böttcher - S. Anfrageoptimierung / 31 1-Pass-Iteratoren für binäre Operatoren Für Operationen R op S mit op ∈ { ∪set, ∩set, -set, ∪bag, ∩bag, -bag, X, |X| } und S passt in den Hauptspeicher baue Suchstruktur für S auf und lese R (und S) nur einmal R Suchbaum S Output R-setS : übertrage Tupel t von R nach Output, falls t nicht in S gefunden wird. S-setR : 1. lösche Tupel t von R aus S. 2. übertrage Tupel aus S nach Output bei -bag zähle Anzahl gleicher Tupel im Suchbaum für S Datenbanken und Informationssysteme 1 - WS 2004 / 05 - Prof. Dr. Böttcher - S. Anfrageoptimierung / 32 16 Iterator für 1-Pass-"Nested-Loop-Join", falls 1 Relation in Hauptspeicher passt Implementierung der Operation R |X|B S durch Nested-Loop-Join Falls die kleinere Relation (z.B. S) in den Hauptspeicher passt, und noch eine Seite für Blöcke aus R frei ist, und noch eine Seite für die Ergebnissammlung und -ausgabe frei ist: lade(S) in den Hauptspeicher solange R noch ungeladene Seiten hat { lade die nächste Seite Ri von R in den Hauptspeicher Ist in Wirklichkeit komplizierter, for each tuple r in Ri weil Next() einzelne Tupel weitergibt for each tuple s in S if ( r |X|B s ) output (r,s) } Datenbanken und Informationssysteme 1 - WS 2004 / 05 - Prof. Dr. Böttcher - S. Anfrageoptimierung / 33 Nested-Loop-Iteratoren Implementierung der Operation R op S durch Nested-Loop-Iteratoren Lies eine (i.d.R. die größere) Relation R einmal und die andere Relation (i.d.R. die kleiner) S mehrfach, ggf. im Zickzack-Modus Datenbanken und Informationssysteme 1 - WS 2004 / 05 - Prof. Dr. Böttcher - S. Anfrageoptimierung / 34 17 Naiver Iterator für Nested-Loop-Join, falls keine Relation in den Hauptspeicher passt Implementierung der Operation R |X|B S Die naive Implementierung R wird nur einmal gelesen for each tuple r in R for each tuple s in S if ( r |X|B s ) output (r,s) Ist in Wirklichkeit komplizierter, weil Next() einzelne Tupel weitergibt produziert zu viele Seitenfehler, weil pro Tupel r aus R ganz S einmal geladen wird Datenbanken und Informationssysteme 1 - WS 2004 / 05 - Prof. Dr. Böttcher - S. Anfrageoptimierung / 35 Iterator für Nested-Loop-Join, falls keine Relation in den Hauptspeicher passt Implementierung der Operation für R |X|B S Teile Hauptspeicher auf in k Seiten für S und m-k Seiten für R K = Folge der nächsten k Seiten aus S M = Folge der nächsten m-k Seiten aus R R wird nur einmal gelesen for each M in R for each K in S Ist in Wirklichkeit komplizierter, for each tuple r in M weil Next() einzelne Tupel weitergibt for each tuple s in K if ( r |X|B s ) output (r,s) produziert weniger Seitenfehler, weil nur pro Seiten-Folge M aus R ganz S einmal geladen wird Datenbanken und Informationssysteme 1 - WS 2004 / 05 - Prof. Dr. Böttcher - S. Anfrageoptimierung / 36 18 Zickzack-Iterator für Nested-Loop-Join, falls keine Relation in den Hauptspeicher passt Blöcke aus S 1. 2. 3. 4. 5. for each page Ri in R solange nicht ganz S gelesen ist lies je k Seiten K aus S im Zickzack-Verfahren for each tuple r in Ri for each tuple s in K if ( r |X|B s ) output (r,s) produziert noch weniger Seitenfehler, weil Seiten "am Rand von S" seltener geladen werden Datenbanken und Informationssysteme 1 - WS 2004 / 05 k k Seiten aus S Ri Ausgabe - Prof. Dr. Böttcher - S. Anfrageoptimierung / 37 Sort-basierte unäre Iteratoren 1. Sortieren R ( das geht mit N-Wege-Merge-Sort ) 2. führe eigentliche Zieloperation durch, z.B. Duplikateliminierung z.B. Gruppierung (das geht mit jeweils einem Scan der sortierten Relation) Datenbanken und Informationssysteme 1 - WS 2004 / 05 - Prof. Dr. Böttcher - S. Anfrageoptimierung / 38 19 Sort-basierte Iteratoren Sortieren R oder S oder (R und S) Sort-Merge-Join sotiere R und S nach Join-Attributen Merge-Lauf: wähle alle Paare mit gleichen Join-Attributwerten ( Tafel ) Sort-basierte Operationen für ∪, ∩, sortiere R und S , zähle mehrfach vorkommende Tupel Merge-Lauf Datenbanken und Informationssysteme 1 - WS 2004 / 05 - Prof. Dr. Böttcher - S. Anfrageoptimierung / 39 Index-basierte Iteratoren bauen einen Index für R oder für S oder für R und S auf beim Primär-Index R zuerst sortieren nach Index-Kriterium dann B+-Baum aufbauen beim Sekundär-Index genügt: aus Primärdaten Sekundärschlüssel extrahieren + Paare ( Sekundärschlüssel, Referenz auf Daten-Block) in einen B+-Baum eintragen Datenbanken und Informationssysteme 1 - WS 2004 / 05 - Prof. Dr. Böttcher - S. Anfrageoptimierung / 40 20 Iterator für Index-Selektion Implementierung der Operationen für SB(R) , z.B. für key>66 Open( ) Abstieg im Index (z.B. B+-Baum) zu der ersten Seite, die die Selektionsbedingung erfüllt Next( ) über den Index Zugriff auf das nächste Tupel (i.d.R. auf einer anderen Seite) Stoppe, wenn Index-Schlüssel zu groß werden Close( ) rufe R.Close( ) auf und schließe den Index. Size( ) gib R.Size( ) * Selektivität von SB zurück Cost( ) begrenzt durch Anzahl der Ergebnistupel + Indextiefe + Selektivität ( SB ) Indexblattanzahl Datenbanken und Informationssysteme 1 - WS 2004 / 05 - Prof. Dr. Böttcher - S. Anfrageoptimierung / 41 Iteratoren für Index-Join Index für R, Scan von S Für jedes Tupel s aus S benutze Index von R, um Join-Partner r aus R zu suchen falls join (r,s) output (r,s) Index für R und Index für S benutze Index von R und Index von S für einen Merge-Lauf (wie beim Sort-Merge-Join) Datenbanken und Informationssysteme 1 - WS 2004 / 05 - Prof. Dr. Böttcher - S. Anfrageoptimierung / 42 21 Hash-basierte Iteratoren bauen Hash-Tabelle für R oder für S oder für R und S auf Ziel: große Relationen solange durch Hashfunktion partitionieren, bis (einige) Teile in den Hauptspeicher passen Unären Operatoren auf Partitionen im Hauptspeicher durchführen z.B. Duplikateliminierung Binäre Operatoren auf Partitionen durchführen, die zueinander passen, dabei: andere Iteratoren verwenden Datenbanken und Informationssysteme 1 - WS 2004 / 05 - Prof. Dr. Böttcher - S. Anfrageoptimierung / 43 Hash-Join R |X|a=b S baut (ggf. wiederholt) Hash-Tabelle für (Partitionen von) R und S auf Split( R, S ) { wähle neue Hash-Funktion h für R.a und benutze h auch für S.b zerlege R und S mit h in mehrere Behälter R1,…,Rn und S1,…,Sn für jedes Behälter-Paar (Ri,Si): falls (mind. ein Behälter (Ri oder Si) passt in Hauptspeicher) Nested-Loop-Join( Ri, Si ) ; sonst Split( Ri, Si ) } Bsp. Tafel: Männer |X|alter=alter Frauen Datenbanken und Informationssysteme 1 - WS 2004 / 05 - Prof. Dr. Böttcher - S. Anfrageoptimierung / 44 22 Hash-Join R |X|a=b S Warum wird wiederholt mit Hash-Funktion partitioniert ? • Alles auf einmal partitionieren, würde evtl. zu viele zu kleine Partitionen bilden (fast leere Behälter brauchen zuviel Platz) • Grad der Partitionierung (Verzweigungsfaktor) ist limitiert durch Anzahl der Seiten, die im Hauptspeicher dafür zur Verfügung stehen Datenbanken und Informationssysteme 1 - WS 2004 / 05 - Prof. Dr. Böttcher - S. Anfrageoptimierung / 45 Zusammenfassung Iterator-Klassen Für alle Operationen op R oder R op S versucht man, R und S möglichst selten zu laden. • 1-Pass-Iteratoren genügt es, R (und S) einmal zu laden • Nested-Loop-Iteratoren lesen R einmal und S mehrfach • Mehr-Pass-Iteratoren lesen R (und oft auch S) mehrfach • Sort-basierte Iteratoren benutzen Sortierung • Index-basierte Iteratoren bauen einen Index auf • Hash-basierte Iteratoren bauen eine Hash-Tabelle auf Datenbanken und Informationssysteme 1 - WS 2004 / 05 - Prof. Dr. Böttcher - S. Anfrageoptimierung / 46 23