1 B*-Bäume B*-BÄUME Beobachtung: • Ein Index ist seinerseits wieder nichts anderes als eine Datei mit unpinned Records. • Es gibt keinen Grund, warum man nicht einen Index über einem Index haben sollte, und so weiter, bis der letzte Index in einen einzigen Block paßt. • Eine solche Hierarchie von Indizes (Multi-Level-Index) kann weitaus effektiver sein als ein einziger Index. • Eine Multi-Level-Index Hierarchie kann als ein Baum betrachtet werden. • Beispiel: Jeder Index-Block kann fünf Einträge enthalten. Grundlagen der Datenbanksysteme II 2 B*-Bäume First level index 2 Second level index 2 21 Third level index 2 8 14 21 File 2 ... 7 ... 8 ... 11 ... 14 ... 19 Grundlagen der Datenbanksysteme II ... 21 ... 22 ... 3 B*-Bäume Anforderungen an einen Multi-Level-Index: • Baum von Indizes mit einer unspezifizierten Anzahl von Ebenen. • Balancierter Baum: Jeder Pfad von der Wurzel ( erste Index-Ebene ) zu einem Blatt hat die gleiche Länge. • Die Sätze der Hauptdatei sind unpinned. Æ B*-Baum Grundlagen der Datenbanksysteme II 4 B*-Bäume Definition: Ein B*-Baum ist ein Baum, dessen Knoten aus Blöcken bestehen, mit den folgenden Eigenschaften: • Jeder Blattknoten (außer der Wurzel) enthält zwischen k* und 2k*-1 sortierte Datensätze. Jeder Block ist also mindestens zur Hälfte gefüllt. • Jeder Nichtblattknoten mit Ausnahme der Wurzel enthält zwischen k und 2k-1 Indexeinträge. Der erste Eintrag jedes Knotens hat keinen zugeordneten Schlüssel (dies spart Platz). • Die Wurzel enthält maximal 2k-1 Indexeinträge oder maximal 2k*-1 Datensätze. • Alle Blätter liegen auf gleicher Höhe. Grundlagen der Datenbanksysteme II 5 B*-Bäume Eine Variante des B*-Baum ist es, die Blöcke der Hauptdatei zu den Blättern des Baumes zu machen. Dieser sehr einfache Ansatz ist allerdings nicht der Effizienteste (insbesondere im Platzverbrauch). Æ Ein besserer Ansatz wird beim Betrachten von B*-Bäumen mit pinned Records aufgezeigt. Grundlagen der Datenbanksysteme II 6 B*-Bäume Lookup Gesucht wird ein Satz mit dem Schlüssel v. Die Suche beginnt an der Wurzel des B*-Baumes. Angenommen die Suche ist am Knoten B angekommen, dann ist B entweder • Ein Blatt (dies kann durch Zählen der durchlaufenen Ebenen feststellen), oder • Ein Knoten. Wenn B ein Blatt ist, muß lediglich der Block nach dem Satz durchsucht werden. Ist B hingegen ein Knoten, dann ist B ein Index-Block. Grundlagen der Datenbanksysteme II 7 B*-Bäume Ist B ein Index-Block, wird festgestellt, welcher Indexeintrag den Wert v überdeckt. Anmerkung: Der erste Satz von B hat keinen Schlüssel, er überdeckt alle Werte die kleiner sind als der Schlüsselwert des zweiten Satzes. Erster Satz (ohne Schlüssel) 25 Alle Werte kleiner als 25 144 Alle Werte x mit x ≥ 144 Alle Werte x mit 25 ≤ x < 144 Der Satz, der v überdeckt, enthält einen Zeiger zu einem weiteren Block B’ dieser Block folgt dem Block B auf dem Pfad zu dem gesuchten Satz. Diese Schritte werde wiederholt bis ein Blatt erreicht wird. Grundlagen der Datenbanksysteme II 8 B*-Bäume Modifikation • Wenn der Schlüsselwert geändert wird, Æ Löschen und Einfügen. • Wenn der Schlüsselwert unverändert bleibt, Æ Lookup und Rewrite. Grundlagen der Datenbanksysteme II 9 B*-Bäume Einfügen Es wird ein Satz mit dem Schlüssel v eingefügt. • Lookup (v) Æ Block B. • Wenn in B weniger als 2k*-1 Sätze sind, wird der neue Satz an der richtigen Stelle der Sortierreihenfolge eingefügt (unpinned Records). • Der neue Satz kann niemals der erste in Block B sein, außer wenn B der äußerst linke Block ist. Grundlagen der Datenbanksysteme II 10 B*-Bäume Hauptdatei Daraus folgt, daß es unter keinen Umständen nötig wird, den Schlüsselwert eines Vorfahren von B zu ändern, denn der erste Satz jedes Indexblocks hat keinen Indexwert. Grundlagen der Datenbanksysteme II 11 B*-Bäume • Wenn aber in bereits 2k*-1 Sätze in Block B vorhanden sind (der Block ist also voll), dann • erzeuge einen neuen Block B’, • teile die Sätze von B und den eingefügten Satz auf die zwei Blöcke auf. Jeder Block ist danach mit k* Sätzen gefüllt. B 2k*-1 Sätze +1 Satz = 2k* k* Sätze k* Sätze B B’ Grundlagen der Datenbanksysteme II 12 B*-Bäume Jetzt muß noch der Index auf den neuen Stand gebracht werden: P sei der Vaterknoten von B. Dann wird in den Block P ein Satz für den neuen Block B’ eingefügt, dies geschieht mit dem eben beschriebenen Verfahren nur mit dem Wert k statt k*. P B P B B’ Grundlagen der Datenbanksysteme II 13 B*-Bäume Falls P schon mit 2k-1 Sätzen gefüllt war: Q P P’ k Sätze B B’ Grundlagen der Datenbanksysteme II 14 B*-Bäume Diese Prozeß kann bis in die Wurzel propagiert werden, wobei aber nur Vorfahren von B betroffen sind. Falls der Prozeß die Wurzel erreicht, dann • teile die Wurzel, • Erzeuge eine neue Wurzel mit zwei Kindern. Die neue Wurzel v Die alte Wurzel Anmerkung: Dies ist die einzige Situation in der ein Index-Block weniger als k Sätze haben kann. Grundlagen der Datenbanksysteme II 15 B*-Bäume Löschen Der Satz mit dem Schlüssel v soll gelöscht werden. • Lookup v Æ Block B. • Lösche den Satz in B. Grundlagen der Datenbanksysteme II 16 B*-Bäume 1. Falls nach dem Löschen in B k* oder mehr Sätze übrig sind, ist der Vorgang beendet, es sei denn: • Der gelöschte Satz war der erste Satz in B, dann muß im Vater P von B der Schlüsselwert für B geändert werden. P P 25 36 25 36 42 B 36 42 B Grundlagen der Datenbanksysteme II 17 B*-Bäume • Falls B das erste Kind von P ist, hat P keinen Schlüssel für B. Dann muß ein Vorfahre A von B gefunden werden für den gilt, daß er nicht das erste Kind seines Vaterknotens A’ ist. Dann wird der neue (kleinste) Schlüssel von B in den Satz von A’ eingetragen, der auf A verweist. 36 25 A’ P=A 25 36 42 B Grundlagen der Datenbanksysteme II 18 B*-Bäume 2. Falls nach dem Löschen in B nur noch k*-1 Sätze übrig sind, dann: • Betrachte einen Block B’ der den selben Vaterknoten P hat und der unmittelbar links oder rechts von B liegt. P B’ B B’ Grundlagen der Datenbanksysteme II 19 B*-Bäume • Falls B’ mehr als k* Sätze hat, verteile die Sätze von B und B’ gleichmäßig auf beide Blöcke. Modifiziere den Schlüsselwert von B und/oder B’ und, falls nötig, propagiere die Änderungen zu den Vorfahren von B. B B’ k*-1 > k* B B’ k*1 k*2 k*1 ≥ k* k*2 ≥ k* Grundlagen der Datenbanksysteme II 20 B*-Bäume • Falls B’ nur k* Sätze hat, dann vereinige B mit B’ zu einem Block mit k*-1 + k* = 2k*-1 Sätzen. Lösche den Eintrag des rechten der beiden Blöcke (rekursiver Aufruf der Löschprozedur). P k*-1 ≤ k* B B’ P ≤ 2k*-1 B Grundlagen der Datenbanksysteme II 21 B*-Bäume • Falls nach Anwendung dieses Verfahrens die Wurzel nur noch einen Zeiger enthält, kann die Wurzel wegfallen und das einzige Kind der Wurzel wird zur neuen Wurzel. Wurzel ≤ 2k-1 B’ Neue Wurzel ≤ 2k-1 B’ Anmerkung: Dies ist der einzige Fall in dem die Anzahl der Ebenen des Baumes kleiner wird. Grundlagen der Datenbanksysteme II 22 B*-Bäume Beispiel: Auf dem folgenden, bereits vorhandenen B*-Baum sollen zwei Operationen durchgeführt werden: 1. Einfügen eines Satzes mit Schlüsselwert 32 2. Löschen des Satzes mit dem Schlüsselwert 64 First record, key value omitted Second record B1 B2 1 9 4 B5 – – 9 25 B3 16 B6 – 144 64 25 36 49 B7 Third record 100 64 81 B8 B4 – 196 100 121 – B9 Grundlagen der Datenbanksysteme II – 144 169 – B10 196 225 256 B11 23 B*-Bäume 1. Einfügen von 32 • Zuerst wird ein Pfad von der Wurzel zu dem Block, in den der Wert 32 gehört, gesucht. • B1 : Der Wert 25 überdeckt 32. Wir gehen also weiter zu Block B3. B1 25 144 B3 B2 B4 • B3 : 32 ist kleiner als der Schlüsselwert 64 der zweiten Satzes von B3, daher wird em Zeiger des ersten Satzes zu Block B7 gefolgt. B3 64 B7 100 B8 B9 Grundlagen der Datenbanksysteme II 24 B*-Bäume • B7 : Der Block B7 ist ein Blatt und daher ein Block der Hauptdatei. Der Wert 32 gehört hier zwischen die Werte 25 und 36. B7 25 36 49 32 • Der Block B7 ist allerdings bereits voll, daher wird ein neuer Block B12 angelegt. Die Werte 25 und 32 kommen dann in Block B7 und die Werte 36 und 49 in Block B12. B7 B12 25 32 36 49 Grundlagen der Datenbanksysteme II 25 B*-Bäume • Nun muß ein Satz mit dem ersten Schlüssel von Block B12 in B3 (der Vorfahre von B7) eingefügt werden. Der Block B3 ist aber auch schon voll, daher wird ein weiterer Block (B13) angelegt. Die Sätze mit den Zeigern auf B7 und B12 kommen in Block B3 und die Sätze mit Zeigern auf B8 und B9 kommen in Block B13. B3 B13 36 B7 100 B12 B8 B9 • Jetzt muß ein Satz mit dem Schlüsselwert 64 und einem Zeiger auf B13 in B1 eingefügt werden. Leider bekommt B1 dadurch 4 Sätze. Deshalb wird ein neuer Block B14 angelegt. Die Sätze mit Zeigern auf B2 und B3 kommen in Block B1 und die Sätze mit Zeigern auf B13 und B4 kommen in Block B14. B1 B14 25 B2 144 B3 B13 B4 Grundlagen der Datenbanksysteme II 26 B*-Bäume • Da B1 die Wurzel war und gesplittet wurde, wird jetzt ein neuer Block B15 erzeugt, der zur Wurzel wird und Zeiger auf B1 und B14 hat. Der endgültige Baum sieht dann wie folgt aus: B15 B1 B2 1 4 B5 25 9 – 9 – 16 B6 64 – B14 B3 – – 36 25 32 B7 – – 36 49 B12 144 B13 – 100 64 81 B8 – – – B4 100 121 – B9 Grundlagen der Datenbanksysteme II 196 144 169 – B10 – 196 225 256 B11 27 B*-Bäume 2. Löschen von 64. • Durch suchen (lookup) findet man heraus, daß der Pfad zu dem Block der den Wert 64 enthält wie folgt ist: B15, B14, B13, B8 • Der Wert 64 wird aus dem Block B8 gelöscht. B8 64 81 B8 81 • Da es der erste Satz in dem Block war, muß auch der neue Schlüsselwert (81) in der Hierarchie nach oben propagiert werden. • Da B8 das links-außen liegende Kind von B13 ist, wird B13 nicht geändert, das gleiche gilt für B14 da für B14 der Block B13 das links-außen liegende Kind ist. Grundlagen der Datenbanksysteme II 28 B*-Bäume • B14 ist allerdings nicht links-außen in B15 verankert, daher muß ein Schlüsselwert von B15 geändert werden. B15 B15 64 B1 81 B14 B1 B14 • Durch das löschen von 64 in Block B8 hat dieser nur noch einen einzigen Satz. Dies widerspricht der Vorschrift, daß jeder Block mindestens k, also in diesem Fall 2, Sätze haben muß. Da B8 keinen linken Geschwister hat, wird sein rechter Geschwister B9 überprüft. B9 hat zwei Sätze, B8 und B9 können also zusammengefaßt werden. B8 81 B9 100 121 B8 81 100 121 Grundlagen der Datenbanksysteme II 29 B*-Bäume • B13 hat jetzt nur noch das eine Kind B8. B13 wird deshalb mit B4 zusammengefaßt: B13 B4 B13 196 B8 B10 B11 144 B8 196 B10 B11 • Jetzt hat auch B14 nur noch ein Kind und wird mit B1 zusammengefaßt: B1 B14 B14 25 B2 25 B3 B13 B2 Grundlagen der Datenbanksysteme II 81 B3 B13 30 B*-Bäume • Block B15 hat jetzt nur noch ein Kind und, da er die Wurzel ist, wird er gelöscht. B14 wird zur neuen Wurzel: B14 B2 1 9 4 B5 – – 9 16 B6 – 25 81 B3 36 – 25 32 – 36 49 B7 B13 B12 – 144 81 100 121 B8 Grundlagen der Datenbanksysteme II 196 144 169 – B10 196 225 256 B11 31 B*-Bäume Leerer B*-Baum: k = k* = 2 Einfügen der Werte 2, 5, 8, 9, 3, 11, 50 ⇓ Aufbauen des B*-Baumes. Ändern des Schlüsselwertes 50 nach 7. 50 Æ 7 Grundlagen der Datenbanksysteme II 32 B*-Bäume LAUFZEITANALYSE FÜR OPERATIONEN AUF B*-BÄUMEN Annahme: gegeben ist eine Datei mit n Sätzen, die in einem B*-Baum mit den Parametern k und k * organisiert ist. • Der Baum wird nicht mehr als n k * Blätter haben. • Der Baum wird nicht mehr als n k ⋅ k * Eltern von Blättern haben. • Des weiteren kann er nicht mehr als n k2 ⋅k * Eltern von Eltern von Blättern haben. • und so weiter ... Grundlagen der Datenbanksysteme II 33 B*-Bäume Wenn ein Pfad von der Wurzel zu den Blätter i Knoten hat, dann gilt: n ≥ k i −1 ⋅ k * Es folgt hieraus: i ≤ 1 + log k ( n k *) Für eine Datei mit n Sätzen in einem B*-Baum mit den Parametern k und k* folgt daher: Für einen lookup benötigt man i ≤ 1 + log k (n k *) Zugriffe, für alle anderen Operationen 2 + log k (n k *) Zugriffe. Grundlagen der Datenbanksysteme II 34 B*-Bäume Beispiel: n = 1000 . .000 k* = 5 k = 50 ⇓ 2 + log50 (200.000) ≤ 6 Für eine hashed Datei wären es ≅ 3 Zugriffe gewesen. Der B*-Baum ist also besser als eine Ein-Level Index Struktur. Der Vorteil gegenüber Hashing ist, daß die Datei immer sortiert vorliegt. Grundlagen der Datenbanksysteme II 35 B*-Bäume DATEIEN MIT EINEM DENSE INDEX Wenn die Hauptdatei nicht sortiert vorliegen muß, dann • kann man teilgefüllte Blöcke in der Hauptdatei vermeiden. • kann man eine einfache Einfüge-Strategie anwenden: immer am Ende einfügen. Für die dann beim Löschen auftretenden „Löcher“ in der Hauptdatei kann man zwei Strategien wählen: • Man ignoriert die Tatsache und lebt mit den Löchern, oder Grundlagen der Datenbanksysteme II 36 B*-Bäume • Man hält eine separate Datei mit Zeigern auf die Blöcke mit leeren Subblöcken, oder sogar direkt auf die leeren Subblöcke: Dadurch werden aber keine Blockzugriffe eingespart, es wird nur der freie Platz besser verwaltet. Grundlagen der Datenbanksysteme II 37 B*-Bäume Wenn die Hauptdatei unsortiert vorliegt, • wie findet man einen Satz? Æ Dense Index Ein Dense Index ist eine Datei mit einem Satz der Form (v,p) für jeden Schlüsselwert v in der Hauptdatei. Ein Dense Index kann bei den bisher besprochenen Verfahren anstelle der Hauptdatei verwendet werden. Der Dense Index kann also als • Hash-Datei • Index • B*-Baum organisiert sein. Grundlagen der Datenbanksysteme II 38 B*-Bäume Suchen (Lookup) V0 V0 V1 V1 V2 V3 V3 V4 V2 V5 V4 • Bestimmen des Blockes der Hauptdatei. • Lesen des Blocks. • evtl. Ändern/Zurückschreiben des Blocks. Modifikation Grundlagen der Datenbanksysteme II V5 39 B*-Bäume Löschen • Löschen des Blockeintrages. • Zurückschreiben des Blocks. • Löschen des Indexeintrags. Grundlagen der Datenbanksysteme II 40 B*-Bäume Einfügen • Einfügen eines Satzes am Ende der Hauptdatei (evtl. In einem neuen Block). • Einfügen eines entsprechenden Eintrags im Index. Anmerkung: Durch die zusätzlichen Zugriffe auf die Hauptdatei werden immer 2 Zugriffe mehr benötigt als wenn die Organisation des Dense Index direkt auf die Hauptdatei angewendet würde. Grundlagen der Datenbanksysteme II 41 B*-Bäume Wozu Dense Index? Wenn jede Operation über den Dense Index grundsätzlich 2 Zugriffe mehr benötigt als ohne Dense Index, muß der Einsatz eines Dense Index begründet werden. Dense Index Hauptdatei Grundlagen der Datenbanksysteme II 42 B*-Bäume Gründe für einen Dense Index: 1. Die Sätze in der Hauptdatei sind evtl. pinned, Die Sätze im Dense Index hingegen nicht. Æ Es kann eine einfachere oder effizientere Organisationsform für den Dense Index gewählt werden. Grundlagen der Datenbanksysteme II 43 B*-Bäume Dense Index Hauptdatei unpinned Records sortiert pinned Records unsortiert Grundlagen der Datenbanksysteme II 44 B*-Bäume B*-Baum Grundlagen der Datenbanksysteme II 45 B*-Bäume Hash Grundlagen der Datenbanksysteme II 46 B*-Bäume Sparse Index Grundlagen der Datenbanksysteme II 47 B*-Bäume 2. Falls die Sätze der Hauptdatei sehr groß sind, wird die Anzahl der Blocks, die für einen Dense Index benötigt werden, viel kleiner sein, als wenn ein Sparse Index oder ein B*-Baum auf der Hauptdatei anwendet würde. Gleiches gilt für einen Zugriff per Hashing, auch hier kann die durchschnittliche Anzahl der Blocks pro Bucket geringer ausfallen, wenn über den Dense Index statt über der Hauptdatei gehashed wird. n Blocks B*-Baum oder Sparse Index über der Hauptdatei m Blocks n≤m Grundlagen der Datenbanksysteme II 48 B*-Bäume B*-Baum vs. Dense Index mit B*-Baum Hauptdatei Dense Index Hauptdatei +2: Block lesen; Block schreiben. Beispiel: Hauptdatei mit B*-Baum mit n = 1.000.000 Sätzen k* = 5 k = 50 Grundlagen der Datenbanksysteme II 49 B*-Bäume B*-Baum über der Hauptdatei: 2 + log k ( n / k *) = 2 + log50 (200.000) ≤ 6 B*-Baum über Dense Index: • Größe der Dense Index Record = Größe der Knoten des B*Baumes. Æ k* = 50 2 + log k (n / k *) = . .000⎞ ⎛ 1000 2 + log 50 ⎜ ⎟ ≤5 ⎝ 50 ⎠ Es müssen hierzu noch die 2 Zusätzlichen Zugriffe auf die Hauptdatei hinzugezählt werden: 2+5 = 7 Æ Es werden mehr Zugriffe benötigt als für einen B*-Baum über der Hauptdatei. Aber ... Grundlagen der Datenbanksysteme II 50 B*-Bäume Kompensations Faktoren Es gibt zwei Faktoren die den Nachteil der zusätzlichen Zugriffe kompensieren: 1. Platzersparnis Die Blöcke der Hauptdatei können jetzt immer dicht gepackt werden. In einer B*-Baum Organisation wären sie dagegen zwischen halb und ganz gefüllt. Platzersparnis 25% bei der Hauptdatei. Der Platz der für die Blätter des B*-Baumes beim Dense Index benötigt wird ist ca. 10% des Platzes der Hauptdatei. Die reale Ersparnis beträgt also ca. 25% - 10% = 15% Grundlagen der Datenbanksysteme II 51 B*-Bäume 2. Falls die Sätze der Hauptdatei pinned down sind, kann die Organisationsform B*-Baum nicht benutzt werden. Dies kann durch benutzen eines Dense Index gelöst werden. Dense Index unpinned Hauptdatei pinned Grundlagen der Datenbanksysteme II 52 B*-Bäume Methoden zum Unpinning von Sätzen Eine andere Verwendung des Dense Index ist es, die Sätze der Hauptdatei unpinned zu machen. P i Dense Index 1:1 r Hauptdatei ( - ) Es muß 2 Zeigern zum Satz r gefolgt werden. ( + ) Sätze der Hauptdatei sind nicht pinned. ( - ) Sätze des Dense Index sind pinned. ( + ) Beim Verschieben eines Satzes in der Hauptdatei muß nur ein Zeiger verändert werden. Grundlagen der Datenbanksysteme II 53 B*-Bäume Alternative Methoden zum Unpinnen von Sätzen • Kein Dense Index für die Hauptdatei, sondern Zeiger in jedem Blockheader auf die Sätze in dem Block. r Header Block Alle Zeiger auf den Satz r zeigen nun auf den Block, der r enthält. • Sätze können nicht zwischen Blocks ausgetauscht werden. • Sätze sind innerhalb eines Blocks unpinned und daher frei beweglich. Grundlagen der Datenbanksysteme II 54 B*-Bäume Kosten des Verfahrens: • Der Platz, der für die Zeiger im Blockheader verbraucht wird. • Die Zeit, die benötigt wird dem zusätzlichen Zeiger innerhalb des Blocks zu folgen ist nicht relevant, da kein weiterer Blockzugriff erforderlich wird. • System R benutzt dieses Verfahren für Sätze mit variabler Länge. • Eine Generalisierung des Verfahrens ist es auf das Bucket eines Satzes zu zeigen statt auf den Satz direkt. (Hashing) Grundlagen der Datenbanksysteme II 55 B*-Bäume Eine weitere Möglichkeit ist es, • die Schlüsselwerte anstelle von Zeigern als Referenz zu benutzen. v r Dense Index v IBM nutzt dieses Verfahren bei der IMS-Datenbank. ( + ) Dense Index und Haupdatei sind unpinned. ( - ) Um einer Referenz zu folgen muß nach dem Schlüsselwert gesucht werden. Grundlagen der Datenbanksysteme II