Frühjahrsemester 2014 CS243 Datenbanken Kapitel 4: Speicher- und Zugriffssystem H. Schuldt Physische Datenorganisation • Im Zentrum des konzeptuellen Datenbankentwurfs steht die Frage, welche Daten benötigt werden und wie diese zusammen hängen • Im logischen Entwurf wird ein geeignetes Datenmodell ausgewählt. Der konzeptuelle Entwurf wird in dieses Datenmodell überführt und gegebenenfalls noch optimiert (normiert). • Bei beiden Entwurfsaktivitäten stellt sich (noch) nicht die Frage, wie Daten gespeichert werden. Diese Frage ist Gegenstand des physischen Entwurfs: – Wie werden Daten auf dem Hintergrundspeicher organisiert? – Wie kann man effizient auf diese Daten zugreifen? FS 2014 Datenbanken (CS243) – Speicher- und Zugriffssystem 4-2 1 Technologischer Hintergrund: Speicherhierarchie Kapazität Geschwindigkeit Preis ~ 1 MB – 8 MB CPU Cache (SRAM) <1 ns ~ 1 GB – 8 GB Hauptspeicher (DRAM) 3-8 ns < 20 CHF/GB Sekundärspeicher (Magnetplatten) 10 ms ~ 0.05 CHF/GB 100 ms Tertiärspeicher n/a* (optische Platten, Magnetbänder) 0.10 CHF/GB 0.30 - 2 CHF/GB ~160 - 4000 GB pro Platte ~0.7 - 4.7 GB pro opt. Platte ~20 - 400 GB pro Band * Aktuelle Übertragungsraten 80 MB/s T Zugriffslücke (Access Gap) zwischen Hauptspeicher und Sekundärspeicher! FS 2014 Datenbanken (CS243) – Speicher- und Zugriffssystem 4-3 Aufbau des Sekundärspeichers Organisation eines Plattenspeichers • Mehrere Platten (Speicherung an deren Oberfläche) Drehrichtung der Platten Bewegung der SchreibLeseköpfe • Pro Platte gibt es mehrere Spuren (kreisförmige Anordnung von Bits) • Pro Spur gibt es mehrere Sektoren (Blöcke), die aus Präambel, Datenbytes und Fehlerkorrektur bestehen • Alle Arme werden zugleich bewegt. Der Spurensatz, der über mehrere Platten hinweg parallel gelesen werden kann, heisst Zylinder. FS 2014 Datenbanken (CS243) – Speicher- und Zugriffssystem 4-4 2 Hintergrundspeicher (Festplatte) Charakteristik aktueller Festplatten (Laptop / Server / Desktop), Beispiele: Laptop Desktop Server Durchmesser 2,5‘‘ 3,5‘‘ 3,5‘‘ Speicherkapazität 1000 GB 2000 GB 600 GB Preis 70 CHF Grösse (H x B x T) 9.5 x 70 Gewicht 105 g 450 g 690 g Zuverlässigkeit (MTTF) 330.000 h 1.000.000 h 1.600.000 h #Oberflächen 2 3-4 6 #Zylinder 16383 16383 50864 - 90774 Rotationsgeschwindigkeit 5400 rpm 7200 rpm 15.000 rpm ~ 90 CHF x 100 26 x 102 x ~ 200 CHF 147 26 x 102 Mittlere Armpositionierungszeit 12 ms 9,5 ms 3,9 ms Cache 8 MB 64 MB 16 MB Geräuschpegel 24 dB 24 dB 34 dB FS 2014 x 147 Datenbanken (CS243) – Speicher- und Zugriffssystem 4-5 4.1 RAID-Systeme (Speicherarrays) … • Trotz technischer Entwicklungen lässt sich die Zugriffslücke nicht schliessen (im Gegenteil, sie nimmt mit neueren Generationen von Platten eher noch zu) • RAID-Systeme (Redundant Array of Independent Disks) versuchen –anstelle eines grossen Laufwerks– mehrere kleinere (und damit preiswertere) Laufwerke parallel einzusetzen. Der RAID-Controller sorgt dafür, dass diese kleinen Laufwerke nach aussen wie ein einziges grosses Laufwerk aussehen. • Es existieren insgesamt acht unterschiedliche RAID-Stufen (levels). Diese unterscheiden sich hauptsächlich im Redundanzgrad (und damit in der Ausfallsicherheit) und in der Effizienz des Zugriffs FS 2014 Datenbanken (CS243) – Speicher- und Zugriffssystem 4-6 3 … RAID-Systeme (Speicherarrays) … • RAID-0 (Striping): Daten werden blockweise auf die physischen Laufwerke verteilt. Die Anzahl der Platten wird als Striping-Breite bezeichnet, die Grösse der Blöcke als Striping-Granularität. Dieses RAID-Level unterstützt vor allem das sequentielle Lesen. Die Skalierung ist (nahezu) linear mit der Anzahl der verfügbaren Platten. Bei zufälligem Lesen einzelner Blöcke gibt es (fast) keine Unterstützung. Durch die Verteilung auf viele Platten ist der RAID-0-Ansatz in der Regel auch sehr fehleranfällig. Beispiel: Datei X mit vier Datenblöcken A, B, C, D A B C D FS 2014 A C B D Datenbanken (CS243) – Speicher- und Zugriffssystem 4-7 … RAID-Systeme (Speicherarrays) … • RAID-1 (Mirroring): Jedes Laufwerk besitzt eine Spiegelkopie (Mirror) des kompletten Datenbestands. Während also RAID-0 auf den effizienten Zugriff abzielt hat RAID-1 primär eine hohe Ausfallsicherheit zum Ziel. Falls auf einer Platte defekte Blöcke festgestellt werden, so kann das Lesen ohne Datenverlust auf einer der Spiegelplatten fortgesetzt werden. Beispiel: FS 2014 A B A B A B C D C D C D Datenbanken (CS243) – Speicher- und Zugriffssystem 4-8 4 … RAID-Systeme (Speicherarrays) … • RAID-0+1: Kombiniert RAID-0 und RAID-1. Die Zahl der zur Verfügung stehenden Platten wird halbiert. Auf der Hälfte dieser Platten erfolgt ein Striping, auf der zweiten Hälfte sind die Mirrors der anderen Platen untergebracht. Der Speicherplatzbedarf ist daher doppelt so hoch wie bei RAID-0 Beispiel: A B C D FS 2014 A C B D A C B D Datenbanken (CS243) – Speicher- und Zugriffssystem 4-9 … RAID-Systeme (Speicherarrays) … • • RAID-2: Die Ausfallsicherheit wird hier durch Paritätsinformation realisiert – also effizienter als bei RAID-1. In RAID-2 erfolgt ein Striping auf Bitebene (auf n-1 Platten). Auf der n-ten Platte findet sich dann zugehörige Paritätsinformation (ähnlich wie bei Bandlaufwerken). Dieses RAID-Level wird in der Praxis eher selten eingesetzt, da die Plattencontroller bereits eine Fehlererkennung eingebaut haben. RAID-3: Wie RAID-2, allerdings erfolgt hier ein Striping auf Byte-Ebene. Bei n Platten wird also Byte A[m] auf Platte m mod (n-1) gespeichert. Auf der n-ten Platte wird die Paritätsinformation abgelegt. Der erhöhte Speicherbedarf in diesem RAID-Level beträgt 1/n. Beim Lesen kann man auf die ersten n-1 Platten zugreifen, beim Schreiben auf alle n. Beispiel: FS 2014 A B A1 A4 C D B1 … … A2 A5 B2 … … A3 B3 Datenbanken (CS243) – Speicher- und Zugriffssystem … … Ap Bp … … 4-10 5 … RAID-Systeme (Speicherarrays) … • • RAID-4: Die Funktionsweise ist dieselbe wie bei RAID-3. Allerdings erfolgt das Striping auf den ersten n-1 Platten auf Blockebene. Analog befindet sich auf Platte n ein Paritätsblock. RAID-5: Auch hier erfolgt ein Striping auf Blockebene. Allerdings wird nicht nur eine Platte für die Paritätsblöcke verwendet. Vielmehr werden die Paritätsblöcke gleichmässig auf alle Platten verteilt. Daher werden in der Regel auch alle n Platten bei einem Lesezugriff benötigt. A1 B1 C1 Dp A2 B2 Cp D1 A3 Bp C2 D2 Ap B3 C3 D3 E1 F1 E2 F2 E3 Fp Ep F3 FS 2014 … … … … Datenbanken (CS243) – Speicher- und Zugriffssystem 4-11 … RAID-Systeme (Speicherarrays) • RAID-6 ist ein weiteres RAID-Level, das im Vergleich zu RAID-3 bis RAID-5 aufwändigere Paritätsinformationen verwendet (bei RAID-3 bis RAID-5 kann nur ein Fehler auf einer der beteiligten Datenplatten korrigiert werden). • Die Möglichkeit des Stripings von Datensätzen auf mehrere Platten zur Effizienzsteigerung des Zugriffs wird von vielen Datenbanksystemen (auch ohne RAID-System) eingesetzt. FS 2014 Datenbanken (CS243) – Speicher- und Zugriffssystem 4-12 6 4.2 Abbildung von DB-Objekten auf Speicherbereiche … Eine oder mehrere Relationen und/oder Indexe werden normalerweise in einem Tablespace gespeichert. Ein Tablespace ist ein logisch zusammenhängender Seitenadressraum. Eine Seite umfasst in der Regel mehrere auf einer Spur liegende Blöcke und ist die kleinste Einheit der Daten, die vom DBMS geladen werden. Mehrere Seiten werden zu so genannten Extents zusammen gefasst. Logische Seitennummern werden mit Hilfe einer Seitenadressierungstabelle (Extent-Tabelle) in physische Blocknummern auf der Platte übersetzt. Extents sind typischerweise gegenüber dem Betriebssystem als reguläre Files alloziert. Oracle verwendet zusätzlich zu den Extents noch Segmente (ein Segment beinhaltet mehrere Extents). Dies erlaubt innerhalb eines Tablespaces die Unterscheidung in Datensegmente, Indexsegmente, Rollbacksegmente, etc. FS 2014 Datenbanken (CS243) – Speicher- und Zugriffssystem 4-13 … Abbildung von DB-Objekten auf Speicherbereiche Extent Table Extent No 0 1 2 Extent Size 2 5 4 #Pages 0–1 2–6 7 – 10 Extent Address FS 2014 Datenbanken (CS243) – Speicher- und Zugriffssystem 4-14 7 Verwaltung von Tablespaces Allokation von Tablespaces: CREATE TABLESPACE tablespacename DATAFILE filename SIZE size {"," filename SIZE size} Erweiterung von Tablespaces: ALTER TABLESPACE tablespacename ADD DATAFILE filename SIZE size {"," filename SIZE size} Zuordnung von Relationen (und Indexe) zu Tablespaces: CREATE tablename ( ... [ TABLESPACE tablespacename ] [ STORAGE INITIAL size NEXT size ] [ PCTFREE percent ] ) • Die Parameter der Tablespace-/Table-Spezifikation erlauben eine Einflussnahme auf die Allokation von Daten auf den zugrundeliegenden Speichermedien, z.B.: – Allokation bestimmter Daten auf derselben oder verschiedenen Platten, – Festlegung eines Füllgrades von Seiten beim Laden. FS 2014 Datenbanken (CS243) – Speicher- und Zugriffssystem 4-15 Zuordnung von Schemaelementen zu Tablespaces Beispiel : • Tablespace TS1 bestehe aus Extents, die alle auf Platte /dev/rsd0a liegen; • Tablespace TS2 bestehe aus Extents, die alle auf Platte /dev/rsd1b liegen. Es gebe viele Zugriffe der Form SELECT * FROM Produkte WHERE PNr = :pnr ; die vom DBS wie folgt ausgeführt werden: 1. Zugriff auf den Index "ProduktPNrIndex" über PNr 2. Zugriff auf das entsprechende Ergebnistupel. Eine gute Zuordnung ist dann: Produkte T Tablespace TS1 ProduktePNrIndex T Tablespace TS2 damit der Zugriffsarm auf der „Indexplatte“ nur wenig bewegt werden muss und insbesondere nicht nach den Zugriffen auf die Ergebnistupel immer wieder neu positioniert werden muss. FS 2014 Datenbanken (CS243) – Speicher- und Zugriffssystem 4-16 8 DB-System-Modell und Komponenten … • Der TM leitet eingehende Operationen an den Scheduler weiter. Im Falle von verteilten DBMSen beinhaltet dies die Kommunikation sowie die Koordination verteilter Transaktionen. • Der Scheduler entscheidet, ob Operationen ausgeführt, zurückgewiesen oder verzögert werden. • Aufgabe des RM ist, die DB vor Systemfehlern zu schützen (z.B. wenn der transiente Speicher verloren geht) und zu garantieren, dass die Effekte abgeschlossener Transaktionen dauer-haft sind bzw. dass abgebrochene TA keine Effekte hinterlassen. • Der CM (Pufferverwaltung) sorgt für einen effizienten Zugriff auf Daten. FS 2014 Transaktionen read / write / commit / abort DBMS TransaktionsManager (TM) read / write / commit / abort Scheduler read / write / commit / abort DataManager Recovery-Manager (RM) read / write fetch / flush Cache-Manager (CM) Cache transienter Speicher read / write flush Datenbank fetch Log persistenter Speicher Datenbanken (CS243) – Speicher- und Zugriffssystem 4-17 … DB-System-Modell und Komponenten • Module – In der Praxis sind die einzelnen Module stark voneinander abhängig, deren Implementierung also zumeist ineinander verzahnt (speziell um PerformanceGewinne zu erzielen) – Trennung ist also eher konzeptioneller (didaktischer) Natur – Weitergehende Aspekte sind in diesem abstrakten Modell komplett ausgeblendet (wie z.B. die Anfrageoptimierung, die Abbildung einer SQLSchnittstelle auf read/write-Operationen, etc.) FS 2014 Datenbanken (CS243) – Speicher- und Zugriffssystem 4-18 9 4.3 Pufferverwaltung • Puffer = Hauptspeicherbereich, über den alle DBS-Daten aus den Sekundärspeichern den Prozessen des Datenbanksystems bereitgestellt werden. • Alle DBS puffern häufig referenzierte Seiten (z.B. einen Teil der Indexseiten) im Hauptspeicher. Die Grösse des Datenbankpuffers ist durch den Datenbankadministrator spezifizierbar. • Um zu garantieren, dass auch wirklich relevante Daten im Puffer enthalten sind braucht es spezielle Pufferersetzungsstrategien: – Wenn der Puffer voll belegt ist und es wird eine Seite benötigt, die nicht im Puffer vorhanden ist, muss eine gepufferte Seite ersetzt werden (wie auch beim Caching im Betriebssystem). – Falls die ersetzte Seite seit ihrer letzten Einlagerung in den Puffer geändert wurde, muss sie vor ihrer Ersetzung erst noch auf Platte zurück geschrieben werden (auch dies wie bei jedem Puffer, allerdings erfordert hier das etwaige Rücksetzen der die Änderung verursachenden Transaktion weitere datenbankspezifische Massnahmen (siehe späteres Kapitel) FS 2014 Datenbanken (CS243) – Speicher- und Zugriffssystem 4-19 Behandlung von Seitenfehlern Bei Auftreten eines Seitenfehlers (Zugriff auf eine Seite, die nicht im Puffer enthalten ist) geschieht folgendes: 1. Eine Seitensetzungsstrategie wählt aus den im Puffer vorhandenen Seiten die zu ersetzende Seite aus. 2. Wenn die zu ersetzende Seite seit dem Einlesen geändert wurde, wird sie auf den Hintergrundspeicher zurück geschrieben (dies ist mit Vorsicht zu geniessen, vor allem dann wenn die zugehörige Transaktion, die die Änderung verursacht hat, noch nicht beendet ist T später mehr dazu) 3. Die neue Seite wird vom Hintergrundspeicher in den freigewordenen Seitenrahmen eingelesen. Die Seitentabelle wird aktualisiert. Die Behandlung von Seitenfehlern muss möglichst effizient durchgeführt werden, da Seitenwechsel sonst leicht zum Engpass des gesamten Systems werden. Insbesondere sollten bei der Auswahl der zu ersetzenden Seite(n) immer solche ausgewählt werden, auf die möglichst nicht gleich wieder zugegriffen wird. Denn ansonsten müssten diese, auf Kosten anderer Seiten, gleich wieder eingelagert werden. FS 2014 Datenbanken (CS243) – Speicher- und Zugriffssystem 4-20 10 Seitenersetzungsstrategien Für die Auswahl einer zu ersetzenden Seite gibt es verschiedene Varianten: 1. OPT: Ersetzt die Seite, die in der Zukunft am längsten nicht benötigt wird. Diese optimale Strategie ist aber leider nicht realisierbar (die Zukunft ist auf für Seitenzugriffe nicht vorhersehbar). 2. Random: Es wird zufällig eine Seite im Puffer ausgewählt. Vorteil: schnell und einfach zu realisieren. Nachteil: Nimmt keinerlei Rücksicht auf das Seitenreferenzverhalten der Anwendung (vor allem dann wenn auch auf Indexdaten zugegriffen wird) 3. FIFO (First In, First Out): Diese Strategie ersetzt die älteste Seite im Puffer, ohne Rücksicht darauf, ob sie zwischendurch benutzt wurde. Vorteil: einfach zu realisieren (Zeitstempel wird beim Einlagern vergeben) Nachteil: häufig verwendete Seiten werden genauso behandelt wie Seiten, auf die nur einmal zugegriffen wird. 4. LRU (Least Recently Used): Jeder Seitenzugriff erzeugt einen Zeitstempel. Die Seite mit dem ältesten Zeitstempel wird ersetzt. Die beiden letzten Strategien benutzen das Zugriffsverhalten aus der Vergangenheit zur Vorhersage des zukünftigen Zugriffsverhaltens. In der Praxis hat sich insbesondere LRU bewährt. FS 2014 Datenbanken (CS243) – Speicher- und Zugriffssystem 4-21 Puffer – Optimale Ersetzungsstrategie • Ersetze diejenige Seite, die am weitesten in der Zukunft erst wieder benötigt wird. FS 2014 Zeit Referenzierte Seite 1 1 2 2 3 3 4 2 5 4 6 3 7 5 8 1 Pufferinhalt (Annahme: Puffer hat 3 Seitenrahmen) Datenbanken (CS243) – Speicher- und Zugriffssystem 4-22 11 Realistische (und typische) Ersetzungsstrategie LRU (Least Recently Used): • Ersetze diejenige Seite, auf die am längsten nicht mehr zugegriffen worden ist. • Zeit Referenzierte Seite 1 1 2 2 3 3 4 2 5 4 6 3 7 5 8 1 Pufferinhalt (Zugriff alt …… Zugriff neu) Eine zusätzliche I/O-Optimierung ist möglich durch das Prefetching von Seiten, von denen das DBS weiss, dass sie in naher Zukunft benötigt werden (z.B. Relationen-Scan: sequentielles Lesen aller Seiten einer Relation). FS 2014 Datenbanken (CS243) – Speicher- und Zugriffssystem 4-23 Implementierung der LRU-Strategie Zur Umsetzung der LRU-Strategie werden alle Seiten des Puffers in einer verketteten Liste gespeichert, wobei die Seiten nach ihrem letzten Zugriff geordnet sind (die Seite, auf die zuletzt zugegriffen wurde steht ganz vorne, die Seite, auf die am längsten nicht mehr zugegriffen wurde, steht ganz hinten). Beispiel zu LRU: Zum Zeitpunkt T erfolgt ein Zugriff auf Seite 3. Diese Seite ist im Puffer, der Zugriff ist also möglich. Zum Zeitpunkt T+1 wird daher die Seitenzugriffsliste entsprechend angepasst. Zum Zeitpunkt T+1 soll auf eine Seite (9) zugegriffen werden, die nicht im Puffer ist. Daher wird Zugriff auf Seite 3 Zugriff auf Seite 9 die letzte Seite der Liste (2) ausgewählt und verdrängt. Zeit: T Zeit: T+1 Zeit: T+2 Die neue Seite (9) wird dann 9 1 3 in den Seitenrahmen von 2 3 5 1 eingelagert und entsprechend 4 5 1 in der Seitenzugriffsliste 7 4 5 platziert. 0 7 4 6 3 2 0 6 2 7 0 6 Seitenzugriffsliste Seitenzugriffsliste Seitenzugriffsliste FS 2014 Datenbanken (CS243) – Speicher- und Zugriffssystem 4-24 12 Probleme mit reinem LRU … Falls häufig Anfragen vom Typ SELECT * FROM Produkte WHERE PNr = :pnr mit Indexzugriff an das DBS gestellt werden (Annahme: Es gibt 2 Indexseiten und 20 Datenseiten für Produkte), dann kann es mit LRU zu folgenden Problemen kommen: Zeit Referenzierte Seite Pufferinhalt LRU (Zugriff alt …. Zugriff neu) Optimaler Pufferinhalt 1 I1 I1 I1 2 D1 I1 D1 3 I2 I1 D1 4 D11 D1 I2 5 I1 I2 D11 I1 6 D2 D11 I1 D2 7 I2 I1 D2 8 D12 D2 I2 9 … FS 2014 I1 D1 I2 I1 D1 D11 I1 D11 I2 I1 D11 I2 I1 D2 I2 I2 I1 D2 I2 D12 I1 D12 I2 I2 Datenbanken (CS243) – Speicher- und Zugriffssystem 4-25 … Probleme mit reinem LRU Beispiel 2: Es werden gleichzeitig Anfragen a) und b) an ein DBS gestellt: a) SELECT * FROM Kunden WHERE KNr = :knr – mit Indexunterstützung b) SELECT SUM(summe) FROM Bestellungen – ohne Indexunterstützung. Annahme: Es gibt 1 Indexseite für Kunden, 2 Datenseiten für Kunden und 20 Datenseiten für Bestellungen. • Kommerzielle DBS eliminieren diese zweite Art von Problemen, indem sie Seitenreferenzen von Relationen-Scans (sequentielles Lesen aller Seiten einer Relation) speziell behandeln. • Solche Seiten werden an das "wertlose" Ende der (modifizierten) LRU-Kette gehängt. FS 2014 Zeit Referenzierte Seite 1 I1 2 K1 3 B1 4 I1 5 K2 6 B2 Pufferinhalt (4 Seitenrahmen) Zugriff alt („wertlos“) … Zugriff neu („wertvoll“) Datenbanken (CS243) – Speicher- und Zugriffssystem 4-26 13 4.4 Speicherung & Adressierung von Datensätzen … • Tablespaces sind in Seiten (Speicherbereiche fester Grösse) eingeteilt. In einer Seite werden ein oder mehrere Datensätze (Records) gespeichert. • Eine Seite ist die kleinste Einheit für den Transport zwischen Sekundärspeicher und Hauptspeicher sowie für die Pufferung im Hauptspeicher. • Im Header werden allgemeine Informationen zur Seite veraltet … • • Header … danach folgt ein Bereich, in dem die eigentlichen Datensätze gespeichert werden … Datensatz1 Datensatz2 Datensatz3 Datensatz4 ... Datensatz5 … und schliesslich ein so genanntes Slot Array mit Verweisen auf die einzelnen Records ... Slot5 Slot4 Slot3 Slot2 Slot1 FS 2014 Datenbanken (CS243) – Speicher- und Zugriffssystem 4-27 … Speicherung & Adressierung von Datensätzen • Der durch Datensätze belegte Bereich in einer Seite wächst von vorne nach hinten, das Slot-Array wächst von hinten nach vorne. • Der Header einer Seite enthält u.a. Angaben zu – Grösse des gesamten freien Platzes in der – Grösse des zusammenhängenden freien Platzes zwischen Datensätzen und Slot-Array, – Grösse des Slot-Arrays, usw. Mögliches Speicherungsformat eines Datensatzes: Record Length AttrNo1 AttrLength1 AttrValue1 … … AttrNon AttrLengthn AttrValuen Bei diesem Format werden Nullwerte überhaupt nicht gespeichert! FS 2014 Datenbanken (CS243) – Speicher- und Zugriffssystem 4-28 14 Stabilität der Satzadressierung • • Sätze werden indirekt über die Slots einer Seite adressiert. Vorteil dieser Adressierung: Sätze sind so innerhalb einer Seite verschiebbar, ohne dass Zeiger in anderen Seiten geändert werden müssen. PageNo: 1234 5 CDs 0.5 20 Basel 5000 ... Slot5 Slot4 Slot3 Slot2 Slot1 Index über Lagerort Index über PNr 5 FS 2014 Basel Datenbanken (CS243) – Speicher- und Zugriffssystem 4-29 Stabilität der Tupeladressen durch Auslagerung • Beim Auslagern eines Satzes auf eine andere Seite wird in der ursprünglichen Seite ein Overflow-TID hinterlassen. – Die meisten Sätze sind mit einem Seitenzugriff adressierbar; eine Minderheit ist mit zwei Seitenzugriffen adressierbar. • Bei einer Häufung von Overflow-TIDs ist eine Reorganisation nötig (z.B. Unload & Load) PageNo: 1234 PageNo: 4711 Overflow-TID 5 CDs ... Slot5 Slot4 Slot3 Slot2 Slot1 Index über PNr 5 FS 2014 0.5 20 Basel 5000 ... Slot5 Slot4 Slot3 Slot2 Slot1 Index über Lagerort Basel Datenbanken (CS243) – Speicher- und Zugriffssystem 4-30 15 4.5 Indexstrukturen • Bei den meisten Anfragen werden nicht alle Tupel einer Relation (oder von mehreren Relationen, im Falle von Joins) benötigt, sondern nur eine [kleine] Teilmenge davon • Die Speicherung von Datensätzen ohne weitere Datenstrukturen würde jedoch erzwingen, dass man bei jeder Anfrage die komplette Relation liest (table scan) um die gesuchten Tupel zu identifizieren • Besser wäre es daher, wenn man direkt auf einzelne Tupel zugreifen könnte. Dies ist die Aufgabe von Indexstrukturen. • Die Verwendung eines Index bedeutet jedoch, dass zusätzlicher Speicher benötigt wird und dass Einfüge- bzw. Änderungsoperationen aufwändiger werden, da nicht nur die eigentlichen Daten sondern auch die zugehörigen Indexstrukturen angepasst werden müssen. • In den meisten Fällen werden B- bzw. B*-Bäume für die Realisierung von Indexen verwendet (in einzelnen Fällen jedoch auch andere Technologien) • Im Kontext von Indexstrukturen spricht man von Schlüsseln – damit sind jedoch nicht die Schlüssel aus dem relationalen Modell gemeint sondern die Suchschlüssel der B- bzw. B*-Bäume, also die Attribute, über die ein direkter Zugriff via Index zu den jeweiligen Tupeln möglich ist. FS 2014 Datenbanken (CS243) – Speicher- und Zugriffssystem 4-31 B-Bäume Bei B-Bäumen handelt es sich um eine Variante einer ausgeglichenen (balancierten) Baumstruktur (1977 von R. Bayer und E. McCreight vorgeschlagen). B steht dabei nicht für binär, sondern für balanced. Insbesondere sind B-Bäume Mehrwegbäume, die mehr als einen Eintrag pro Knoten verwalten. Grundidee des B-Baumes ist, dass der Verzweigungsgrad variiert (also nicht unbedingt = 2 ist sondern durchaus grösser sein darf), während die Höhe balanciert bleibt. B-Baume eigen sich durch den hohen Verzweigungsgrad sehr gut als Suchbäume für Datenbanken, da der Verzweigungsgrad (und damit auch die Anzahl der Einträge pro Knoten) so gewählt werden kann, dass ein Knoten des Baumes in genau eine Datenbankseite passt. Da ein Knoten (bzw. eine Seite) mehrere Elemente umfassen kann, lassen sich mit einem Speicherzugriff auch mehrere Elemente gleichzeitig einlesen. FS 2014 Datenbanken (CS243) – Speicher- und Zugriffssystem 4-32 16 B-Baum: Vorüberlegung • In einem B-Baum kann jeder Knoten mehrere Einträge beinhalten und auch mehr als 2 Kindknoten besitzen. • Es müssen nicht alle Positionen in einem Knoten besetzt sein Ø Dadurch gewinnt man Freiheitsgrade, die den Aufwand der Restrukturierung begrenzen • Ein Eintrag Ei in einem B-Baum besteht aus dem Suchschlüssel Si und dem Datensatz Di, der diesen Suchschlüssel enthält E1 ... FS 2014 E2 ... E3 X ... X: Eintrag ist leer ... Datenbanken (CS243) – Speicher- und Zugriffssystem 4-33 B-Baum: Definition Die minimale und maximale Anzahl von Einträgen, die in einem Knoten gespeichert werden, wird durch die Ordnung m des B-Baums definiert: Für einen B-Baum der Ordnung m gilt: – Jeder Knoten enthält höchstens 2·m Einträge – Die Wurzel enthält mindestens einen Eintrag, alle anderen Knoten enthalten mindestens m Einträge – Innere Knoten mit (aktuell) j Einträgen haben genau (j +1) Kindknoten – Alle Blattknoten sind gleich weit von der Wurzel entfernt („gleiche Ebene“). In den Blattknoten sind die Verweise nicht definiert. Zusätzlich besitzt ein B-Baum auch die Suchbaum-Eigenschaft (Voraussetzung: es muss also eine totale Ordnung auf den Suchschlüssel definiert sein). Seinen S1, …, Sn die Schlüssel eines Knotens mit n+1 Kindern. V0, V1, …, Vn seien die Verweise auf diese Kinder. Dann gilt: – V0 weist auf einen Teilbaum mit Schlüsseln kleiner als S1 – Vi (i = 1, ..., n-1) verweist auf den Teilbaum, dessen Schlüssel zwischen Si und Si+1 liegen – Vn verweist auf den Teilbaum mit Schlüsseln grösser als Sn FS 2014 Datenbanken (CS243) – Speicher- und Zugriffssystem 4-34 17 Beispiel: B-Baum mit Ordnung m=2 Die Wurzel hat mindestens ein, maximal 2·m=4 Elemente minimal gefüllter Knoten mit j=m=2 Elementen und j+1 =3 Kindknoten • 14 • X • X • X • • 9 • 11 • X • X • ... ... ... • 15 • 17 • ... ... maximal gefüllter Knoten mit j = 2·m=4 Elementen und j+1=5 25 • 31 • Kindknoten ... ... ... alle Blattknoten sind auf gleicher Ebene Der Einfachheit halber sind in jedem Knoten nur die Suchschlüssel dargestellt. Gespeichert werden jedoch Suchschlüssel und Datensätze. FS 2014 Datenbanken (CS243) – Speicher- und Zugriffssystem 4-35 Beispiel: B-Baum • Beispiel: B-Baum über Attribut Bez der Relation Produkte FS 2014 Datenbanken (CS243) – Speicher- und Zugriffssystem 4-36 18 Suchen in B-Bäumen • Aufgrund der Struktur eines B-Baumes basiert das Suchen auf einer Kombination des Verfolgens von Verweisen (wie im binären Suchbaum) zum Auffinden von Knoten und der Suche in einer sortierten Folge (zum Auffinden eines Eintrags innerhalb eines Knotens) • Beginnend mit der Wurzel wird der Knoten gesucht, der den gesuchten Schlüsselwert k überdeckt. Das bedeutet, es muss der erste Eintrag gefunden werden, der grösser oder gleich k ist – Bei Gleichheit ist das gesuchte Element gefunden – Ansonsten muss der Verweis vor diesem Element verfolgt werden – Falls kein Element grösser oder gleich k gefunden wurde, dann muss der letzte Verweis auf der Seite verfolgt werden • Erreicht man eine Blattseite, die den gesuchten Eintrag nicht enthält, dann existiert dieser Eintrag im B-Baum nicht FS 2014 Datenbanken (CS243) – Speicher- und Zugriffssystem 4-37 Beispiel: Suche im B-Baum Suchen nach dem Wert 25 • 14 • X • X • X • • 9 • 11 • X • X • ... ... ... • 15 • 17 • 25 • 31 • ... ... ... ... ... Der Einfachheit halber sind in jedem Knoten nur die Suchschlüssel dargestellt. Gespeichert werden jedoch Suchschlüssel und Datensätze. FS 2014 Datenbanken (CS243) – Speicher- und Zugriffssystem 4-38 19 Einfügen in B-Baum Zunächst wird der Blattknoten lokalisiert, in dem das Element gemäss der totalen Ordnung gehört (so dass die B-Baum-Eigenschaft erfüllt ist) Ist dieser Knoten noch nicht voll (d.h. Anzahl Elementeneu § 2·m), kann das neue Element dort gespeichert werden (unter Beibehaltung der Sortierung der Elemente im Blattknoten) Einfügen von 10: • 14 • X • X • X • • 9 • 11 • X • X • • 15 • 17 • 25 • 31 • • 14 • X • X • X • • 9 • 10 • 11 • X • • 15 • 17 • 25 • 31 • Der Einfachheit halber sind in jedem Knoten nur die Suchschlüssel dargestellt. Gespeichert werden jedoch Suchschlüssel und Datensätze. FS 2014 Datenbanken (CS243) – Speicher- und Zugriffssystem 4-39 Einfügen in B-Baum: Überlauf Ist der Knoten voll (Anzahl Elementeneu = 2·m+1), dann beginnt eine so genannte Überlauf-Behandlung, durch die der Knoten wird in zwei Teile aufgespaltet wird: – es wird zunächst ein neuer Knoten erzeugt – die ersten m Elemente bleiben im alten Knoten – die letzten m Elemente werden in den neuen Knoten umgespeichert – das Element in der Mitte wird in den Elternknoten aufgenommen – der Verweis auf den neuen Knoten wird ebenfalls dort aufgenommen FS 2014 Datenbanken (CS243) – Speicher- und Zugriffssystem 4-40 20 Einfügen in B-Baum (mit Überlauf): Beispiel Einfügen von 16: • 14 • X • X • X • • 9 • 10 • 11 • X • • 15 • 17 • 25 • 31 • • 14 • 17 • X • X • • 9 • 10 • 11 • X • • 15 • 16 • X • X • • 25 • 31 • X • X • Der Einfachheit halber sind in jedem Knoten nur die Suchschlüssel dargestellt. Gespeichert werden jedoch Suchschlüssel und Datensätze. FS 2014 Datenbanken (CS243) – Speicher- und Zugriffssystem 4-41 Einfügen in B-Baum: Überlauf der Wurzel Das Einfügen des Mittelelements in den Elternknoten kann dort ebenfalls zu einem Überlauf führen. Dies führt zu einer Überlaufbehandlung, die analog abläuft. Das Propagieren von neuen Elementen nach oben kann sich bis zur Wurzel fortsetzen. Für die Wurzel gibt es eine spezielle Überlaufbehandlung: – Sie wird wie die anderen Knoten in zwei Teile gespalten – Diese werden nun innere Knoten – Es wird ein neuer Wurzelknoten erzeugt – Das Mittelelement und die beiden Verweise werden dort gespeichert Die Baumhöhe wächst also bei Wurzel-Überlauf um eins (und nur dann). Alle Blätter sind nach wie vor gleich weit von der Wurzel entfernt (1 mehr als vorher); die B-Baum-Eigenschaft bleibt also erhalten. Das Einfügen erfordert also im ungünstigsten Fall, dass der Baum einmal ganz hinunter gestiegen und dann bei der Überlaufbehandlung wieder ganz hinauf traversiert werden muss. Dies geschieht also linear in der Baumhöhe. FS 2014 Datenbanken (CS243) – Speicher- und Zugriffssystem 4-42 21 Beispiel: Überlauf der Wurzel Einfügen unterhalb der Wurzel führt zu Überlauf, 29 wird nach oben weiter gereicht: • 11 • 14 • 20 • 38 • ... ... ... ... 29 ... ... • 20 • • 11 • 14 • X • X • ... ... ... ... • 29 • 38 • X • X • ... ... Der Einfachheit halber sind in jedem Knoten nur die Suchschlüssel dargestellt. Gespeichert werden jedoch Suchschlüssel und Datensätze. FS 2014 Datenbanken (CS243) – Speicher- und Zugriffssystem 4-43 Löschen aus B-Bäumen … • • Beim Löschen aus einem B-Baum muss zunächst unterschieden werden, ob der zu löschende Eintrag E in einem Blattknoten oder in einem inneren Knoten (bzw. der Wurzel) gefunden wurde. Löschen eines Eintrags aus einem Blattknoten – Suche Blattknoten, der den zu löschenden Eintrag enthält – Lösche den Eintrag aus dem Blattknoten – Falls der Blattknoten Bi danach weniger als m Einträge hat, dann wird mit er mit einem Nachbarknoten Bk verschmolzen (wenn der Nachbarknoten genau m Einträge besitzt) oder er wird mit einem Eintrag des Nachbarknotens ausgeglichen (k = i-1 oder i+1) • Verschmelzen bedeutet, dass der entsprechende Eintrag des Vaterknotens, die m-1 Einträge des Blatts Bi, und die m Einträge des Nachbarknotens Bk ein neues Blatt bilden (mit der Maximalbelegung 2·m). Es wird dann aus dem Vaterknoten ein Eintrag gelöscht • Ausgleich bedeutet, dass der Eintrag des Vaterknotens zwischen Bi und Bk in den untervollen Knoten Bi aufgenommen wird und das erste Element von Bk in den Vaterknoten wandert (falls Bk rechter Nachbar), ansonsten (Bk linker Nachbar) das letzte Element aus Bk [Alternative: Ausgleich so, dass Bi und Bk danach gleich stark gefüllt sind] FS 2014 Datenbanken (CS243) – Speicher- und Zugriffssystem 4-44 22 … Löschen aus B-Bäumen • Löschen eines Eintrags aus einem Nicht-Blattknoten. Hier darf der Eintrag nicht einfach entfernt werden. Vielmehr muss, um den Verzweigungsgrad des Baumes aufrecht zu erhalten, ein Eintrag eines der beiden benachbarten Teilbäume nach oben kopiert werden – Suche Knoten, der den zu löschenden Eintrag E enthält – Ersetze E durch E*. E* ist dabei entweder der grösste Eintrag des linken Teilbaums oder der kleinste Eintrag des rechten Teilbaums – Lösche E* aus dem entsprechenden Teilbaum (Unterscheidung, je nachdem ob E* aus Blattknoten oder Nicht-Blattknoten stammt). FS 2014 Datenbanken (CS243) – Speicher- und Zugriffssystem 4-45 Beispiel: Löschen aus B-Baum … Löschen von 9: • 14 • X • X • X • • 9 • 11 • X • X • • 15 • 17 • 25 • 31 • Der Einfachheit halber sind in jedem Knoten nur die Suchschlüssel dargestellt. Gespeichert werden jedoch Suchschlüssel und Datensätze. FS 2014 Datenbanken (CS243) – Speicher- und Zugriffssystem 4-46 23 … Beispiel: Löschen aus B-Baum … Löschen von 9: • 14 • X • X • X • • 9 • 11 • X • X • • 17 • 25 • X • X • Der Einfachheit halber sind in jedem Knoten nur die Suchschlüssel dargestellt. Gespeichert werden jedoch Suchschlüssel und Datensätze. FS 2014 Datenbanken (CS243) – Speicher- und Zugriffssystem 4-47 … Beispiel: Löschen aus B-Baum Löschen von 9: • 19 • X • X • X • • 9 • 16 • X • X • •11•13•14•X• • 17 • 25 • X • X • ... ... ... ... •2•5•X•X• Der Einfachheit halber sind in jedem Knoten nur die Suchschlüssel dargestellt. Gespeichert werden jedoch Suchschlüssel und Datensätze. FS 2014 Datenbanken (CS243) – Speicher- und Zugriffssystem 4-48 24 Komplexität von B-Bäumen • Das Suchen, Einfügen und Löschen beschränken sich jeweils auf einen Pfad von der Wurzel zu einem Blatt, sind also linear in der Baumhöhe • Insgesamt besitzt ein B-Baum der Ordnung m die Höhe logm n (ohne Beweis) – Der Aufwand für Einfügen, Löschen und Suchen ist daher logarithmisch in der Anzahl der Elemente • Wichtigste Eigenschaft eines B-Baums ist der hohe Verzweigungsgrad (dieser ist natürlich abhängig von der Seitengrösse und der Grösse einzelner Tupel), um ein effizientes Zugriffsverhalten zu garantieren FS 2014 Datenbanken (CS243) – Speicher- und Zugriffssystem 4-49 B*-Bäume • • • • • • Wenn einzelne Tupel gross sind, dann reduziert sich der Verzweigungsgrad in einem B-Baum. Damit erhöht sich jedoch die Höhe des Baumes und dadurch auch der Aufwand für die Suche Eine Variante von B-Bäumen, die einen hohen Verzweigungsgrad und damit potentiell eine geringere Baumhöhe ermöglicht, sind B*-Bäume (in der englischsprachigen Literatur oftmals auch als B+-Bäume zu finden). In einem B*-Baum werden Datensätze nur in den Blättern gespeichert; innere Knoten (und auch die Wurzel) enthalten lediglich „Wegweiser“ (also Suchschlüssel und Verweise auf die Teilbäume jedoch OHNE die kompletten Datensätze). Man bezeichnet B*-Bäume auch als „hohle Bäume“. Einfügen in und Löschen aus B*-Bäumen verlaufen analog zu B-Bäumen Um zusätzlich eine sequentielle Verarbeitung de Datensätze zu ermöglichen sind die Blattknoten mit dem vorangehenden (P) und dem nachfolgenden (N) Blattknoten verlinkt. Dies erlaubt, dass bei einem Scan der Relation in Sortierreihenfolge des B*-Baums kein innerer Knoten gelesen werden muss. Der Verzweigungsgrad (engl.: fan-out) eines B*-Baums liegt typischerweise zwischen 50 und 400. FS 2014 Datenbanken (CS243) – Speicher- und Zugriffssystem 4-50 25 B*-Bäum: schematischer Aufbau Index-Suche •Sc• Sf • Sj • …• Sv •X• Sequentielle Suche … FS 2014 S S S P Dr Ds … Du N r s u Datenbanken (CS243) – Speicher- und Zugriffssystem 4-51 B*-Baum – Beispiel • Index für Produktbezeichnung Drucker . . . | Band | . . . FS 2014 Platte . . . |Drucker | . . . . . . | Papier | . . . Datenbanken (CS243) – Speicher- und Zugriffssystem . . . | Platte | . . . 4-52 26 Varianten von (B*-Baum-)Indexen Unmittelbarer Index (direkter Index): • die Blätter enthalten direkt die Datensätze Mittelbarer Index (indirekter Index): • die Blätter enthalten Suchschlüssel und Zeiger (TIDs) auf die Datensätze. Bei Suchschlüsseln mit Duplikaten wird im Blattknoten beim Suchschlüssel eine TID-Liste gespeichert. T Für eine Relation kann es maximal einen unmittelbaren Index, aber beliebig viele mittelbare Indexe geben. Clustered Index: • Die Datensätze sind –nach dem Laden– nach dem Suchschlüssel des Index sortiert gespeichert Unclustered Index: • Es gibt keinen Zusammenhang zwischen dem Suchschlüssel des Index und der Speicherungsreihenfolge der Datensätze. Bemerkung: T Für eine Relation kann es maximal einen clustered Index geben FS 2014 Datenbanken (CS243) – Speicher- und Zugriffssystem 4-53 Beispiel eines mittelbaren, clustered Index B*-Baum-Index über Produktbezeichnung B*-Baum Drucker Maus Papier Platte Blattknoten Indexseiten Datenseiten . . . | Band | . . . . . . |Drucker | ... . . . | Maus | . . . . . . | Papier | . . . . . . | Platte | . . . FS 2014 Datenbanken (CS243) – Speicher- und Zugriffssystem 4-54 27 Beispiel eines mittelbaren, unclustered Index • B*-Baum-Index über Produktbezeichnung B*-Baum Drucker Maus Papier Platte Blattknoten Indexseiten Datenseiten . . . | Maus | . . . . . . |Platte | ... . . . | Band | . . . . . . | Drucker | . . . . . . | Papier | . . . FS 2014 Datenbanken (CS243) – Speicher- und Zugriffssystem 4-55 Speicher- & Zugriffskosten eines mittelbaren B*-Baum-Index Beispiel: Index über Bestellungen.KNr. Annahmen: • Seitengröße: 4 KBytes (mit 96 Bytes Header) • Füllgrad einer Seite: 70% • Anzahl der Tupel in Bestellungen: 10‘000‘000 • Anzahl verschiedener KNr-Werte in Bestellungen: 100‘000 • Für jeden KNr-Wert gibt es gleich viele Tupel in Bestellungen • Länge eines KNr-Werts: 24 Bytes • Länge eines TIDs: 6 Bytes • Länge eines Zeigers auf einen Teilbaum: 6 Bytes Folgerungen: FS 2014 Datenbanken (CS243) – Speicher- und Zugriffssystem 4-56 28 4.6 Hashing • Oftmals werden auch Hash-Verfahren eingesetzt, um Anfragen effizient auszuführen. – Die Speicherung erfolgt in Behältern (buckets) mit Indexwerten von 0 bis N-1. – Für ein beliebiges Element e bestimmt die Hashfunktion h die Position h(e) den Bucket, in dem das Element gespeichert wird. Dabei gilt für die Hashfunktion h: E # [0, N-1] wobei E die Menge aller zu speichernder Elemente ist. – Die Funktion h sorgt dabei für eine „gute“ Verteilung der zu speichernden Elemente. „Gut“ ist hier im Sinne von kollisionsfrei oder zumindest kollisionsarm zu verstehen, wobei eine Kollision dann auftritt, wenn zwei unterschiedliche Elemente auf denselben Bucket abgebildet werden, also h(e1) = h(e2) mit e1 ∫ e2 Da sich Kollisionen im allgemeinen nicht vermeiden lassen (wenn z.B. mehr als N Elemente gespeichert werden sollen) und da normalerweise die zu speichernden Daten bei der Definition von h nicht bekannt sind kommt der Behandlung von Kollisionen beim Hashing ein großer Stellenwert zu. FS 2014 Datenbanken (CS243) – Speicher- und Zugriffssystem 4-57 Behandlung von Kollisionen Zur Behandlung/Behebung von Kollisionen beim Einfügen von Daten in eine Folge mittels Hashing stehen zwei Grundprinzipien zur Verfügung – Verkettung der Überläufer: Bei einem Überlauf wird eine verkettete Liste aller derjenigen Elemente angelegt, die auf die gleiche Indexposition abgebildet werden. Das erste Element belegt dabei den eigentlichen Platz im Bucket, alle weiteren sind dann über Verwese zugreifbar – Sondieren. Dies bezeichnet das Suchen nach einer alternativen Position im Fall einer Kollision. Es gibt mehrere Verfahren für das Sondieren. Die wichtigsten davon sind das lineare Sondieren und das quadratische Sondieren. FS 2014 Datenbanken (CS243) – Speicher- und Zugriffssystem 4-58 29 Kollisionsbehandlung: Verkettung der Überläufer • Unter einem Überläufer versteht man ein Element, das eine bereits komplett gefüllte Position zum Überlauf bringt. Da in einer normalen Hashtabelle pro Bucket nur ein Element gespeichert werden kann, tritt dieser Überlauf bereits mit dem zweiten Element mit gleichem Hashwert auf. Beispiel: 0 20 Gegeben sei ein Feld mit 10 Buckets, h(e) = e mod 10 Einfügen von 20 40 70 90 10 30 60 50 80 100 mit verketteter Liste als Überlaufbehandlung 40 70 90 10 30 60 50 80 100 1 … 9 • Die Verkettung als Kollisionsbehandlungsstrategie kann wiederum entarten und zu einer linearen Liste werden. FS 2014 Datenbanken (CS243) – Speicher- und Zugriffssystem 4-59 Kollisionsbehandlung: Lineares Sondieren … • Die Verkettung von Überläufern benötigt zusätzlichen Speicher, auch wenn evtl. noch freie Positionen im Feld vorhanden sind. Eine Alternative zur Verkettung ist daher die Verwendung von anderen, noch unbesetzten Buckets in der Hashtabelle. Den Prozess des Suchens nach solchen geeigneten Positionen nennt man auch Sondieren. • Beim linearen Sondieren wird ausgehend von der bereits belegten Zielposition h(e) in der Hashtabelle T, also T[h(e)] überprüft, ob die nachfolgenden Positionen T[h(e)+1] , T[h(e)+2], …, T[h(e)+i], … für die Speicherung geeignet sind. Die erste freie Position nach T[h(e)] wird dann für die Speicherung von e verwendet. Dabei wird implizit auch wieder die Hashfunktion angewandt, da die nachfolgenden Elemente eigentlich auch wieder modulo der Feldgröße N bestimmt werden (man setzt also beim Sondieren die Suche nach einem freien Bucket vorne fort, wenn man am Ende der Hashtabelle angekommen ist). T[(h(e) + 1) mod N] , T[(h(e) + 2) mod N], …, T([h(e) + i) mod N] FS 2014 Datenbanken (CS243) – Speicher- und Zugriffssystem 4-60 30 … Kollisionsbehandlung: Lineares Sondieren … • Das lineare Sondieren hat natürlich Auswirkungen auf die Suche. Bei einem gegebenen Element e muss zunächst dessen Hashwert berechnet werden. Ist die zugehörige Position durch ein Element e' ∫ e belegt, dann muss in der Sondierreihenfolge weitergesucht werden, bis Element e gefunden wurde oder bis eine unbesetzte Position gefunden ist. Um dies zu garantieren darf beim Löschen der Wert nicht aus seiner Position entfernt werden sondern muss lediglich als gelöscht gekennzeichnet werden. Beispiel: Gegeben sei ein Feld mit 10 Buckets, h(e) = e mod 10 Einfügen von 89 18 49 58 69 28 0 1 49 58 FS 2014 2 3 69 28 4 5 6 7 8 9 18 89 Datenbanken (CS243) – Speicher- und Zugriffssystem 4-61 … Kollisionsbehandlung: Lineares Sondieren Neben dem Sondieren der jeweils nachfolgenden Position sind die folgenden Varianten des linearen Sondierens verbreitet: – Anstelle des Inkrements 1 wird jeweils um den konstanten Wert c > 1 weiter gesprungen T[(h(e)+c) mod N] , T[(h(e)+2·c) mod N], …, T([h(e)+i·c) mod N] Dabei muss der Wert c in Abhängigkeit der Feldgröße N gewählt werden, damit auch möglichst alle Positionen abgedeckt werden (z.B. wenn c und N teilerfremd sind, also: ggT(c, N) = 1) – Die Sondierung wird alternierend in beiden Richtungen durchgeführt T[(h(e)+1) mod N], T[(h(e)-1) mod N], T[(h(e)+2) mod N], T[(h(e)-2) mod N], … FS 2014 Datenbanken (CS243) – Speicher- und Zugriffssystem 4-62 31 Quadratisches Sondieren … Das lineare Sondieren (insbesondere mit Inkrement 1 oder bei alternierendem Sondieren) tendiert zur Bildung von „Klumpen“, in denen alle Positionen bereits besetzt sind und durch die sich lange Sondierungsfolgen aufbauen. Das quadratische Sondieren vermeidet dieses Problem, indem eine Folge von Quadratzahlen für die Sondierabstände genommen werden (die Abstände erhöhen sich also mit jeden Fehlversuch, eine freie Position zu finden) Falls eine Position T[h(e)] bereits besetzt ist, dann werden der Reihe nach die folgenden Positionen überprüft: T[(h(e)+1) mod N] , T[(h(e)+4) mod N], T[(h(e)+9) mod N], …, T([h(e)+i2) mod N] Auch hier kann man wieder die Variante des alternierenden Sondierens in beide Richtungen anwenden: T[(h(e)+1) mod N], T[(h(e)-1) mod N], T[(h(e)+4) mod N], T[(h(e)-4) mod N], …, T([h(e)+i2) mod N], T([h(e)-i2) mod N], … FS 2014 Datenbanken (CS243) – Speicher- und Zugriffssystem 4-63 … Quadratisches Sondieren Beispiel: 0 49 FS 2014 Gegeben sei ein Feld mit 10 Buckets, h(e) = e mod 10 Einfügen von 89 18 49 58 69 28 (ohne alternierendes Sondieren) 1 2 3 58 69 4 5 6 7 8 9 28 18 89 Datenbanken (CS243) – Speicher- und Zugriffssystem 4-64 32 Komplexität des Hashens • Die Effizienz einer Hashspeicherung basiert sehr stark auf der Güte der verwendeten Hashfunktion • Bei einer guten Hashfunktion ist die Wahrscheinlichkeit, dass ein Element e auf Position j (0 § j § N-1) abgebildet wird gleich gross für alle j und damit 1/N. Sind in einer Hashtabelle m Elemente abgespeichert, dann wird der Füllgrad dieser Tabelle zu a = m/N bestimmt. • Im Fall ohne Kollision ist für das Einfügen von e lediglich h(e) zu berechnen und es muss der Wert in die berechnete Position geschrieben werden. Beides geschieht in konstanter Zeit O(1) • Analog muss für das Suchen die Position h(e) bestimmt werden und es erfolgt ein Zugriff auf die berechnete Position, beides mit Aufwand O(1). • Analog ist auch die Komplexität des Löschens O(1) falls keine Kollision vorliegt. Falls man Elemente tatsächlich löscht und nicht nur als gelöscht markiert, dann ist beim Sondieren ein komplettes Re-hashen erforderlich (alle Elementpositionen werden neu berechnet). Der Aufwand des Re-Hashens ist O(m). FS 2014 Datenbanken (CS243) – Speicher- und Zugriffssystem 4-65 Komplexität des Hashens mit Sondieren … • Die praktische Verwendung von Hashtabellen zeigt, dass sich bei einem Füllgrad a > 0.8 (mehr als 80%) und der Verwendung von Sondierverfahren das Verhalten beim Einfügen und Suchen drastisch verschlechtern kann. • a bestimmt nicht nur den Füllgrad der gesamten Hashtabelle sondern gibt auch die Wahrscheinlichkeit an, mit der eine bestimmte Position h(e) der Tabelle bereits belegt ist. Bei einer Kollision wird mittels Sondieren eine neue Position bestimmt, die ebenfalls mit der Wahrscheinlichkeit a bereits belegt ist. Daher lässt sich die Wahrscheinlichkeit, mit der die beiden ersten Versuche zur Speicherung von e zu einer belegten Position führen mit a2 abschätzen. • Der Aufwand für die erfolglose Suche (das gesuchte Element befindet sich nicht in der Hashtabelle) berechnet sich zunächst aus dem ersten Zugriff, mit Wahrscheinlichkeit a einen zweiten, mit a2 einen dritten, mit ai einen i+1-ten, usw. Insgesamt ergibt sich die Summenformel 1 + a + a2 + a3 + … = 1/ 1-a Eine halb gefüllte Hashtabelle erfordert demnach im Mittel 2 Zugriffe, bei einem Füllgrad von 90% sind es bereits 10. FS 2014 Datenbanken (CS243) – Speicher- und Zugriffssystem 4-66 33 … Komplexität des Hashens mit Sondieren • • Der Aufwand für die erfolgreiche Suche ist etwas besser als die der erfolglosen Suche, da bei die erfolgreiche Suche nach einem Treffer endet, die erfolglose Suche jedoch bis zum ersten freien Platz fortgesetzt werden muss. Der Aufwand für die erfolgreiche Suche (erwartete mittlere Anzahl von Sondierungen) lässt sich zu 1/a · ln(1/ 1-a) berechnen (ohne Beweis) Für einen hohen Füllgrad (großes a) spielt der Faktor 1/a keine entscheidende Rolle und kann vernachlässigt werden. Es dominiert daher ln(1/ 1-a), das aber deutlich langsamer wächst als 1/ 1-a bei der erfolglosen Suche. FS 2014 Datenbanken (CS243) – Speicher- und Zugriffssystem 4-67 Dynamische Hashverfahren Ein Problem der bisher betrachteten Hashverfahren ist ihre mangelnde Dynamik: – der Wertebereich (die Bucket-Adressen) von 0 bis N-1 sind fest vorgegeben – Falls die zu verwaltende Datenmenge steigt und sich der Füllgrad a erhöht, wird auch das Antwortverhalten der Hashtabelle entsprechend schlechter. – Die Erhöhung der Anzahl der Buckets erfordert ein komplettes Re-Hashen aller bereits gespeicherter Daten, besitzt also den Aufwand O(m) Das Ziel der dynamischen Hash-Verfahren ist es, dynamisch wachsende und schrumpfende Wertebereiche zu unterstützen. FS 2014 Datenbanken (CS243) – Speicher- und Zugriffssystem 4-68 34 Dynamisch erweiterbarer Wertebereich … • • Wenn der Füllgrad in einer Hashtabelle zu gross wird, dann sollte der Wertebereich (also die Anzahl der Buckets) entsprechend erhöht werden. Eine Variante des dynamischen Hashens verdoppelt jedes Mal den Wertebereich, wenn der Füllgrad einen Schwellwert überschreitet Dies lässt sich realisieren durch die Definition einer Familie von Hashfunktionen hi: E # [0, …, (2i·N)-1] die über i indiziert werden. Für i = 0 ist h0 die bereits bekannte Abbildung h0: E # [0, …, N-1] Der Wert von i wird auch als Level der Hashfunktion bezeichnet. • Wenn der Wertebereich erhöht werden soll, dann wird einfach das Level der Hashfunktion um eins erhöht, die Anzahl der Buckets wird dadurch verdoppelt. FS 2014 Datenbanken (CS243) – Speicher- und Zugriffssystem 4-69 … Dynamisch erweiterbarer Wertebereich Um beim Übergang von einem Level zum nächsten die gespeicherten Elemente nicht komplett umverteilen bzw. neu auf die doppelte Anzahl Buckets verteilen zu müssen, fordert man für die Hashfunktion folgende Bedingung: – hi+1(w) = hi(w) für etwa die Hälfte aller w œ E – hi+1(w) = hi(w) + 2i·N für die andere Hälfte Die Elemente, die einem Bucket durch hi zugeordnet wurden, lassen sich daher durch hi+1 auf zwei Buckets verteilen: – entweder auf j (d.h. sie bleiben an Ort und Stelle) oder – auf j+(2i·N) Diese Eigenschaft ist beispielsweise dann gegeben, wenn anstelle von einer Familie von Hashfunktionen genau eine Hashfunktion h* gewählt wird, die einen Wert w auf einen Bitstring abbildet. Von diesem Bitstring wird zunächst nur das erste Bit verwendet. Bei jeder nötigen Verdopplung der Buckets wird einfach ein weiteres Bit der bereits errechneten Hash-Werte betrachtet. FS 2014 Datenbanken (CS243) – Speicher- und Zugriffssystem 4-70 35 4.7 Indexe in SQL Das Anlegen von Indexen ist in SQL nicht standardisiert. Es hat sich aber in den meisten kommerziellen Datenbanksystemen folgende Syntax eingebürgert: CREATE [UNIQUE] INDEX index-name ON table ( column {"," column} ) ... DROP INDEX index-name; Ein Index über den Attributen A1, A2, ..., Ak erlaubt die effiziente Bestimmung aller Treffer für Prädikate der Form – A1 = wert1 AND A2 = wert2 AND ... Aj = wertj (für 0 < j < k+1) – sowie (in der „Standardimplementierung“) einen Relationen-Scan, bei dem die Tupel sortiert nach A1 || A2 || ... || Aj zurückgeliefert werden. FS 2014 Datenbanken (CS243) – Speicher- und Zugriffssystem 4-71 Vergleich B*-Bäume und Hash-Tabellen Welche Anfragen werden häufig gestellt ? • Exact Match Queries SELECT A1, …, An FROM R WHERE Ai = const • Range Queries SELECT A1, …, An FROM R WHERE Ai > consti1 AND Ai < consti2 SELECT A1, …, An FROM R WHERE Ai < consti AND Aj < constj FS 2014 Datenbanken (CS243) – Speicher- und Zugriffssystem 4-72 36 Problem des Physischen Datenbankentwurfs • Gegeben: – Datenbankschema (als Resultat des "logischen" Datenbankentwurfs) – Lastprofil: • Anfragetypen und deren Häufigkeiten • Änderungsoperationen und deren Häufigkeiten – Kosten-basierte Restriktionen (z.B. bzgl. Speicherplatz) • Gesucht: – Festlegung von Speicherungsstrukturen und Zugriffspfaden (das physische Datenbankschema), so dass die mittlere Antwortzeit bzw. die mittleren Zugriffskosten minimiert werden. T Aufgabe des DBA bzw. Performance-Spezialisten T mathematische Optimierungsmodelle, "Tuning-Werkzeuge" FS 2014 Datenbanken (CS243) – Speicher- und Zugriffssystem 4-73 37