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 | Klassifikation gängiger Strategien | ||||||
| | Verfahren  | Prinzip | Alter | Anzahl | | | Verfahren                        | Prinzip                                                             | Alter | Anzahl | | ||||||
| | --- | --- | --- | | | -------------------------------- | ------------------------------------------------------------------- | ----- | | ||||||
| FIFO | älteste Seite ersetzt | G  |- | | FIFO                             | älteste Seite ersetzt                                               | G     | -      | | ||||||
| LFU (least fre-quently used) | Seite mit geringster Häufigkeit ersetzen | - | 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 | | 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 | | DGCLOCK (dyn. generalized clock) | Protokollierung der Ersetzungshäufigkeiten wichtiger Seiten         | G     | JG     | | ||||||
| LRD (least reference density) | Ersetzung der Seite mit geringster Referenzdichte | JG | G | | LRD (least reference density)    | Ersetzung der Seite mit geringster Referenzdichte                   | JG    | G      | | ||||||
| 
 | 
 | ||||||
| Beispiel | Beispiel | ||||||
| - Folge von Seitenanforderungen #1, #2 ... | - Folge von Seitenanforderungen #1, #2 ... | ||||||
| @ -878,11 +878,11 @@ Statische Verfahren: Überblick | |||||||
| Organisation | Organisation | ||||||
| - völlig unsortiert speichern | - völlig unsortiert speichern | ||||||
| - physische Reihenfolge der Datensätze ist zeitliche Reihenfolge der Aufnahme von Datensätzen | - physische Reihenfolge der Datensätze ist zeitliche Reihenfolge der Aufnahme von Datensätzen | ||||||
|     | | | | | |     |      |       |            |     | | ||||||
|     | --- | --- | --- | --- | --- |     | ---- | ----- | ---------- | --- | -------- | | ||||||
|     8832 | Max | Mustermann | ... | 9.1.2003 |     | 8832 | Max   | Mustermann | ... | 9.1.2003 | | ||||||
|     5588 | Beta | Alpha | ... | 7.3.1978 |     | 5588 | Beta  | Alpha      | ... | 7.3.1978 | | ||||||
|     4711 | Gamma | Delta | ... | 2.5.1945  |     | 4711 | Gamma | Delta      | ... | 2.5.1945 | | ||||||
| 
 | 
 | ||||||
| Operationen | Operationen | ||||||
| - insert: Zugriff auf letzte Seite der Datei. Genügend freier Platz => Satz anhängen. Sonst nächste freie Seite holen | - 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 | ### Sequenzielle Speicherung | ||||||
| - sortiertes Speichern der Datensätze | - sortiertes Speichern der Datensätze | ||||||
|     | | | | | |     |      |       |            |     | | ||||||
|     | --- | --- | --- | --- | --- |     | ---- | ----- | ---------- | --- | -------- | | ||||||
|     4711 | Gamma | Delta | ... | 2.5.1945  |     | 4711 | Gamma | Delta      | ... | 2.5.1945 | | ||||||
|     5588 | Beta | Alpha | ... | 7.3.1978 |     | 5588 | Beta  | Alpha      | ... | 7.3.1978 | | ||||||
|     8832 | Max | Mustermann | ... | 9.1.2003 |     | 8832 | Max   | Mustermann | ... | 9.1.2003 | | ||||||
| 
 | 
 | ||||||
| Sequenzielle Datei: Operationen | 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 | - 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 |     - 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 |     - 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 | ||||||
|  | |||||||