Datenbanksysteme I WS 2012/13 - Übung 0 Bernhard Pietsch Friedrich-Schiller-Universität Jena Lehrstuhl für Datenbanken und Informationssysteme Organisatorisches (I) • http://www.informatik.unijena.de/dbis/lehre/ws2012/dbs1/index.html – Prüfungsmodalitäten – Organisatorisches und Hinweise – Ergänzende Materialien zur Vorlesung und Übung • Klausur: 18. Februar 2013 16.00 - 17.30 Uhr HS 1, Carl-Zeiss-Str. 3 • Klausurteilnahme nur für angemeldete Studenten: – B.Sc.: elektronisch über Friedolin – Diplom und M.Sc.: schriftlich über Formular 2 DBS1-Übung 29.10.2012 Organisatorisches (II) • 2 Übungsgruppen – Mo, 14:15 – 15:45 Uhr, SR 130 CZ – Do, 08:15 – 9:45 Uhr, SR 226 CZ – Einschreibung per Friedolin 3 • 7 Übungstermine – Vertiefung und praktische Erprobung des Vorlesungsstoffes – Vorbereitung auf die Klausur • 1. Übungstermin: Zugriffspfade – Motivation – Mehrwegbäume (B-Bäume, B*-Bäume) – Streuspeicherverfahren (Hashing, Extendible Hashing) • 2. - 7. Übungstermin: – Besprechung der Aufgabenblätter DBS1-Übung 29.10.2012 Seite / Page • grundlegende Einheit der Datenspeicherung in DBMS • Dateneinheit fester Größe, welche bei den meisten DBMS von Datenbankadministrator festgelegt werden kann • Typische Seitengrößen sind 4,8,16 oder 32 KB • enthält einen Header und eine Menge von Datensätzen Header 3240 3233 3235 11 17 23 7 Küspert Göbel Büchse Eichner 3204 40 Pietsch 3233 69 Koch 3240 42 Friedel 3244 Header 12 Rossak 3243 • Datensätze werden seitenweise auf Externspeicher abgelegt • Um schnellen Zugriff zu erzielen, werden einige Seiten im Arbeitsspeicher gepuffert 4 DBS1-Übung 29.10.2012 Zielstellung der Ablage • Ablage von Daten soll einfachen, schnellen und inhaltsbezogenen Zugriff ermöglichen – Bsp: "Gib mir alle Angestellten, die im Raum 3240 arbeiten und deren Nachname mit „B“ beginnt.“ • Randbedingungen – Große Datenmengen nicht komplett im Hauptspeicher ablegbar – I.d.R. mehr Suchanfragen als Änderungen auf Informationen Header 3240 3233 3235 5 11 17 23 7 Küspert Göbel Büchse Eichner 3204 40 Pietsch 3233 69 Koch 3240 42 Friedel 3244 DBS1-Übung Header 12 Rossak 3243 29.10.2012 Zugriffspfade • Motivation: Sequentielle Suche über GB/TB an Daten nicht akzeptabel • Zielstellung: – Minimierung der Anzahl von Externspeicherzugriffen (Latenz um Faktor 106 langsamer als beim Arbeitsspeicher) – Zugriff auf Daten mit konstantem oder logarithmischem Aufwand durch zusätzliche Speicherpfade • Zielkonflikt: Zugriffsbeschleunigung vs. Aktualisierungsaufwand Header 3240 3233 3235 6 11 17 23 7 Küspert Göbel Büchse Eichner 3204 40 Pietsch 3233 69 Koch 3240 42 Friedel 3244 DBS1-Übung Header 12 Rossak 3243 29.10.2012 Speicherstrukturen Entnommen aus Datenbanksysteme: Konzepte und Techniken der Implementierung von Theo Härder, Erhard Rahm 7 DBS1-Übung 29.10.2012 Mehrwegbäume • Ausgangspunkt: vollständig balancierter binärer Suchbaum – – Abbildung der Knoten inkl. ausgehender Kanten auf eine Seite Pro Knoten aber nur ein Schlüsselwert Seiten sind nur zu einem Bruchteil ausgelastet geringer Verzweigungsgrad und große Baumhöhe viele Seitenzugriffen und somit viele Externspeicherzugriffe • Zielstellung der Mehrwegbäume – Zusammenfassung mehrerer Sätze/Schlüssel zu einem Knoten – Höherer Verzweigungsgrad führt zu niedriger Baumhöhe – Kompromiss für wahlfreien Schlüsselzugriff und sortierte Verarbeitung – Aufwand von Änderungsoperationen akzeptabel • Beispiele: B- und B+, B*-Baum 8 DBS1-Übung 29.10.2012 B-Baum • Vorschlag von R. Bayer und E. McCreight (1970) • Daten und Suchinformationen in Baumstruktur angeordnet • Baumknoten werden auf Seiten abgebildet, die vom DBMS verwaltet werden • Seiten- bzw. Knotenaufbau: • Beispielknoten: ... 9 ... DBS1-Übung ... 29.10.2012 B-Baum • Definition eines B-Baums mit Ordnung n: – Jeder Weg von der Wurzel zum Blatt hat die gleiche Länge h – Jeder Knoten (außer Wurzel und Blätter) hat mindestens n+1 Söhne. Die Wurzel ist ein Blatt oder hat mindestens 2 Söhne. Jedes Blatt besitzt mindestens n Einträge. – Jeder Knoten hat höchstens 2n+1 Söhne • Beispiel mit n=2: • Beschränkung der Höhe für N Datensätze (N>0): N +1 log 2n +1 ( N +1 )≤h≤log n +1 ( ) 2 10 DBS1-Übung 29.10.2012 Suchen im B-Baum 11 DBS1-Übung 29.10.2012 Einfügen im B-Baum (I) 12 DBS1-Übung 29.10.2012 Einfügen im B-Baum (II) 13 DBS1-Übung 29.10.2012 Löschen im B-Baum (I) 14 DBS1-Übung 29.10.2012 Löschen im B-Baum (II) 15 DBS1-Übung 29.10.2012 Löschen im B-Baum (III) 16 DBS1-Übung 29.10.2012 Löschen im B-Baum (IV) 17 DBS1-Übung 29.10.2012 Löschen im B-Baum (V) 18 DBS1-Übung 29.10.2012 Bewertung • B-Baum ist robust gegen Entartung durch Reorganisation • Ordnung n beeinflusst Effizienz – großes n niedrige Baumhöhe bessere Performance • Jede zusätzliche Seitenanforderung kostet viel Zeit ( Pufferverwaltung) • Wurzelknoten möglichst im Hauptspeicher halten – ABER: n ist durch Seitengröße beschränkt (z.B. 4, 8, 16 KB) • Doppelrolle der Schlüsselwerte si – si bildet ab auf Datensatz di und ist Weiche zur Suchsteuerung – Datenteil für Suchsteuerung nicht erforderlich – Idee: Datenteile nur auf Blattebene speichern B+-Baum 19 DBS1-Übung 29.10.2012 B+-Baum 20 DBS1-Übung 29.10.2012 B+-Baum • Häufigste Art der Index-Implementierung in DBMS • Indexbaum: – – – keine Datensätze, sondern Schlüssel und Zeiger auf Kinder Datensätze befinden sich ausschl. in der Blattebene des B+-Baums Gesamtbaum somit flacher als B-Baum Platz für mehr Schlüssel bei fester Seitengröße • Lösch-Vorgang einfacher als im B-Baum – Daten werden nur in Blättern entfernt – Schlüssel in inneren Knoten bleiben als Wegweiser erhalten Weniger Seiten müssen geändert werden 21 DBS1-Übung 29.10.2012 Verkettung der Blätter im B+-Baum • Blattfolge entspricht sequentieller Datei, üblicherweise mit (doppelter) Verkettung zwischen den Seiten Gleiche logarithmische Zugriffszeit für alle Daten sequentieller sortierter Zugriff und wahlfreier Schlüsselzugriff sind effizient Bereichsanfragen, Extremwertanfragen 22 DBS1-Übung 29.10.2012 B+-Bäume in der Praxis • Typische Werte: • Ordnung: 100 • Höhe: 3 - 4 • Füllfaktor: 70% • Durchschnittliche Anzahl von Söhnen: ~133 • Daraus resultierende Kapazitäten: – Höhe 3: 1333 = 2,352,637 Sätze – Höhe 4: 1334 = 312,900,700 Sätze • Pufferung der obersten Stufen: – Ebene 0: 1 Seite = 8 KB – Ebene 1: 133 Seiten = 1 MB – Ebene 2: 17,689 Seiten = 133 MB 23 DBS1-Übung 29.10.2012 Historie und Terminologie • Überblick der Baumarten: – D. Comer: The Ubiquitous B-Tree. ACM Computing Surveys, 11:2, Juni 1979, pp. 121-137. • Originalpublikation B-Baum: – R. Bayer, E. M. McCreight: Organization and Maintenance of Large Ordered Indexes. Acta Informatica, 1:4. 1972. 290306. • Originalpublikation B*-Baum: – D. E. Knuth: The Art of Computer Programming, Vol. 3, Addison-Wesley, 1973. • Heutige Literatur: B*-Baum = B+-Baum 24 DBS1-Übung 29.10.2012 Speicherstrukturen Entnommen aus Datenbanksysteme: Konzepte und Techniken der Implementierung von Theo Härder, Erhard Rahm 25 DBS1-Übung 29.10.2012 Statisches Hashing: Beschreibung • Hashtabelle als Indexstruktur ("Von der Ordnung ins Chaos") • Verwendung von Streuspeicherverfahren bzw. Hashfunktionen – Berechnung der Speicheradresse eines Datensatzes über den Schlüssel (Schlüsseltransformation) – Hashfunktion h(x) liefert die Seite (Bucket) bzw. Speicheradresse mit dem Dateneintrag zu Schlüssel x • Beispiel einer Hashfunktion: "Divisionsrestverfahren" – Geeignete Division des Schlüssels – Rest der Division ergibt die relative Adresse in der Hashtabelle 26 DBS1-Übung 29.10.2012 Statisches Hashing: Hashfunktion • Hashfunktion h: S {1, 2, ..., n} – S = Schlüsselraum, n = Größe des statischen Hash-Bereichs (Anzahl der Buckets) – Idealfall: h ist injektiv (keine Kollisionen) • Nur in Ausnahmefällen möglich • Jeder Satz kann mit einem Seitenzugriff referenziert werden – Ziel: möglichst gute Gleichverteilung einer konkreten Schlüsselmenge 27 DBS1-Übung 29.10.2012 Statisches Hashing: Operationen (vereinfacht) • Gegeben: – Hashfunktion h, Wertebereich der Hashfunktion W, mit h: S W – Datensatz Di mit Schlüssel Ki • Einfügen – Generierung der zukünftigen Speicheradresse: h(Ki) = Wi – Datensatz Di mit Schlüssel Ki wird auf Adresse Wi gespeichert • Direkte Suche – Ermittlung der zugehörigen Speicheradresse: h(Ki) = Wi – Bereitstellung von Datensatz Di mit Schlüssel Ki von Adresse Wi 28 DBS1-Übung 29.10.2012 Statisches Hashing: Operationen (vereinfacht) II • Gegeben: – Hashfunktion h, Wertebereich der Hashfunktion W, mit h: S W – Datensatz Di mit Schlüssel Ki • Löschen – Ermittlung der zugehörigen Speicheradresse: h(Ki) = Wi – Datensatz Di mit Schlüssel Ki wird auf Adresse Wi gelöscht • Sequentielle Suche – Sequentieller Durchlauf des Wertebereichs W = W1 ... Wn – Keine geordnete Schlüsselfolge keine sequentielle Suche möglich! 29 DBS1-Übung 29.10.2012 Statisches Hashing: Kollision • Definition: – Zwei Schlüssel Ki und Kn kollidieren bezüglich einer Hashfunktion h, wenn gilt: h(Ki) = h(Kn) – Ki und Kn nennt man dann auch Synonyme, sie gehören zu einer Kollisionsklasse • Kollisionsbehandlung umfasst folgende Aufgaben – Einfügen: Finden einer freien Speicheradresse beim Einfügen – Suchen: Auffinden eines Schlüssels, der nicht auf der Adresse gespeichert wurde, die die Hashfunktion bestimmt Alle Operationen werden durch Kollisionsbehandlung komplexer • Viele Hashfunktionen (z.B. Modulo) bilden eine größere Schlüsselmenge in einen kleineren Wertebereich ab Kollision ist dann zwangsläufig 30 DBS1-Übung 29.10.2012 Statisches Hashing: Kollisionsbehandlung • Offenes Hashen – Kollisionen werden im Primärbereich untergebracht • Suche einer anderen noch nicht belegten Adresse in der Hashtabelle • Lineares/quadratisches Sondieren, Doppeltes Hashen – Gleiche Strategie beim Wiederauffinden – Lösch-Problematik: Einträge dürfen nicht einfach gelöscht werden, sonst herrschen veränderte Voraussetzungen (Lösung: Delete-Flag) h(Kx) = h(Km) Kx 31 Km Ki Kx Ko DBS1-Übung 29.10.2012 Statisches Hashing: Kollisionsbehandlung II • Geschlossenes Hashen – Kollisionen werden im separaten Überlaufbereich gespeichert • Überlaufbereich für alle Kollisionen • Überlaufbereich pro Adresse – Gefahr der Entartung • Überlauflisten werden zu lang • Performance sinkt (Suche in einer Liste!) h(Kx) = h(Km) Kx Km Ki Kx Ko 32 DBS1-Übung 29.10.2012 Statisches Hashing: Fazit • Vorteile: – Bei Kollisionsfreiheit: Suchen/Einfügen/Löschen in O(1) • Nachteile: – Meist Kollisionsbehandlung nötig: Suchen/Einfügen/Löschen in O(n) – Kein sequentieller Zugriff auf Daten möglich – Hashfunktion entscheidend für die Qualität des Hashverfahrens • beeinflusst Performance, Berechnungs-Komplexität, Datenverteilung und Kollisions-Wahrscheinlichkeit • Es gibt keine optimale Hashfunktion für beliebige Schlüsselmengen! – Ineffizienz bei unvorhersehbaren / stark wachsenden Datenmengen • Primärbereich anfangs überdimensioniert (a priori Allokation des benötigten Speichers), Freihalten von Leerstellen • Wachsende Überlaufketten verschlechtern Laufzeitverhalten • Nachträgliche Vergrößerung der Hashtabelle (Re-Hash) teuer / nicht möglich (24h-Dauerbetrieb!) Übergang zum Erweiterbaren Hashing (Fagin et al, 1979) 33 DBS1-Übung 29.10.2012 Erweiterbares Hashing: Ziele • Dynamisches Wachsen und Schrumpfen des Wertebereichs der Hashfunktion – Buckets werden erst bei Bedarf bereitgestellt – Dichte Speicherplatzbelegung möglich – Vermeidung von Überlaufmechanismen und totaler Reorganisation • Konstantes Laufzeitverhalten – Zugriffszeit unabhängig vom Umfang des Datenbestands – Auffinden eines Satzes soll nicht mehr als zwei Seitenzugriffe erfordern 34 DBS1-Übung 29.10.2012 Erweiterbares Hashing: Beschreibung • Hashtabelle gegliedert in zwei Bereiche – Directory (Inhaltsverzeichnis) – Eigentliche Hashbuckets • Zugriff zu den Werten in den Hashbuckets nur über Directory möglich – Zusätzliche Indirektion (evtl. Externspeicherzugriff!) – Notwendiges Hilfsmittel für die gewünschten Erweiterungseigenschaften • Bucket mit fester Länge (z.B. Seitengröße 4KB) und Kapazität b – Abhängig von den zu hashenden Daten (Wertlänge) – Abhängig von Datenintegration (Einbettung vs. Auslagerung) • Hashfunktion h generiert Pseudoschlüssel zu einem Satz x 35 DBS1-Übung 29.10.2012 Erweiterbares Hashing: Realistische Werte • Bucketkapazität: b=100, b=1000 – Abhängig von der Seitengröße (2, 4, 8, 16 KB, etc.) – Abhängig von Wahl der Einbettung (eingebetteter vs. ausgelagerter Ansatz) • h(x) mit h: S [0, 232-1] – Gewährleistet hinreichend viele Bitpositionen 36 DBS1-Übung 29.10.2012 Erweiterbares Hashing: Beispiel (1) • Ein leeres Bucket mit Bucket-Kapazität b = 4 • Hashfunktion h(x) = x mod 32 • Lokale Tiefe eines Bucket d‘: Anzahl von Bits, die benötigt wird, um zu entscheiden, ob ein Eintrag in dieses Bucket gehört • Globale Tiefe des Directory d: Maximale Anzahl Bits, die benötigt wird, um zu entscheiden, in welches Bucket ein Eintrag gehört (d = max(d‘)) d‘ = 0 d=0 37 DBS1-Übung B1 29.10.2012 Erweiterbares Hashing: Beispiel (2) • Schrittweiser Aufbau einer Hashtabelle durch sukzessives Einfügen einiger Werte in der vorgegebenen Reihenfolge: • Einfügen von Werten 134, 8, 113 und 89 – Alle Werte in Bucket B1 38 DBS1-Übung 0 x h(x) [h(x)]2 134 6 00110 8 8 01000 113 17 10001 89 25 11001 20 20 10100 118 22 10110 30 30 11110 107 11 01011 37 5 00101 77 13 01101 B1 134 8 113 89 0 29.10.2012 6 [00110] 8 [01000] 17 [10001] 25 [11001] Erweiterbares Hashing: Beispiel (3) / Split 1 • Im Beispiel: Einfügen von Wert 20 1 – Bucket-Überlauf in B1 0... – Splitting von B1 1... B1 1 • Allokation eines neuen Buckets B2 mit d‘(B2) = d‘(B1) B2 134 8 6 [00110] 8 [01000] 113 20 89 17 [10001] 20 [10100] 25 [11001] • Erhöhung der lokalen Tiefen von B1 und B2 um 1 Hinweis: mögliche weitere lokale Tiefen werden nicht verändert • Hashfunktion h generiert Pseudoschlüssel der Einträge • Füllen der Buckets: jedes Bucket enthält nur Sätze, deren Pseudoschlüssel in den ersten d' Bits übereinstimmen • Falls d ≠ max(d‘): – Erhöhung der globalen Tiefe um 1 – Directory enthält 2d Einträge verdoppelt sich mit jedem zusätzlichen Bit 39 DBS1-Übung 29.10.2012 Erweiterbares Hashing: Beispiel (4) 1 • Einfügen des Werts 118 – Suche des zugehörigen Buckets ergibt B2 aufgrund 1. Bitposition 1 B1 1 1... B2 • Einfügen des Werts 30 • Erhöhung globaler Tiefe (d=2) • Directory-Verdopplung 1 2 B1 DBS1-Übung 113 20 118 89 17 [10001] 20 [10100] 22 [10110] 25 [11001] 134 8 6 [00110] 8 [01000] 113 20 118 17 [10001] 20 [10100] 22 [10110] 89 30 25 [11001] 30 [11110] 00... 01... 2 B2 10... 11... 2 – Differenzierung bei Neuverteilung gemäß ersten zwei Bits im Hashwert – Bucket B1 bleibt unverändert mit lokaler Tiefe d'=1 40 6 [00110] 8 [01000] 0... – Freie Kapazität in B2 (|B2| < b) – Bucket-Überlauf in B2 Splitting und Erhöhung der lokalen Tiefe (d'=2) in Buckets B2 und B3 134 8 B3 29.10.2012 Erweiterbares Hashing: Beispiel (5) • Einfügen der Werte 107, 37 und 77 – Wert 107 wird in Bucket B1 abgelegt durch Zuordnung über "01..." – Wert 37 wird in Bucket B1 abgelegt durch Zuordnung über "00..." – Bucket-Überlauf in B1 bei Wert 77, Splitting in B1 und B4 – Erhöhung der lokalen Tiefe für Bucket B1 und B4 (d'=2) – Keine Directory-Verdopplung, da weiterhin die globale Tiefe mit d=2 (d=max(d')) bleibt 41 DBS1-Übung 2 B1 2 2 00... B4 01... 10... 2 B2 11... 37 134 5 [00101] 6 [00110] 8 107 77 8 [01000] 11 [01011] 13 [01101] 113 20 118 17 [10001] 20 [10100] 22 [10110] 89 30 25 [11001] 30 [11110] 2 B3 29.10.2012 Erweiterbares Hashing: Operationen • Gegeben: – Hashfunktion h, Buckets B1 ,… , Bn mit Kapazität b – Datensatz D mit Schlüssel K • Suche von D: – Anwendung der Hashfunktion h(K) ergibt Pseudoschlüssel für Directory – Ermittlung des zugeordneten Buckets Bi über das Directory – Durchsuchen von Bucket Bi nach K (z.B. mit binärer Suche) • Einfügen von D: – Suche von D gefunden? • Ja: Fehlermeldung, fertig! • Nein: Ist noch Platz im Bucket Bi, also |Bi|<b? – Ja: Einfügen von D in Bucket Bi – Nein: Splitting von Bucket Bi zwei neue Buckets » Lokale Neuverteilung der Einträge aus Bi und Verweiskorrektur » Eventuell Verdopplung des Directory wegen Selektivität 42 DBS1-Übung 29.10.2012 Erweiterbares Hashing: Fazit • Hashfunktion sollte gut gewählt sein – Möglichst "zufälliges" Ergebnis – h(x) sollte an jeder Bitposition den Wert 0/1 mit gleicher Wahrscheinlichkeit (0.5) generieren – Hashverfahren reagieren empfindlich auf unausgewogene Hashfunktionen 43 DBS1-Übung 29.10.2012 Erweiterbares Hashing: Sonderfall 1 (Entartung) • Eine Einfügung kann mehrere Directory-Verdopplungen zur Folge haben – Alle betrachteten b+1 Hashwerte h(x) haben an Position i den gleichen Wert 0 oder 1 – Bei guter Hashfunktion und großer Bucketkapazität b sehr selten – Beispiel: • b=2, h(x): S [0, 31] • Einfügereihenfolge: 2 (00010), 3 (00011), 6 (00110) 44 DBS1-Übung 29.10.2012 Extendible Hashing vs. B+-Baum • Speicherplatzbelegung: – Extendible Hashing: ≈ 70% [ln2] für gesamten (!) HashBucket-Bereich (nur Einfügen, ideale Hashfunktion) Zusatzaufwand (Speicher) für Directory moderat (anwachsend) – B+-Baum: ≈ 70% [ln2] Füllgrad der Baumknoten • Wahlfreier Zugriff – Extendible Hashing: O(1) durch Anwenden der Hashfunktion – B+-Baum: O(log n N) durch Abstieg im Indexbaum • Sequentieller Zugriff: – Extendible Hashing: Keine direkte Unterstützung – B+-Baum: Abstieg im Baum und Nutzung der verketteten Blattebene 45 DBS1-Übung 29.10.2012