TU-München Hauptseminar Informatik Database Hall of Fame Wintersemester 2001/2002 Prof. R. Bayer: B-Bäume Verfasser: Moritz Theile Betreuer: Prof. Dr. D. Kossmann Vortragstermin: 27.11.01 B-Bäume -Motivation -Wesen des B-Baumes -Balance -günstig für Hardware -Operationen auf B-Bäumen -Suchen -Einfügen -Löschen -Andere B-Bäume -B*-Baum -B+-Baum -Parallele Operationen auf B-Bäumen Motivation Alle Bundesbürger: Name: Adr.: PLZ: Ort: Telefon: Ziel: Möglichst schnelles Finden von einem bestimmten Datensatz. n n+1 n+2 n+3 n+4 n+5 n+6 z.B. finden der Person x mit der gegebenen Telefonnummer y. Lösung: Die Spalten indizieren, d.h. die Daten einer Spalte zusammen mit dem Zeiger auf den Record in einer schnell zu durchsuchenden Datenstruktur abspeichern. Naiver Ansatz: Alle Telefonnummern in einen binären Suchbaum Löschen eines Knotens k,d k,d k,d k,d k,d k,d k,d k,d k,d Suchzeit: O(log n) k,d k,d k,d k,d Löschen eines Knotens k,d k,d k,d k,d k,d k,d k,d k,d k,d Suchzeit: O(log n) k,d k,d k,d k,d Löschen eines Knotens k,d k,d k,d k,d k,d k,d k,d k,d Suchzeit: O(log n) k,d k,d k,d k,d Einfügen von Knoten k,d k,d k,d k,d k,d k,d k,d k,d k,d k,d k,d k,d k,d k,d Suchzeit: O(log n) k,d k,d Einfügen von Knoten k,d k,d k,d k,d k,d k,d k,d k,d k,d k,d k,d k,d k,d k,d Suchzeit: O(log n) k,d k,d Warum keine höhenbalancierten Bäume wie z.B. den AVL-Baum? Das Problem der Entartung ist mit AVL-Bäumen gelöst. Aber: Wir haben es mit sehr großen Indizes zu tun Es passt nur ein Bruchteil in den Arbeitsspeicher. Die Operationen im AVL-Baum weisen keinerlei Lokalität auf, d.h. man kann nicht voraussagen, welche Knoten man wahrscheinlich bearbeiten muss! =>Häufiger Zugriff auf den langsamenHintergrundspeicher Lösung: B-Bäume Report on the 2001 SIGMOD and PODS Awards .... The SIGMOD Innovations award is given „For innovative and highly significant contributions of enduring values to the development, understanding, or use of database systems and databases.“ This year´s winner is Prof. Rudolf Bayer of the Technical University of Munich, for his invention of the B-Tree prefix compression, and of lock coupling for concurrent access to B-Trees .... Merkmale eines B-Baumes I: 1.) Alle Wege von der Wurzel zu den Blättern sind gleich lang. 2.) Jeder Knoten hat mindestens k und maximal 2k Einträge. Ausnahme: Die Wurzel kann 1 bis 2k Einträge haben. 3.) Wenn ein Knoten n Einträge hat, hat er n+1 Verweise auf seine Söhne. Ausnahme: Blätter haben undefinierte Verweise. Merkmale eines B-Baumes II: 4.) Ein Blatt muss folgendermaßen organisiert sein: k1,d1 k2,d2 k3,d3 k4,d4 k1 bis kn sind Schlüssel z1 bis zn+1 sind Zeiger auf Söhne z1 z2 z3 z4 z5 .... kn,dn .... zn+1 Es muß gelten: a) z1 zeigt auf Teilbaum mit Schlüsseln kleiner k1 b) zi (i=1...n) zeigt auf Teilbaum mit Schlüsseln zwischen ki und ki+1 c) zn+1 zeigt auf Teilbaum mit Schlüsseln grösser kn Beispiel für einen B-Baum 21 7 15 2 3 4 8 11 12 28 42 17 18 23 25 26 30 35 44 45 50 51 Suchoperation auf einem B-Baum find(11) 21 7 15 2 3 4 8 11 12 28 42 17 18 23 25 26 30 35 44 45 50 51 Einfügeoperation auf einem B-Baum insert(45) 21 7 15 2 3 4 8 11 12 28 42 17 18 23 25 26 30 35 44 47 50 51 Einfügeoperation auf einem B-Baum insert(45) 21 7 15 28 42 45 2 3 4 8 11 12 17 18 23 25 26 30 35 44 47 50 51 Einfügeoperation auf einem B-Baum insert(45) 21 7 15 2 3 4 8 11 12 28 42 17 18 23 25 26 30 35 44 45 47 50 51 Einfügeoperation auf einem B-Baum insert(45) 21 7 15 2 3 4 8 11 12 28 42 47 17 18 23 25 26 30 35 44 45 50 51 Einfügeoperation auf einem B-Baum insert(45) 21 7 15 2 3 4 8 11 12 28 42 47 17 18 23 25 26 30 35 44 45 50 51 Löschoperation auf einem B-Baum delete(7) 21 7 15 2 3 4 8 11 12 28 42 47 17 18 23 25 26 30 35 44 45 50 51 Löschoperation auf einem B-Baum delete(7) 21 15 2 3 4 8 11 12 28 42 47 17 18 23 25 26 30 35 44 45 50 51 Löschoperation auf einem B-Baum delete(7) 21 8 15 2 3 4 11 12 28 42 47 17 18 23 25 26 30 35 44 45 50 51 Löschoperation auf einem B-Baum delete(8) 21 8 15 2 3 4 11 12 28 42 47 17 18 23 25 26 30 35 44 45 50 51 Löschoperation auf einem B-Baum delete(8) 21 15 2 3 4 11 12 28 42 47 17 18 23 25 26 30 35 44 45 50 51 Löschoperation auf einem B-Baum delete(8) 21 11 15 2 3 4 12 28 42 47 17 18 23 25 26 30 35 44 45 50 51 Löschoperation auf einem B-Baum delete(8) 21 11 15 2 3 4 12 28 42 47 17 18 23 25 26 30 35 44 45 50 51 Löschoperation auf einem B-Baum delete(8) 21 4 15 2 3 11 12 28 42 47 17 18 23 25 26 30 35 44 45 50 51 Löschoperation auf einem B-Baum delete(11) 21 4 15 2 3 11 12 28 42 47 17 18 23 25 26 30 35 44 45 50 51 Löschoperation auf einem B-Baum delete(11) 21 4 15 2 3 12 28 42 47 17 18 23 25 26 30 35 44 45 50 51 Löschoperation auf einem B-Baum delete(11) 21 4 15 2 3 12 28 42 47 17 18 23 25 26 30 35 44 45 50 51 Löschoperation auf einem B-Baum delete(11) 21 15 2 3 4 12 28 42 47 17 18 23 25 26 30 35 44 45 50 51 Löschoperation auf einem B-Baum delete(11) 21 15 2 3 4 12 28 42 47 17 18 23 25 26 30 35 44 45 50 51 Löschoperation auf einem B-Baum delete(11) 28 15 21 2 3 4 12 42 47 17 18 23 25 26 30 35 44 45 50 51 Kosten von Operationen Als Grundlage der Kostenkalkulation dient die Anzahl der teuren Hintergrundspeicher- bzw. Knotenzugriffe. 21 8 15 2 3 4 1112 h 284247 1718 232526 3035 4445 5051 n+1 < log k 2 = Anzahl der Knotenzugriffe im Worst-Case Anzahl der Records 103 k 104 105 106 107 108 5 3 5 6 8 9 11 25 2 3 3 4 4 5 50 2 2 3 3 4 4 75 2 2 3 3 4 4 Anzahl Bundesbürger Kosten von insert() und delete() Insert() und delete() können unter Umständen teurer als find() sein, da sie durch notwendige rebalance-Operationen den Baum wieder hinauflaufen müssen. Der maximale Weg ist aber, auch nur maximal doppelt so lang, wie der von find(). =>Im schlimmsten Fall nehmen die Kosten proportional zu logk n zu. Die Wahl von k Hintergrundspeicher (HD) Arbeitsspeicher (RAM) (langsam) (schnell) ein Knoten Gesamte Indexstruktur Zugriff 2k Kapazität >> k Pro Zugriff kann bloss eine sehr begrenzte Datenmenge in den Arbeitsspeicher transferiert werden. => Man wählt k am besten so, daß man pro Zugriff einen ganzen Knoten auslesen kann. B*-Bäume Unterschied zwischen B- und B*-Bäumen B-Bäume: 2.) Jeder Knoten hat mindestens k und maximal 2k Einträge. Ausnahme: Die Wurzel kann 1 bis 2k Einträge haben. B*-Bäume: 2.) Jeder Knoten hat mindestens 1 1/6 k und maximal 2k Einträge. Ausnahme: Die Wurzel kann 1 bis 2k Einträge haben. Vor- und Nachteile von B*-Bäumen Vorteile: -Speicherausnutzung mindestens 66% -im worst-case flachere Bäume Nachteile: - rebalance-Funktionen häufiger notwendig -etwas aufwendigere Operationen + B -Bäume Punktsuche und Bereichssuche Punktsuche: Gib die Adresse zurück, die der Nummer 089/8150815 zugeordnet ist. Bereichssuche: Gib eine Liste mit den Adressen aus, die mit 089 beginnen. Merkmal eines B+-Baumes Alle Schlüssel befinden sich in den Blättern. Die Blätter sind von links nach rechts miteinander verlinkt. B+-Baum-Konzept random-search sequentialsearch Vorteil bei sequentieller Suche: Jeder Knoten muß garantiert nur einmal in den Speicher geladen werden. Index-BBaum ohne Zeiger auf Records Eigentliche Schlüssel mit Verweise auf die Daten Beispiel für einen B+-Baum 21 4 15 2 3 4 12 15 28 42 49 17 18 21 23 25 26 27 30 35 42 45 47 50 51 Operationen auf einem B+-Baum Die Operationen auf einem B+-Baum sind denen auf einem BBaum sehr ähnlich. Ich werde an dieser Stelle darauf verzichten genauer darauf einzugehen. Parallele Operationen auf einem B-Baum Parallele Operationen auf B-Bäumen Problem: Wenn mehrere Prozesse gleichzeitig auf einen B-Baum zugreifen kann dies zu Problemen führen. Parallele Operationen auf B-Bäume Beispiel: Transaktion 1: read(12) Transaktion 2: insert(3) Knoten A Knoten A 15 7 Insert(3) Knoten B Knoten B 2 5 7 12 2 3 T1: read(12) T2: insert(3) bekommt Pointer zu B spaltet B in B u. C liest B Time Knoten C 7 12 Sperren auf Knoten Kompatibilitätsmatrix: Beantragter Momentaner Sperr-Modus Sperr-Modus S X S OK X S: „shared“ lock X: „exclusive“ lock Naiver Ansatz insert() delete() find() next() S X 4 15 2 3 11 12 4 15 17 18 2 3 Nur Suchen können parallel ausgeführt werden. Update-Funktionen lassen keine Parallelität zu. Sehr geringe Parallelisierung der Funktionen. 11 12 17 18 Sichere und unsichere Knoten Ein Knoten ist dann sicher, wenn seine Vorfahren durch die Operation unverändert bleiben. Sichere und unsichere Knoten bezüglich der insert()-Funktion Ein Knoten ist bezüglich einer insert()-Operation dann sicher, wenn die Anzahl seiner Einträge kleiner als 2k ist. 28 42 23 25 26 30 35 44 47 50 51 = sicher = unsicher Sichere und unsichere Knoten bezüglich der delete()-Funktion Ein Knoten ist bezüglich einer delete()-Operation dann sicher, wenn die Anzahl seiner Einträge größer als k ist. 28 42 23 25 26 30 35 44 47 50 51 = sicher = unsicher Drei Lösungen mit Lock-Coupling In einer Veröffentlichung haben Bayer und Schkolnick (1977) drei verschiedene Protokolle zur Parallelisierung von Zugriffen auf B*-Bäume vorgestellt. Für Lese- und Schreibprozesse kommen immer verschiedene Protokolle zum Einsatz. Lösung Nr. 1 Lösung Nr. 1 für Leser Protokoll für Leser: 0) Place S-lock on root; 1) Get root and make it the current node; 2) While current node is not a leaf do begin 3)Place S-lock on appropriate son of current node; 4)Release S-lock on current node; 5)Get son of current node and make it current; end Lösung Nr. 1 für Leser S = sicher = unsicher Lösung Nr. 1 für Leser S S = sicher = unsicher Lösung Nr. 1 für Leser S S = sicher = unsicher Lösung Nr. 1 für Leser S = sicher = unsicher Lösung Nr. 1 für Leser S S = sicher = unsicher Lösung Nr. 1 für Leser S S S = sicher = unsicher Lösung Nr. 1 für Leser S S S = sicher = unsicher Lösung Nr. 1 für Leser S S = sicher = unsicher Lösung Nr. 1 für Leser S S S = sicher = unsicher Lösung Nr. 1 für Leser S S S = sicher = unsicher Lösung Nr. 1 für Leser S S = sicher = unsicher Lösung Nr. 1 für Leser S = sicher = unsicher Lösung Nr. 1 für Leser S S = sicher = unsicher Lösung Nr. 1 für Leser S S = sicher = unsicher Lösung Nr. 1 für Leser S = sicher = unsicher Lösung Nr. 1 für Leser = sicher = unsicher Lösung Nr. 1 für Schreiber Protokoll für Schreiber: 0) Place X-lock on root; 1) Get root and make it the current node; 2) While current node is not a leaf do begin 3)Place X-lock on appropriate son of current node; 4)Get son and make it the current node; 5)If current node is safe then release all locks held on ancestors of current node; end Lösung Nr. 1 für Schreiber = sicher = unsicher Lösung Nr. 1 für Schreiber X = sicher = unsicher Lösung Nr. 1 für Schreiber X X = sicher = unsicher Lösung Nr. 1 für Schreiber X X = sicher = unsicher Lösung Nr. 1 für Schreiber X = sicher = unsicher Lösung Nr. 1 für Schreiber X = sicher = unsicher Lösung Nr. 1 für Schreiber X = sicher = unsicher Lösung Nr. 1 für Schreiber X = sicher = unsicher Lösung Nr. 1 für Schreiber X X = sicher = unsicher Lösung Nr. 1 für Schreiber X X = sicher = unsicher Lösung Nr. 1 für Schreiber X X X = sicher = unsicher Lösung Nr. 1 für Schreiber X X X = sicher = unsicher Lösung Nr. 1 für Schreiber X X = sicher = unsicher Lösung Nr. 1 für Schreiber X = sicher = unsicher Lösung Nr. 1 für Schreiber X = sicher = unsicher Lösung Nr. 1 für Schreiber X = sicher = unsicher Lösung Nr. 1 für Schreiber X = sicher = unsicher Lösung Nr. 1 für Schreiber X = sicher = unsicher Lösung Nr. 1 für Schreiber X = sicher = unsicher Lösung Nr. 1 für Schreiber X = sicher = unsicher Lösung Nr. 1 für Schreiber = sicher = unsicher Bewertung von Lösung Nr. 1 X Durch das Protokoll wird gleich ganz am Anfang ein X-Lock auf die Wurzel gesetzt, obwohl dieses höchstwahrscheinlich nicht notwendig gewesen wäre. Es werden in diesem Moment also alle anderen Prozesse ausgeschlossen. Lösung Nr. 2 Lösung Nr. 2 für Leser Protokoll für Leser: Siehe Lösung Nr. 1 Lösung Nr. 2 für Schreiber Protokoll für Schreiber: 0) Place S-lock on root; 1) Get root and make it the current node; 2) While current node is not a leaf do begin 3)If son is not a leaf node then place S-lock on appropriate son; else place X-lock on appropriate son; 4)Release lock on current node; 5)Get son and make it the current node; End If corrent node is unsafe then release all locks, repeat access with solution 1; Lösung Nr. 2 für Schreiber S = sicher = unsicher Lösung Nr. 2 für Schreiber S S = sicher = unsicher Lösung Nr. 2 für Schreiber S = sicher = unsicher Lösung Nr. 2 für Schreiber S = sicher = unsicher Lösung Nr. 2 für Schreiber S S = sicher = unsicher Lösung Nr. 2 für Schreiber S = sicher = unsicher Lösung Nr. 2 für Schreiber S = sicher = unsicher Lösung Nr. 2 für Schreiber S X = sicher = unsicher Lösung Nr. 2 für Schreiber X = sicher = unsicher Lösung Nr. 2 für Schreiber X = sicher = unsicher Bewertung von Lösung Nr. 2 In diesem Fall hofft man einfach, dass das zu bearbeitende Blatt sicher ist. Statistisch betrachtet ist dies auch relativ wahrscheinlich. Ungefähr einmal in k Fällen kommt es vor, dass das Blatt nicht sicher ist. In diesem Fall wird der Vorgang einfach mit dem Protokoll aus der Lösung Nr.1 wiederholt. X Anmerkung: diese Methode eignet sich besonders für große k gut. Erstens ist die Wahrscheinlichkeit für einen unsicheren Knoten gering und zweitens ist der Baum relativ flach. Lösung Nr. 3 Lösung Nr. 3 für Leser Protokoll für Leser: Siehe Lösung Nr. 1 Lösung Nr. 3 für Schreiber A S X Semantik: x y x ist kompatibel zu y x y x kann zu einem y umgewandelt werden Lösung Nr. 3 für Schreiber Protokoll für Schreiber: 0)Place A-lock on root; 1)Get root and make it the current node; 2)While current node is not a leaf do begin 3)place S-lock on appropriate son; 4)Get son and make it the current node; 5)If current node is safe then release all locks held on ancestors of current node; end 6)If Update will be successful then convert, top-down,all A-locks into X-locks; Lösung Nr. 3 für Schreiber A A = sicher S = unsicher X Lösung Nr. 3 für Schreiber A A A = sicher S = unsicher X Lösung Nr. 3 für Schreiber A A A = sicher S = unsicher X Lösung Nr. 3 für Schreiber A A = sicher S = unsicher X Lösung Nr. 3 für Schreiber A A A = sicher S = unsicher X Lösung Nr. 3 für Schreiber A A A = sicher S = unsicher X Lösung Nr. 3 für Schreiber A A A A = sicher S = unsicher X Lösung Nr. 3 für Schreiber A A A A = sicher S = unsicher X Lösung Nr. 3 für Schreiber S A A A A = sicher S = unsicher X Lösung Nr. 3 für Schreiber S A S A A A = sicher S = unsicher X Lösung Nr. 3 für Schreiber S A S Request to change to X A A A = sicher S = unsicher X Lösung Nr. 3 für Schreiber S A S Request to change to X A A A = sicher S = unsicher X Lösung Nr. 3 für Schreiber A S Request to change to X A A A = sicher S = unsicher X Lösung Nr. 3 für Schreiber A S A Request to change to X S A A = sicher S = unsicher X Lösung Nr. 3 für Schreiber A S A Request to change to X S A A = sicher S = unsicher X Lösung Nr. 3 für Schreiber A Request to change to X A A A = sicher S = unsicher X Lösung Nr. 3 für Schreiber X A A A = sicher S = unsicher X Lösung Nr. 3 für Schreiber X X A A = sicher S = unsicher X Lösung Nr. 3 für Schreiber X X X A = sicher S = unsicher X Bewertung von Lösung Nr. 3 Vorteile: -Prozess blockiert Leseprozesse bloß, wenn unbedingt notwendig. -Im Falle eines unsicheren Blattes müssen nur die A-locks in X-locks umgewandelt werden. Nachteile: -Evtl. unnötiger Ausschluß von Schreibprozessen -Zeitverlust durch Konvertierung von Sperren. Welche Lösung nimmt man? Alle! In einer generalisierten Lösung haben Bayer und Schkolnick ein Protokoll angegeben, welches alle drei Ansätze so miteinander vereint, dass die jeweiligen Vorteile möglichst gut ausgenutzt werden. Literatur: Rudolf Bayer, Mario Schkolnick: Concurrency of Operations on B-Trees. Acta Informatica 9: 1-21 (1977) Zusammenfassung B-Bäume sind höhenbalancierte (Such-)Bäume, die sich besonders für den Einsatz auf heutigen Hardwaresystemen eignen. Durch entsprechende Protokolle läßt sich auf BBäumen ein hoher Grad an Parallelisierung erreichen.