Kapitel 5
							
								
								
									
										
											BIN
										
									
								
								Assets/DBimpl-Baumverfahren.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 36 KiB | 
							
								
								
									
										
											BIN
										
									
								
								Assets/DBimpl-LSM-baum.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 48 KiB | 
							
								
								
									
										
											BIN
										
									
								
								Assets/DBimpl-b+-baum-blattebenen.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 68 KiB | 
							
								
								
									
										
											BIN
										
									
								
								Assets/DBimpl-b+-baum-traversieren.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 71 KiB | 
							
								
								
									
										
											BIN
										
									
								
								Assets/DBimpl-b-baum-beispiel-2.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 87 KiB | 
							
								
								
									
										
											BIN
										
									
								
								Assets/DBimpl-b-baum-beispiel-3.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 60 KiB | 
							
								
								
									
										
											BIN
										
									
								
								Assets/DBimpl-b-baum-beispiel.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 51 KiB | 
							
								
								
									
										
											BIN
										
									
								
								Assets/DBimpl-b-baum-lookup.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 55 KiB | 
							
								
								
									
										
											BIN
										
									
								
								Assets/DBimpl-csb-baum.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 8.7 KiB | 
							
								
								
									
										
											BIN
										
									
								
								Assets/DBimpl-präfix-b-baum.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 30 KiB | 
							
								
								
									
										
											BIN
										
									
								
								Assets/Dbimpl-b+-baum-aufbau.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 40 KiB | 
							
								
								
									
										
											BIN
										
									
								
								Assets/Dbimpl-mehr-attribut-b-baum.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 33 KiB | 
| @ -672,13 +672,13 @@ Gängige Strategien | ||||
|  | ||||
| 
 | ||||
| Klassifikation gängiger Strategien | ||||
| | Verfahren  | Prinzip | Alter | Anzahl | | ||||
| | --- | --- | --- | | ||||
| FIFO | älteste Seite ersetzt | G  |- | ||||
| LFU (least fre-quently used) | Seite mit geringster Häufigkeit ersetzen | - | G | ||||
| LRU (least recently used) | Seite ersetzen, die am längsten nicht referenziert wurde (System R) | J | J | ||||
| DGCLOCK (dyn. generalized clock) | Protokollierung der Ersetzungshäufigkeiten wichtiger Seiten | G | JG | ||||
| LRD (least reference density) | Ersetzung der Seite mit geringster Referenzdichte | JG | G | ||||
| | Verfahren                        | Prinzip                                                             | Alter | Anzahl | | ||||
| | -------------------------------- | ------------------------------------------------------------------- | ----- | | ||||
| | FIFO                             | älteste Seite ersetzt                                               | G     | -      | | ||||
| | LFU (least fre-quently used)     | Seite mit geringster Häufigkeit ersetzen                            | -     | G      | | ||||
| | LRU (least recently used)        | Seite ersetzen, die am längsten nicht referenziert wurde (System R) | J     | J      | | ||||
| | DGCLOCK (dyn. generalized clock) | Protokollierung der Ersetzungshäufigkeiten wichtiger Seiten         | G     | JG     | | ||||
| | LRD (least reference density)    | Ersetzung der Seite mit geringster Referenzdichte                   | JG    | G      | | ||||
| 
 | ||||
| Beispiel | ||||
| - Folge von Seitenanforderungen #1, #2 ... | ||||
| @ -878,11 +878,11 @@ Statische Verfahren: Überblick | ||||
| Organisation | ||||
| - völlig unsortiert speichern | ||||
| - physische Reihenfolge der Datensätze ist zeitliche Reihenfolge der Aufnahme von Datensätzen | ||||
|     | | | | | | ||||
|     | --- | --- | --- | --- | --- | ||||
|     8832 | Max | Mustermann | ... | 9.1.2003 | ||||
|     5588 | Beta | Alpha | ... | 7.3.1978 | ||||
|     4711 | Gamma | Delta | ... | 2.5.1945  | ||||
|     |      |       |            |     | | ||||
|     | ---- | ----- | ---------- | --- | -------- | | ||||
|     | 8832 | Max   | Mustermann | ... | 9.1.2003 | | ||||
|     | 5588 | Beta  | Alpha      | ... | 7.3.1978 | | ||||
|     | 4711 | Gamma | Delta      | ... | 2.5.1945 | | ||||
| 
 | ||||
| Operationen | ||||
| - insert: Zugriff auf letzte Seite der Datei. Genügend freier Platz => Satz anhängen. Sonst nächste freie Seite holen | ||||
| @ -894,11 +894,11 @@ Operationen | ||||
| 
 | ||||
| ### Sequenzielle Speicherung | ||||
| - sortiertes Speichern der Datensätze | ||||
|     | | | | | | ||||
|     | --- | --- | --- | --- | --- | ||||
|     4711 | Gamma | Delta | ... | 2.5.1945  | ||||
|     5588 | Beta | Alpha | ... | 7.3.1978 | ||||
|     8832 | Max | Mustermann | ... | 9.1.2003 | ||||
|     |      |       |            |     | | ||||
|     | ---- | ----- | ---------- | --- | -------- | | ||||
|     | 4711 | Gamma | Delta      | ... | 2.5.1945 | | ||||
|     | 5588 | Beta  | Alpha      | ... | 7.3.1978 | | ||||
|     | 8832 | Max   | Mustermann | ... | 9.1.2003 | | ||||
| 
 | ||||
| Sequenzielle Datei: Operationen | ||||
| - insert: Seite suchen, Datensatz einsortieren => beim Anlegen oder sequenziellen Füllen einer Datei jede Seite nur bis zu gewissem Grad (etwa 66%) füllen | ||||
| @ -980,4 +980,278 @@ Probleme statischer Verfahren | ||||
|     - Erweiterung von Hashverfahren um Anpassung des Bildbereichs = dynamische Hashverfahren | ||||
|     - Behandlung von zusammengesetzten Schlüsseln = multidimensionale Zugriffsverfahren, z.B. multidimensionale Bäume oder raumfüllende Kurven | ||||
| 
 | ||||
| # Baumbasierte Indexstrukturen | ||||
| # Baumbasierte Indexstrukturen | ||||
| ## Baumverfahren | ||||
| - Stufenanzahl dynamisch verändern | ||||
| - wichtigste Baumverfahren: B-Bäume und ihre Varianten | ||||
| - B-Baum-Varianten sind noch "allgegenwärtiger" in heutigen Datenbanksystemen als SQL | ||||
| - SQL nur in der relationalen und objektrelationalen Datenbanktechnologie verbreitet; B-Bäume überall als Grundtechnik eingesetzt | ||||
| 
 | ||||
| Baumverfahren: Überblick | ||||
|  | ||||
| 
 | ||||
| ## B-Bäume | ||||
| - Ausgangspunkt: ausgeglichener, balancierter Suchbaum | ||||
| - Ausgeglichen oder balanciert: alle Pfade von der Wurzel zu den Blättern des Baumes gleich lang | ||||
| - Hauptspeicher-Implementierungsstruktur: binäre Suchbäume, beispielsweise AVL-Bäume von Adelson-Velskii und Landis | ||||
| - Datenbankbereich: Knoten der Suchbäume zugeschnitten auf Seitenstruktur des Datenbanksystems | ||||
| - mehrere Zugriffsattributwerte auf einer Seite | ||||
| - Mehrwegebäume | ||||
| 
 | ||||
| Prinzip des B-Baumes | ||||
| - B-Baum von Bayer (B für balanciert, breit, buschig, Bayer, NICHT: binär) | ||||
| - dynamischer, balancierter Indexbaum, bei dem jeder Indexeintrag auf eine Seite der Hauptdatei zeigt | ||||
| - Mehrwegebaum völlig ausgeglichen, wenn | ||||
|   1. alle Wege von Wurzel bis zu Blättern gleich lang | ||||
|   2. jeder Knoten gleich viele Indexeinträge | ||||
| - vollständiges Ausgleichen zu teuer, deshalb B-Baum-Kriterium: | ||||
|     Jede Seite außer der Wurzelseite enthält zwischen $m$ und $2m$ Einträge. | ||||
| 
 | ||||
| Definition B-Baum | ||||
| - Ordnung eines B-Baumes ist minimale Anzahl der Einträge auf den Indexseiten außer der Wurzelseite | ||||
| - Bsp.: B-Baum der Ordnung 8 fasst auf jeder inneren Indexseite zwischen 8 und 16 Einträgen | ||||
| - Def.: Ein Indexbaum ist ein B-Baum der Ordnung $m$ , wenn er die folgenden Eigenschaften erfüllt: | ||||
|     1. Jede Seite enthält höchstens $2m$ Elemente. | ||||
|     2. Jede Seite, außer der Wurzelseite, enthält mindestens $m$ Elemente.  | ||||
|     3. Jede Seite ist entweder eine Blattseite ohne Nachfolger oder hat $i+1$ Nachfolger, falls $i$ die Anzahl ihrer Elemente ist. | ||||
|     4. Alle Blattseiten liegen auf der gleichen Stufe. | ||||
| 
 | ||||
| Eigenschaften des B-Baumes | ||||
| - $n$ Datensätze in der Hauptdatei => in $log_m(n)$ Seitenzugriffen von der Wurzel zum Blatt | ||||
| - Durch Balancierungskriterium wird Eigenschaft nahe an der vollständigen Ausgeglichenheit erreicht (1. Kriterium vollständig erfüllt, 2. Kriterium näherungsweise) | ||||
| - Kriterium garantiert 50% Speicherplatzausnutzung | ||||
| - einfache, schnelle Algorithmen zum Suchen, Einfügen und Löschen von Datensätzen (Komplexität von $O(log_m(n))$) | ||||
| 
 | ||||
| Suchen in B-Bäumen | ||||
| - lookup wie in statischen Indexverfahren | ||||
| - Startend auf Wurzelseite Eintrag im B-Baum ermitteln, der den gesuchten Zugriffsattributwert $w$ überdeckt => Zeiger verfolgen, Seite nächster Stufe laden | ||||
| - Suchen: 38, 20, 6 | ||||
| -  | ||||
| 
 | ||||
| Einfügen in B-Bäumen | ||||
| - Einfügen eines Wertes _w_ | ||||
|     - mit lookup entsprechende Blattseite suchen | ||||
|     - passende Seite $n<2m$ Elemente, _w_ einsortieren | ||||
|     - passende Seite $n=2m$ Elemente, neue Seite erzeugen, | ||||
|        - ersten _m_ Werte auf Originalseite | ||||
|        - letzten _m_ Werte auf neue Seite | ||||
|        - mittleres Element auf entsprechende Indexseite nach oben | ||||
|     - eventuell dieser Prozess rekursiv bis zur Wurzel | ||||
| 
 | ||||
| Einfügen in einen B-Baum: Beispiel | ||||
|  | ||||
|  | ||||
| 
 | ||||
| Löschen in B-Bäumen | ||||
| - bei weniger als $m$ Elementen auf Seite: Unterlauf | ||||
| - Löschen eines Wertes $w$ : Bsp.: 24; 28, 38, 35 | ||||
|     - mit lookup entsprechende Seite suchen | ||||
|     - $w$ auf Blattseite gespeichert => Wert löschen, eventuell Unterlauf behandeln | ||||
|     - $w$ nicht auf Blattseite gespeichert => Wert löschen, durch lexikographisch nächstkleineres Element von einer Blattseite ersetzen, eventuell auf Blattseite => Unterlauf | ||||
| - Unterlaufbehandlung | ||||
|     - Ausgleichen mit der benachbarten Seite (benachbarte Seite $n$ Elemente mit $n>m$) | ||||
|     - oder Zusammenlegen zweier Seiten zu einer (Nachbarseite $n=m$ Elemente), das "mittlere" Element von Indexseite darüber dazu, auf Indexseite eventuell => Unterlauf | ||||
| - Einfügen des Elementes 22; Löschen von 22 | ||||
|      | ||||
| 
 | ||||
| Komplexität der Operationen | ||||
| - Aufwand beim Einfügen, Suchen und Löschen im B-Baum immer $O(log_m(n))$ Operationen | ||||
| - entspricht genau der "Höhe" des Baumes | ||||
| - Konkret: Seiten der Größe 4 KB, Zugriffsattributwert 32 Bytes, 8-Byte-Zeiger: zwischen 50 und 100 Indexeinträge pro Seite; Ordnung dieses B-Baumes 50 | ||||
| - 1.000.000 Datensätze: $log_{50}(1000000) = 4$ Seitenzugriffe im schlechtesten Fall | ||||
| - Wurzelseite jedes B-Baumes normalerweise im Puffer: 3 Seitenzugriffe | ||||
| 
 | ||||
| ## B+-Baum | ||||
| Varianten | ||||
| - B+-Bäume: nur Blattebene enthält Daten -> Baum ist hohl | ||||
| - B∗-Bäume: Aufteilen von Seiten vermeiden durch "Shuffle" | ||||
| - Präfix-B-Bäume: Zeichenketten als Zugriffsattributwerte, nur Präfix indexieren | ||||
| 
 | ||||
| B+-Baum: Motivation | ||||
| - B-Baum: Wie/wo werden Nicht-Schlüsseldaten (Tupel, TIDs) gespeichert? | ||||
|        - Zusammen mit Schlüsseln in allen Knoten? | ||||
|        - Problem beim Traversieren des Baumes, z.B. bei Bereichsanfragen | ||||
|      | ||||
| 
 | ||||
| B+-Baum | ||||
| - in der Praxis am häufigsten eingesetzte Variante des B-Baumes: | ||||
|        - effizientere Änderungsoperationen, insb. Löschen | ||||
|        - Verringerung der Baumhöhe | ||||
| - Änderungen gegenüber B-Baum | ||||
|     - in inneren Knoten nur noch Zugriffsattributwert und Zeiger auf nachfolgenden Seite der nächsten Stufe; nur Blattknoten enthalten neben Zugriffsattributwert die Daten (Datensätze bzw. Verweise auf Datensätze in der Hauptdatei) | ||||
|     - Knoten der Blattebene sind untereinander verkettet für effiziente Unterstützung von Bereichsanfragen | ||||
| 
 | ||||
| B+-Baum: Aufbau | ||||
|  | ||||
| 
 | ||||
| Ordnung; Operationen | ||||
| - Ordnung für B+-Baum: $(x,y), x$ Mindestbelegung der Indexseiten, $y$ Mindestbelegung der Blattseiten | ||||
| - delete gegenüber B-Baum effizienter ("Ausleihen" eines Elementes von der Blattseite entfällt) | ||||
| - Zugriffsattributwerte in inneren Knoten können sogar stehenbleiben | ||||
| - häufig als Primärindex eingesetzt | ||||
| - B+-Baum ist dynamische, mehrstufige, indexsequenziellen Datei | ||||
| 
 | ||||
| B+-Baum: Blattebene mit Verweisen | ||||
|  | ||||
| 
 | ||||
| B+-Baum: Datenstrukturen | ||||
| ```cpp | ||||
| BPlusBranchNode =record of | ||||
|     nkeys: int; | ||||
|     ptrs: array[0 .. nkeys ] of PageNum; | ||||
|     keys: array[1 .. nkeys ]of KeyType; | ||||
|     level: int; | ||||
| /* Level= 1 zeigt an, dass die ptrs auf Blätter zeigen */ | ||||
| end; | ||||
| ``` | ||||
| ```cpp | ||||
| BPlusLeafNode = record of | ||||
|     nkeys: int; | ||||
|     keys: array[1 .. nkeys ]of KeyType; | ||||
|     payload: array[1 .. nkeys ]of LoadType ; /* Daten bzw. TIDs */ | ||||
|     nextleaf: PageNum; | ||||
| end; | ||||
| ``` | ||||
| 
 | ||||
| Operationen im B+-Baum | ||||
| - lookup: wie im B-Baum jedoch immer bis zur Blattebene | ||||
| - $search(u,o)$: Lookup für unteren Wert $u$ , Traversieren auf der Blattebene bis zum oberen Wert $o$ | ||||
| - $insert$: ähnlich zum B-Baum | ||||
|     - im Fall des Split bei Überlaufbehandlung wird nur ein Separatorschlüssel im Elternknoten eingefügt | ||||
|     - z.B. Kopie des kleinsten Schlüsselwertes des "rechten" Kindknotens oder geeigneter Wert zwischen beiden Knoten | ||||
| - $delete$: ähnlich zum B-Baum, jedoch | ||||
|     - Löschen der Daten zunächst nur auf Blattebene | ||||
|     - bei Unterlauf: entweder Ausgleich mit Nachbarknoten oder Vereinigen mit Nachbarknoten; ggf. Anpassen (Ausgleich) oder Löschen (Vereinigen) des Separatorschlüssels | ||||
|     - alternativ: Unterlauf akzeptieren und durch spätere inserts oder Reorganisation auflösen | ||||
| 
 | ||||
| Weitere Entwurfsentscheidungen für B+-Baum | ||||
| - Schlüsselsuche im Knoten: sequenzielle Suche vs. binäre Suche vs. Interpolation Search | ||||
| - Knotengröße: Maximieren der Anzahl der Vergleiche (Knotennutzen) pro I/O-Zeiteinheit | ||||
| 
 | ||||
| | Seitengröße (KB) | Sätze/Seite | Knotennutzen | I/O-Zeit (ms) | Nutzen/Zeit | | ||||
| | ---------------- | ----------- | ------------ | ------------- | ----------- | | ||||
| | 4                | 143         | ≈7           | 5,020         | 1,427       | | ||||
| | 16               | 573         | ≈ 9          | 5,080         | 1,804       | | ||||
| | 64               | 2.294       | ≈ 11         | 5,320         | 2,098       | | ||||
| | 128              | 4.588       | ≈ 12         | 5,640         | 2,157       | | ||||
| | 256              | 9.175       | ≈ 13         | 6,280         | 2,096       | | ||||
| | 1024             | 36.700      | ≈ 15         | 10,120        | 1,498       | | ||||
| | 4096             | 146.801     | ≈ 17         | 25,480        | 0,674       | | ||||
| [Literatur](G. Graefe: Modern B-Tree Techniques, Foundations and Trends in Databases, 2010) | ||||
| 
 | ||||
| - Konsistenzprüfung während der Traversierung | ||||
|     - mögliche Inkonsistenzen durch Speicherfehler, konkurrierende Änderungen + Implementierungsfehler, ... | ||||
| - Cache-Optimierung: Knotenstruktur, Kompression (Präfix-/Suffix Truncation) | ||||
| - Pointer Swizzling: zur Ersetzung der logischen Seitennummern durch physische Adressen | ||||
| - Knotengröße: bei großen Puffern kann großer Teil der inneren Knoten im Puffer gehalten werden -> größere Knoten (im MB-Bereich) sinnvoll | ||||
| - Verzögern des Splits bei Überlaufbehandlung: Ausgleichen mit Nachbarknoten soweit möglich; verbessert Auslastung der Knoten | ||||
| - zusätzliche Verweise zwischen Knoten | ||||
|     - z.B. zwischen inneren Knoten der gleichen Ebene, zu Elternknoten, etc. | ||||
|     - ermöglichen Konsistenzchecks, aber erschweren Sperren für Nebenläufigkeitskontrolle | ||||
| 
 | ||||
| ## Weitere Varianten | ||||
| Präfix-B-Baum | ||||
| - B-Baum über Zeichenkettenattribut | ||||
|     - lange Schlüssel in inneren Knoten -> hoher Speicherplatzbedarf | ||||
|     - vollständige Schlüssel eigentlich nicht notwendig, da nur "Wegweiser" | ||||
| - Idee: Verwaltung von Trennwerten -> Präfix-B-Baum | ||||
|     - in inneren Knoten nur Trennwerte, die lexikographisch zwischen den Werten liegen | ||||
|     - möglichst kurze Trennwerte, z.B. kürzester eindeutiger Präfix | ||||
|      | ||||
|     - aber: Beispiel "Vandenberg" und "Vandenbergh" | ||||
| 
 | ||||
| Mehr-Attribut-B-Baum | ||||
| - B-Baum ist eindimensionale Struktur, jedoch können mehrere Attribute als kompositer Schlüssel indexiert werden | ||||
|   `create index NameIdx on KUNDE(Name, Vorname)` | ||||
| - allerdings: Attribute werden bei partial-match-Anfragen nicht gleich behandelt! | ||||
| - Alternative: raumfüllende Kurven -> multidimensionale Indexstrukturen | ||||
|      | ||||
|      | ||||
| ## Optimierungen für moderne Hardware | ||||
| Optimierungspotential | ||||
| - Verbesserung der Cache-Trefferrate | ||||
|     - Organisation der Datenstruktur entsprechend Cacheline (Größe, Anordnung der Daten) | ||||
|     - In-Place-Update im Hauptspeicher -> Cache-Invalidierung: verändertes Update Handling | ||||
|     - Pointer Swizzling | ||||
| - Berücksichtigung der Storage-Eigenschaften | ||||
|     - SSD vs. HDD | ||||
|     - Bevorzugung sequentieller Schreiboperationen | ||||
|     - spezielle Berücksichtigung für Main-Memory-Indexe | ||||
| - Synchronisation in Multicore-Umgebungen | ||||
|     - Lock/Latch-freie Operationen | ||||
| 
 | ||||
| 
 | ||||
| CSB+-Baum | ||||
| - =Cache Sensitive B+ Tree (Rao, Ross: Making B+-Trees Cache Conscious in Main Memory, SIGMOD 2000) | ||||
| - "Cache-Freundlichkeit" durch | ||||
|     1. Platzsparen im Knoten -> mehr relevante Daten im Cache | ||||
|     2. Eliminieren von Zeigern für 1. und Reduzierung von Zeigerarithmetik | ||||
| - Ansatz: veränderte Struktur der inneren Knoten | ||||
|     - Zeiger auf ersten Kindknoten | ||||
|     - alle Kindknoten eines Knotens sind in einem zusammenhängenden Speicherbereich (Knotengruppe) allokiert und werden über einenOffsetadressiert | ||||
|      | ||||
| 
 | ||||
| Bw-Baum | ||||
| - = Buzzword Tree (Levandoski, Lomet, Sengupta: The Bw-Tree: A B-tree for New Hardware Platforms, ICDE 2013) | ||||
| - Ziele: Cache-Freundlichkeit, Multicore-CPUs, Flash-Speichereigenschaften | ||||
| - Techniken | ||||
|     - überwiegend Latch-freie Operationen, stattdessen atomare CAS-Instruktionen | ||||
|     - spezifische Struktur-Modifikationsoperationen: Folge von atomaren Modifikationen, Blink-ähnliche Struktur | ||||
|     - Delta-Updates und Log Structured Storage (LSS) | ||||
|         - Änderungen an Seiten/Knoten werden nicht direkt ausgeführt, sondern in Delta-Records pro Knoten erfasst | ||||
|         - keine Synchronisation für Zugriff auf Seiten notwendig | ||||
|         - Seite kann auch nach Änderung im Cache verbleiben | ||||
|         - Seiten + Delta Records werden periodisch konsolidiert | ||||
|         - Log Structured Storage -> später! | ||||
|     - Mapping-Tabelle: logische Seitennummern in | ||||
|       - (a) Offset im Flash-Speicher | ||||
|       - (b) Zeiger im Hauptspeicher | ||||
| 
 | ||||
| ## LSM-Baum | ||||
| - = Log Structured Merge Tree (O’Neil, Cheng, Gawlick, O’Neil: The log-structured merge-tree (LSM-tree). Acta Informatica. 33 (4): 351-385, 1996) | ||||
| - Ziel: höherer Schreibdurchsatz durch Eliminierung verstreuter In-Place-Updates | ||||
| - Einsatz in diversen NoSQL-Systemen: HBase, Cassandra, BigTable, LevelDB, RocksDB, ... | ||||
| - Grundidee | ||||
|     - Batches von Schreiboperationen werden sequentiell in Indexdateien gespeichert, d.h. Sortieren vor Schreiben auf Externspeicher (Log Structured) | ||||
|     - Neue Updates werden in neuen Indexdateien gespeichert | ||||
|     - Indexdateien werden periodisch zusammengefügt (Merge) | ||||
|     - Leseoperationen müssen alle Indexdateien konsultieren | ||||
|  | ||||
| 
 | ||||
| LSM-Baum: Realisierung | ||||
| - Main-Memory-Baum $C_0$ als Puffer, sortiert nach Schlüsseln, z.B. als AVL- oder RB-Baum | ||||
|   - bei Erreichen eines gegebenen Füllgrads -> Herausschreiben auf Disk (siehe unten) | ||||
|   - ergänzt um Write Ahead Logging auf Disk für Wiederherstellung nach Systemfehler | ||||
| - mehrere Append-only, disk-basierte Indexe $C_1, C_2,...,$ ebenfalls sortiert nach Schlüssel (z.B. als B-Baum) | ||||
|   - effiziente Unterstützung von Scans (Schlüsselsuche) | ||||
|   - Merge in einem Schritt | ||||
| - Aktualität der Indexe: $C_0,C_1,...,C_n$ | ||||
| 
 | ||||
| LSM-Baum: Verdichtung | ||||
| - wenn bestimmte Anzahl von Dateien erzeugt wurden (z.B. 5 Dateien je 100 Datensätze), werden diese in eine Datei gemischt (1 Datei mit 500 Sätzen) | ||||
| - sobald 5 Dateien mit 500 Sätzen vorliegen, dann Mischen in eine Datei | ||||
| - usw. | ||||
| - Nachteil: große Anzahl von Dateien, die alle durchsucht werden müssen | ||||
| 
 | ||||
| LSM-Baum: Ebenenweise Verdichtung | ||||
| 1. pro Ebene wird eine bestimmte Zahl von Dateien verwaltet, partitioniert nach Schlüsseln (keine Überlappung der Schlüssel) -> Suche nur in einer Datei notwendig | ||||
| 2. Ausnahme: erste Ebene (Überlappung erlaubt) | ||||
| 3. Mischen der Dateien jeweils in die nächsthöhere Ebene: Auswahl einer Datei und Aufteilen der Sätze -> Platz für neue Daten schaffen | ||||
| 
 | ||||
| LSM-Baum: Lesezugriffe | ||||
| - grundsätzlich: Verbesserung der Schreibperformance zulasten der Leseperformance | ||||
|   - Suche in allen Indexen $C_0,C_1,...,C_n$ notwendig | ||||
| - Vermeiden unnötiger Lesevorgänge durch Bloom-Filter pro Index oder pro Run | ||||
|   - (probabilistische) Datenstruktur zum Feststellen, ob Objekt in einer Menge enthalten ist | ||||
|   - Bit-Feld: Objekt wird über $k$ Hashfunktionen auf $k$ Bits abgebildet, die auf 1 gesetzt werden | ||||
|   - Prüfen auf Enthaltensein: Hashfunktionen anwenden -> Wenn alle $k$ Bits $= 1$, dann ist Objekt enthalten | ||||
|   - aber falsch-positive Werte möglich! | ||||
|   - können ebenfalls durch Mischen kombiniert werden | ||||
|   - [Quelle](Bloom: Space/Time Trade-offs in Hash Coding with Allowable Errors. CACM, 13(7):422-426, 1970) | ||||
| 
 | ||||
| ## Zusammenfassung | ||||
| - B+-Baum als "Arbeitspferd" für Indexing | ||||
| - Standardoperationen: Suche, Einfügen, Löschen | ||||
| - noch nicht betrachtet: Nebenläufigkeitskontrolle und Wiederherstellung im Fehlerfall | ||||
| - diverse Varianten und Optimierungen | ||||
| - LSM-Baum für schreibintensive Workloads | ||||
|  | ||||