Datenbank- und Informationssysteme - Ergänzungsfach B.A. - Übung - Speicherstrukturen und Datenzugriff Wintersemester 2010/2011 Institut für Informatik Lehrstuhl für Datenbanken und Informationssysteme Dipl.-Inf. Matthias Liebisch 02.11.2010 Datenbank- und Informationssysteme Friedrich-Schiller-Universität Jena Seite 1 Organisatorisches (1) Vorlesung "Datenbank- und Informationssysteme" - Vorlesungszeit im Wintersemester 18.10.2009 – 11.02.2010 - Dienstag, 12-14 Uhr (Vorlesung und Übung im Wechsel) - Mittwoch, 16-18 Uhr (Vorlesung) Konkrete Übungstermine: - 02.11. (Vertiefung Speicherstrukturen und Datenzugriff) - 16.11. (Übungsblatt 1) - 30.11. (Übungsblatt 2) - 14.12. (Übungsblatt 3) - 20.12. – 31.12. Weihnachten/Silvester (Bergfest) - 11.01. (Übungsblatt 4) - 25.01. (Übungsblatt 5) - 08.02. (Übungsblatt 6) Datenbank- und Informationssysteme Friedrich-Schiller-Universität Jena Seite 2 Organisatorisches (2) Ablauf der Übung - Übungsblätter werden schrittweise im Netz bereitgestellt, jeweils 1 Woche vor dem Übungstermin - URL: http://www.minet.uni-jena.de/dbis/ Lehrveranstaltungen Datenbank- und Informationssysteme (Ergänzungsfach B.A.) Material - Eigenständige Bearbeitung/Lösung der Aufgabe - Besprechung während der Übung, keine Abgabe/Korrektur Zielstellung - Vertiefung und praktische Erprobung der Vorlesungsinhalte - Vorbereitung auf die Prüfung/Klausur Datenbank- und Informationssysteme Friedrich-Schiller-Universität Jena Seite 3 Inhalt Motivation B-Baum B*-Baum Statisches Hashing Erweiterbares Hashing Datenbank- und Informationssysteme Friedrich-Schiller-Universität Jena Seite 4 Datensystem Anfrageübersetzung/-optimierung Query Optimizer Zugriffspfadauswahl Zugriffskontrolle/Integritätskontrolle WIE prozedural FINDE nächsten Satz SPEICHERE Satz (log.) Zugriffssystem satzorientierte Schnittstelle (log.) Katalogverwaltung Sortierkomponente Sperrverwaltung SPEICHERE internen Satz FÜGE Eintrag im B*-Baum ein Speichersystem interne Satzschnittstelle (phys.) Record Manager Zugriffspfadverwaltung Logging/Recovery (Fehlerbeh.komp.) BEREITSTELLEN Seite j FREIGEBEN Seite j Pufferverwaltung Systempufferschnittstelle Systempufferverwaltung (Buffer Manager) Betriebssystem/ Dateiverwaltung Dateischnittstelle LIES Block k SCHREIBE Block k Externspeicherverwaltung/Dateiverwaltung Härder/Rahm 2001 Datenbank- und Informationssysteme DB Friedrich-Schiller-Universität Jena Datenbank-Verwaltungssystem deskriptive, mengenorientierte Schnittstelle (z.B. SQL) SELECT . . . FROM . . . WHERE Betriebssystem/ Dateisystem Anwendungsprogramme/Benutzer deskriptiv WAS Anwendung Motivation: 5-Schichten-Architektur (DIAM) Seite 5 Motivation: Grundlagen Abbildung der Datenbankobjekte auf interne Datensätze? - 1:1, Aufspalten oder Zusammenfassen von Entities - Ablage von Datensätzen variabler Länge in Seiten fester Größe - Zugriff auf Datensätze über Adressen Randbedingungen - Große Datenmengen nicht komplett im Hauptspeicher ablegbar - Mehr Suchanfragen als Änderungen auf Informationen Wozu Zugriffspfade? - Schneller und einfacher inhaltsbezogener Zugriff notwendig: "Gib mir alle Angestellten, die mehr als 3 Kinder haben und vor dem 01.01.2005 in die Firma eingetreten sind." - Sequentielle Suche über MB/GB/TB an Daten nicht akzeptabel - Minimierung der Anzahl von Externspeicherzugriffen (Zeitfaktor 105) - Analogie: wie errät man effektiv eine Zahl zwischen 1 und 1024? Datenbank- und Informationssysteme Friedrich-Schiller-Universität Jena Seite 6 Motivation: Klassifikation von Zugriffspfaden Datenbank- und Informationssysteme Friedrich-Schiller-Universität Jena Seite 7 B-Baum: Beschreibung Vorschlag von Rudolf Bayer und Edward McCreight (1970) Baumknoten werden auf Seiten abgebildet (verwaltet vom DBMS!) Im Baum der Ordnung n gilt für alle Knoten (außer Wurzel) - Ein Knoten enthält m Datensätze fester Länge mit n ≤ m ≤ 2n - Ein Knoten ist Blatt oder hat m+1 Kinder Datensatz = Schlüsselteil + Datenteil - Meist nur mit Zeiger auf eigentliche Daten (nicht eingebetteter Index) - Performance-Abwägung zwischen Zugriff und Reorganisation Alle Blätter befinden sich auf gleicher Baumebene (vollständig balanciert), damit konstante Zugriffszeit bis zur Blattebene Vaterknoten ist Index für seine Nachfolgerknoten aufgrund der beinhalteten Schlüsselwerte Datenbank- und Informationssysteme Friedrich-Schiller-Universität Jena Seite 8 B-Baum: Aufbau Datenbank- und Informationssysteme Friedrich-Schiller-Universität Jena Seite 9 B-Baum: Suchen Suche nach Datensatz d mit Schlüssel s Lese Wurzelseite k Suche s in Seite k gefunden? - Ja: Ausgabe von Datensatz d; fertig! - Nein: Seite ist Blatt? • Ja: Schlüssel ist nicht vorhanden; fertig! • Nein: Existiert ein kleinster Schlüssel si mit s ≤ si? - Ja: Suche s in Seite k weiter, auf die pi verweist - Nein: Suche s in Seite k weiter, auf die pm+1 verweist Beispiel: Suche nach Schlüssel 19 im Baum der vorherigen Folie - Wurzelknoten mit einem Schlüssel (19 ≤ 32) Verweis p1 (<32) folgen - Folgeknoten mit Schlüsseln 11 und 17 Verweis p3 (>17) folgen - Blattknoten (19, 25, 30) enthält die den gesuchten Schlüssel 19 Datenbank- und Informationssysteme Friedrich-Schiller-Universität Jena Seite 10 B-Baum: Einfügen Einfügen von Datensatz d mit Schlüssel s Suche s im Baum gefunden? - Ja: Fehlermeldung; fertig! - Nein: Merke Blatt b in dem die Suche endet Füge (s, d) in Blatt b sortiert ein Ist ausreichend Platz vorhanden? - Ja: es gilt |b|<2n; fertig! - Nein: es gilt |b|=2n • Teile b in zwei Knoten bL und bR - bL = ((s1, d1), ..., (sn, dn)) - bR = ((sn+2, dn+2), ..., (s2n+1, d2n+1)) • Füge (sn+1, dn+1) in den parent(b) sortiert ein und setze dort entsprechend die Zeiger auf bL und bR Datenbank- und Informationssysteme Friedrich-Schiller-Universität Jena Seite 11 B-Baum: Einfügen (Beispiel) Datenbank- und Informationssysteme Friedrich-Schiller-Universität Jena Seite 12 B-Baum: Löschen Löschen von Datensatz d mit Schlüssel s Suche s im Baum gefunden? - Ja: Merke Knoten k in dem s gefunden wurde - Nein: Fehlermeldung; fertig! Lösche (s, d) in Knoten k k ist ein Blatt? - Ja: nach Löschen gilt |k|≥n? • Ja: fertig! • Nein: Unterlaufbehandlung(k); fertig! - Nein: • Ersetze (s, d) in Knoten k durch größtes (kleinstes) Blattelement b im linken (rechten) Teilbaum von (s, d) • Falls nötig Aufruf Unterlaufbehandlung(b) Datenbank- und Informationssysteme Friedrich-Schiller-Universität Jena Seite 13 B-Baum: Löschen (Unterlaufbehandlung) Skizze für die Unterlaufbehandlung in Knoten k Knoten k hat einen direkten rechten (linken) Bruder ks mit n Einträgen? - Ja: • Zusammenfassen von k und ks (inklusive Trenn-Eintrag in parent(k)) • Setzen der Verweise in parent(k) • Falls nötig Aufruf Unterlaufbehandlung(parent(k)); fertig! - Nein: k ist Blatt? • Ja: kleine Rotation über parent(k) nach rechts (links); fertig! • Nein: große Rotation über parent(k) mit linkem (rechtem) BruderTeilbaum von k; fertig! Ablauf der kleinen Rotation für Knoten k nach rechts (links) - Verschiebe Trenn-Eintrag in parent(k) nach k - Verschiebe das größte (kleinste) Knotenelement im direkten linken (rechten) Bruder-Teilbaum nach parent(k) Datenbank- und Informationssysteme Friedrich-Schiller-Universität Jena Seite 14 B-Baum: Löschen (Beispiel Zusammenfassen) Datenbank- und Informationssysteme Friedrich-Schiller-Universität Jena Seite 15 B-Baum: Löschen (Beispiel kleine Rotation) Datenbank- und Informationssysteme Friedrich-Schiller-Universität Jena Seite 16 B-Baum: Löschen (Beispiel große Rotation) Datenbank- und Informationssysteme Friedrich-Schiller-Universität Jena Seite 17 B-Baum: Fazit Ordnung n beeinflusst Effizienz - Je größer n, desto niedrigere Baumhöhe (bei gleicher Anzahl Datensätze) - Je niedriger die Baumhöhe, desto performanter • Wurzelknoten möglichst im Hauptspeicher halten • Jede zusätzliche Seitenanforderung kostet viel Zeit (Pufferverwaltung) • Bis zu 2n Datensätze pro Seite/Knoten (statt 1 Datensatz pro Knoten im Binärbaum) - ABER: n ist durch Seitengröße beschränkt (z.B. 4KB, 8KB, 16KB, 32KB) B-Baum ist robust gegen Entartung durch (lokale) Reorganisation Doppelrolle der Schlüsselwerte si - si bildet ab auf Datensatz di - si als Weiche zur Suchsteuerung • Für Suchsteuerung ist der Datenteil nicht erforderlich • Idee: Datenteile werden nur auf Blattebene gespeichert B*Baum Datenbank- und Informationssysteme Friedrich-Schiller-Universität Jena Seite 18 B*-Baum: Beschreibung Vorschlag von Donald Knuth in "The Art of Programming Vol.3" (1973) Datensätze nur in den Blättern - Innere Knoten enthalten (redundant) Schlüssel und Zeiger auf Kinder - Allgemein flacher als B-Baum, da bei fester Seitengröße mehr Schlüssel in einem Knoten Platz finden Blattfolge entspricht sequentieller Datei, üblicherweise mit (doppelter) Verkettung zwischen den Seiten: - B*-Baum = sequentielle Datei + Indexbaum (B-Baum) - Sequentieller sortierter Zugriff und wahlfreier Schlüsselzugriff - Bereichsanfragen, Extremwertanfragen, Datensätze variabler Länge Datenbank- und Informationssysteme Friedrich-Schiller-Universität Jena Seite 19 B*-Baum: Aufbau Datenbank- und Informationssysteme Friedrich-Schiller-Universität Jena Seite 20 B*-Baum: Fazit Zugriffsmethoden analog, Lösch-Vorgang einfacher als im B-Baum - Daten werden nur in Blättern entfernt - Schlüssel auf inneren Knoten bleiben als Wegweiser erhalten Häufigste Art der Index-Implementierung in DBMS (Synonym: B+-Baum) Typische Zahlen aus der Realität - Kapazität: • Blätter mit über 100 Einträgen • entspricht beispielsweise 320 Byte je Datensatz bei 32KB Pagesize - Baumhöhe: 3-5 Ebenen bei 105- 107 Datenelementen auf Blattebene - Auslastung: • jeder Knoten mindestens zur Hälfte gefüllt (wegen n ≤ m ≤ 2n) • B*-Baum von Knuth hat garantierte Auslastung von 2/3 Datenbank- und Informationssysteme Friedrich-Schiller-Universität Jena Seite 21 Statisches Hashing: Beschreibung Hashtabelle als Indexstruktur ("Von der Ordnung ins Chaos") Verwendung von Streuspeicherverfahren bzw. Hashfunktionen - Direkte Abbildung/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 in Bit-/Dezimaldarstellung • Rest der Division ergibt die relative Adresse in der Hashtabelle Hashfunktion h: S {1, 2, ..., n} - S = Schlüsselraum, n = Größe des statischen Hash-Bereichs (Buckets) - Idealfall: h ist injektiv (keine Kollisionen) • Nur in Ausnahmefällen möglich ('dichte' Schlüsselmenge) • Jeder Satz kann mit einem Seitenzugriff referenziert werden - Ziel: möglichst gute Gleichverteilung einer konkreten Schlüsselmenge K⊆ S auf n Buckets Datenbank- und Informationssysteme Friedrich-Schiller-Universität Jena Seite 22 Statisches Hashing: Operationen Gegeben: - Hashfunktion h, Adressraum A - Datensatz D mit Schlüssel Ki Einfügen - Generierung der zukünftigen Speicheradresse: h(Ki) = Ai - Schlüssel Ki wird auf Adresse Ai gespeichert Löschen - Ermittlung der zugehörigen Speicheradresse: h(Ki) = Ai - Schlüssel Ki wird auf Adresse Ai gelöscht Direkte Suche - Ermittlung der zugehörigen Speicheradresse: h(Ki) = Ai - Bereitstellung von Datensatz D mit Schlüssel Ki von Adresse Ai Sequentielle Suche - Sequentieller Durchlauf des Adressraumes A = A1 ... An - Keine geordnete Schlüsselfolge keine sequentielle Suche möglich! Datenbank- und Informationssysteme Friedrich-Schiller-Universität Jena Seite 23 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 - Ki und Kn haben die gleiche Hausadresse Kollisionsbehandlung umfasst folgende Aufgaben - Finden einer freien Speicheradresse beim Einfügen - Auffinden eines Schlüssels, der nicht auf seiner Hausadresse gespeichert wurde 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 Datenbank- und Informationssysteme Friedrich-Schiller-Universität Jena Seite 24 Statisches Hashing: Kollisionsbehandlung Offenes Hashen h(Kx) = h(Km) - Kollisionen werden im Primärbereich untergebracht Kx • Suche einer anderen noch nicht belegten Km Ki Adresse in der Hashtabelle Kx • Lineares/quadratisches Sondieren, Ko Doppeltes Hashen - Gleiche Strategie beim Wiederauffinden - Lösch-Problematik: Einträge dürfen nicht einfach gelöscht werden, da sonst veränderte Voraussetzungen (Lösung: Delete-Flag) Geschlossenes Hashen - Kollisionen werden im separaten Überlaufbereich gespeichert h(Kx) = h(Km) • Überlaufbereich für alle Kollisionen • Überlaufbereich pro Adresse Kx Km - Gefahr der Entartung Ki • Überlauflisten werden zu lang • Performance sinkt (Suche in einer Liste!) Ko Datenbank- und Informationssysteme Friedrich-Schiller-Universität Jena Kx Seite 25 Statisches Hashing: Fazit Vorteile: - Kurze Zeiten beim Zugriff auf Daten (O(1), wenn keine Kollision) - Schnelles Einfügen von Daten (wenn keine Kollision) Nachteile: - Hashfunktion entscheidend für die Qualität des Hashverfahrens • Es gibt keine optimale Hashfunktion für beliebige Schlüsselmengen! • Abhängigkeiten: Performance, Berechnungs-Komplexität, Datenverteilung, Kollisions-Wahrscheinlichkeit • Kollisionsbehandlung notwendig! - Kein sortierter, sequentieller Zugriff auf Daten möglich - Ineffizienz bei unvorhersehbaren bzw. stark wachsenden Datenmengen • Primärbereich anfangs überdimensioniert, Freihalten von Leerstellen • Wachsende Überlaufketten verschlechtern Laufzeitverhalten • Nachträgliche Vergrößerung der Hashtabelle (Re-Hash) mit Entladen und Neuladen ist teuer bzw. nicht möglich (24h-Dauerbetrieb!) Übergang zum Erweiterbaren (extendible) Hashing (Fagin et al, 1978) Datenbank- und Informationssysteme Friedrich-Schiller-Universität Jena Seite 26 Erweiterbares Hashing: Ziele Dynamisches Wachsen und Schrumpfen des Hashbereichs - Buckets werden erst bei Bedarf bereitgestellt - Hohe/dichte Speicherplatzbelegung möglich Konstantes Laufzeitverhalten unabhängig vom Umfang des Datenbestands Auffinden eines Satzes soll nicht mehr als 2 Seitenzugriffe (möglicherweise auf dem Externspeicher) erfordern Vermeidung von Überlaufmechanismen und totaler Reorganisation Problem: dynamische Erweiterung des Hashbereichs Erweiterung des Wertebereichs der Hashfunktion Änderung der Hashfunktion (z.B. MOD 100 statt MOD 10) Änderung der Hashwerte für bereits gespeicherte Daten Datenbank- und Informationssysteme Friedrich-Schiller-Universität Jena Seite 27 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 (evt. Externspeicherzugriff!) - Notwendiges Hilfsmittel für die gewünschten Erweiterungseigenschaften Buckets 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. Separierung) zusätzlicher Informationen, z.B. Personaldaten zur Personalnummer Hashfunktion h generiert Pseudoschlüssel zu einem Satz x - h(x) = dp mit h: S {0,1}* (binäre Darstellung von h(x)) - Zerlegung in zwei Teile: • d: Index (Adresse) des Buckets für x im Directory (d = globale Tiefe) • p: aktuell ungenutzter Teil des Schlüssels - Directory enthält 2d Einträge, verdoppelt sich mit jedem zusätzlichen Bit - Bucket enthält nur Sätze, deren Pseudoschlüssel in den ersten d' Bits übereinstimmen (d' = lokale Tiefe, d = max(d')) Datenbank- und Informationssysteme Friedrich-Schiller-Universität Jena Seite 28 Erweiterbares Hashing: Operationen Gegeben: Hashfunktion h, Buckets 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 Datenbank- und Informationssysteme Friedrich-Schiller-Universität Jena Seite 29 Erweiterbares Hashing: Beispiel (1) Schrittweiser Aufbau einer Hashtabelle durch sukzessives Einfügen (Visualisierung: http://scorpius.informatik.uni-mannheim.de:8080/abast/extHash.jsp) Ausgangssituation: - Bucket-Kapazität sei b=4 - h(x) = x MOD 32 (h: S [0, 31]) in Binärdarstellung [00000, 11111] - Start mit globaler Tiefe d=0 • Ein Bucket B1 (mit 4 Slots) • Nur 1=2d Directory-Eintrag notwendig, der auf Bucket B1 verweist - Schlüsselwerte X = {38, 104, 49, 57, 84, 86, 94, 43, 69, 109}, zugehörige Datensätze werden vernachlässigt - Hashwerte h(x) = {6, 8, 17, 25, 20, 22, 30, 11, 5, 13} Zum Vergleich realistische Werte: - b=100, b=1000 (abhängig von der Seitengröße und den Werten) - h(x) mit h: S [0, 232-1] (für hinreichend viele Bitpositionen) Datenbank- und Informationssysteme Friedrich-Schiller-Universität Jena Seite 30 Erweiterbares Hashing: Beispiel (2) Ausgangslage - Directory mit d=0, ein leeres Bucket - Anzeige im Bucket: x [h(x) binär] 0 Einfügen der Werte {38, 104, 49, 57} - Differenzierung gemäß "0. Bit" (also keine) im Hashwert - Alle Werte in Bucket B1 Einfügen von Wert 84 - Bucket-Überlauf in B1, deswegen Splitting von B1 mit neuem B2 - Erhöhung der lokalen Tiefe (d'=1) in Bucket B1 und B2 • Erhöhung globale Tiefe (d=1) • Directory-Verdopplung - Differenzierung bei (lokaler) Neuverteilung gemäß 1. Bit im Hashwert Datenbank- und Informationssysteme 0 1 B1 38 [00110] 104 [01000] B1 49 [10001] 57 [11001] B1 38 [00110] 104 [01000] 0... 1... Friedrich-Schiller-Universität Jena B2 49 [10001] 84 [10100] 57 [11001] Seite 31 Erweiterbares Hashing: Beispiel (3) Einfügen von Wert 86 - Suche des zugehörigen Buckets ergibt B2 aufgrund 1. Bitposition - Freie Kapazität in B2 (3 = |B2| < b=4) Einfügen von Wert 94 - Bucket-Überlauf in B2, deswegen Splitting von B2 mit neuem B3 - Erhöhung der lokalen Tiefe (d'=2) in Bucket B2 und B3 • Erhöhung globale Tiefe (d=2) • Directory-Verdopplung - Differenzierung bei Neuverteilung gemäß ersten zwei Bits im Hashwert - Bucket B1 bleibt unverändert mit lokaler Tiefe d'=1 Datenbank- und Informationssysteme 1 B1 38 [00110] 104 [01000] 0... 1... B2 2 B1 49 [10001] 84 [10100] 57 [11001] 86 [10110] 38 [00110] 104 [01000] 00... 01... 10... B2 11... Friedrich-Schiller-Universität Jena B3 49 [10001] 84 [10100] 86 [10110] 57 [11001] 94 [11110] Seite 32 Erweiterbares Hashing: Beispiel (4) Einfügen der Werte {43, 69, 109} - Wert 43 wird in Bucket B1 abgelegt durch Zuordnung über "01..." B1 - Wert 69 wird in Bucket B1 abgelegt durch Zuordnung über "00..." - Wert 109 würde in Bucket B1 abgelegt durch Zuordnung über "01..." • Überlauf in B1 • Splitting von B1 mit neuem 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 Datenbank- und Informationssysteme 2 00... 01... 104 [01000] 43 [01011] B4 109 [01101] 10... 11... Friedrich-Schiller-Universität Jena 69 [00101] 38 [00110] B2 B3 49 [10001] 84 [10100] 86 [10110] 57 [11001] 94 [11110] Seite 33 Erweiterbares Hashing: Fazit Hashfunktion sollte gut gewählt sein - Möglichst "zufälliges" Ergebnis liefern - h(x) sollte an jeder Bitposition den Wert 0/1 mit gleicher Wahrscheinlichkeit (0.5) generieren - Hashverfahren reagieren empfindlich auf unausgewogene Hashfunktionen 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ßem Bucketkapazität b sehr selten - Beispiel: • b=2 • h(x): S [0, 31] • Einfügereihenfolge: 2 (00010), 3 (00011), 6 (00110) Datenbank- und Informationssysteme Friedrich-Schiller-Universität Jena Seite 34