Datenbanken Interne Datenorganisation: Bisher: Konzeptionelle Betrachtungen einer Datenbank aus Sicht der Anwendung: Modellierung, Normalisieren, Sprache zum Einfügen, Ändern, Löschen, Lesen Jetzt: Betrachtung der physischen Implementation der für den Endanwender nicht sichtbaren internen Ebene zur Optimierung des Speicherzugriffs. 1 Stephan Karczewski - Datenbanken 6. Interne Datenorganisation Datenbanken Interne Datenorganisation: 2 • Die interne Datenorganisation ist die für den Endanwender nicht sichtbare, aber wesentliche Ebene für die performante Nutzung von Datenbanken. • Aus der Programmiervorlesung bekannte Algorithmen und Datenstrukturen werden verwendet und erweitert, damit große Datenmengen effizient verarbeitet werden können. • Mit der durch die ANSI-/SPARC-Architektur eingeführten strikten Ebenen-Trennung ist es grundsätzlich möglich, die Strukturen der internen Ebene zu ändern, ohne die anderen Ebenen zu beeinflussen. • Im Wesentlichen betrachten wir die Suchverfahren, um effizient auf Daten der Datenbank zuzugreifen. Stephan Karczewski - Datenbanken 6. Interne Datenorganisation Datenbanken Suchverfahren: 3 • Suchverfahren spielen eine wesentliche Rolle bei der Betrachtung der internen Ebene von Datenbanken. Das Lesen von Daten in Datenbanken nach bestimmten Kriterien (Selektion in Daten) bedeutet immer, dass die Daten schnellstmöglich zu finden sind. • Sind die Daten bereits in einem sortierten Zustand, ist die Suche weit weniger aufwendig als bei unsortierten Daten. • Man unterscheidet sogenannte Indexverfahren (Index, Baum, B-Baum) von Hashverfahren. Beide Typen von Verfahren dienen dazu, dass man beim Suchen nicht alle Daten durchlaufen muss, um den gesuchten Datensatz zu finden. Stephan Karczewski - Datenbanken 6. Interne Datenorganisation Datenbanken Suchverfahren (Index): Beispiel: • Angenommen in einer Datenbank sind eine Menge von Relationen abgelegt. Zu jeder Relation ist ein Primärschlüssel definiert. Die Primärschlüssel dienen jetzt und in den folgenden Überlegungen dazu, Informationen zu finden. Wir wissen ja, dass die Werte für den Primärschlüssel in Relationen eindeutig sein müssen. Der Einfachheit halber gehen wir davon aus, dass die betrachteten Werte natürliche Zahlen sind. • Zu suchen sei in dem folgenden Raum von Zahlen: 15 4 22 7 3 9 16 4 6 12 8 • Frage: Wie lange braucht man im Durchschnitt, um eine Zahl (hinter der sich der Schlüssel eines Datensatzes befindet, den wir suchen) zu finden? • Da es keine offensichtliche Anordnung der Zahlen gibt, müssen wir sequentiell vorgehen: Für die Suche nach der 15 brauchen wir einen Schritt, für die Suche nach 8 brauchen wir 10 Schritte, im Durchschnitt also 5,5 Schritte. • Allgemein können wir bei einem solchen Suchverfahren bei n Datensätzen von einem durchschnittlichen Aufwand von (n+1)/2 Schritten ausgehen. Man spricht vom Aufwand in der Ordnung von n, also O(n). Stephan Karczewski - Datenbanken 6. Interne Datenorganisation Datenbanken Suchverfahren (Index): Beispiel: • Gehen wir im Folgenden von einer Sortierung der Zahlen aus. Im Beispiel verwenden wir also die gleichen Zahlen (Schlüsselwerte): 3 5 4 6 7 8 9 12 15 16 22 • Beim Suchen können wir den Aufwand reduzieren, denn wir können beim Suchen in der „Mitte“ der Zahlenwerte (s. Pfeil) beginnen und entscheiden, ob die gesuchte Zahl, rechts oder links von diesem Zahlenwert liegt. Bei der Suche nach der 22 braucht man z.B. nur die mit Pfeilen markierten Schritte, also 3, und nicht wie zuvor 10 Schritte. Die Pfeile kann man als Index bezeichnen. Dieses Verfahren nennt man binäre Suche. • Im Mittel braucht man beim Suchen in solchermaßen sortierten Feldern mit n Zahlen einen Aufwand von O(log2n) Schritten. • Wichtig: Der Suchaufwand ist deutlich reduziert, jedoch muss bei jedem Neueintrag eines Wertes ein hoher Aufwand betrieben werden, z.B. müssten beim Neueintrag der 5 alle Werte ab 6 um ein Feld nach hinten verschoben werden. • Allgemein gilt, dass Verfahren, die den Suchaufwand verringern i.d.R. den Einfügeaufwand erhöhen. Stephan Karczewski - Datenbanken 6. Interne Datenorganisation Datenbanken Suchverfahren (Baum): Beispiel: • Für das zuvor gezeigte Verfahren werden auch gerne Baumstrukturen verwendet. Ein äquivalenter binärer Suchbaum zu dem vorigen Beispiel ist der folgende: 9 6 4 3 6 15 8 7 12 16 22 • Es gilt für jeden Knoten: Der Pfeil, der links von einem Knoten ausgeht, zeigt auf eine kleinere Zahl, der nach rechts gehende Pfeil auf eine größere Zahl. Gestartet wird die Suche an der Wurzel (9). In diesem Beispiel brauchen wir auch 3 Schritte bis zur 22. Das Verfahren ist auch ein logarithmisches, d.h. das Suchen in einem ausgeglichenen Baum mit n Knoten braucht O(log2n) Schritte. • Problematisch bei diesem Verfahren kann sein, dass der Baum „entartet“ zu einer linearen Liste. Dann ist das Verfahren mit der Ordnung O(n) schlecht. Stephan Karczewski - Datenbanken 6. Interne Datenorganisation Datenbanken Suchverfahren (Baum): Die Beispiele zeigen, dass verschiedene Faktoren zu berücksichtigen sind: 7 • Zum einen zeigt sich, dass Optimierungen zum schnellen Finden von Informationen einhergehen (können) mit größerem Aufwand beim Speichern der Informationen, weil der schnellere Zugriff i.d.R. mit einer aufwändigeren Speicherform verbunden ist. • Das Baumverfahren liefert ebenso wie die binäre Suche Suchergebnisse in O(log2n). Sie stellen die einfachsten Index-Verfahren dar. • Unter Berücksichtigung des bei großen Datenmengen notwendigen Zugriffs auf unterschiedliche Speichermedien (Hauptspeicher, Hintergrundspeicher) gibt es eine Optimierung hin zu einer minimalen Zugriffshäufigkeit auf den (langsamen) Hintergrundspeicher, das index-sequentielle Suchen und das Suchen in B-Bäumen. • Das index-sequentielle Verfahren lässt sich anhand des Telefonbuchs (in Buchform!) erläutern: Wenn man eine Telefonnummer sucht, nutzt man zunächst den Index, also z.B. bei der Suche nach Meier, sucht man über den Index den Buchstaben „M“. Hat man diesen gefunden, dann geht man anschließend sequentiell vor („mit dem Finger Name für Name“) und findet schließlich den entsprechenden Namen. In größeren Orten ist der Index feiner aufgeteilt, so dass das sequentielle Suchen auf nur relativ wenige Einträge und nicht seitenlang erfolgt. Stephan Karczewski - Datenbanken 6. Interne Datenorganisation Datenbanken Suchverfahren (Baum): 8 • Übertragen auf das Suchen in großen Datenbanken versucht man durch dieses zweistufige Vorgehen, das sequentielle Suchen auf den Hauptspeicherbereich zu beschränken, da dieser im Vergleich zum Hintergrundspeicher um ein vielfaches schneller arbeitet und das relativ schlechte sequentielle Suchen nicht zu sehr ins Gewicht fällt. • Das (Nach-)Laden von Daten aus dem Hintergrundbereich möchte man jedoch möglichst selten vornehmen. • Mit diesem Grundgedanken hat Rudolf Bayer 1972 den B-Baum definiert, der noch heute in den meisten Datenbank-Systemen als Speicherform in der internen Ebene genutzt wird. • Die Idee, die sich hinter dem B-Baums verbirgt ist es, ein mehrstufiges Index-Verfahren aufzubauen, bei dem die nachzuladenden Seiten des Speichers gerade so groß sind, dass eine minimale Menge davon zu laden ist. Somit wird die Zahl der Zugriffe auf den langsamen Hintergrundspeicher minimiert. • Jeder Knoten des Baumes enthält mehr als eine Information im Gegensatz zu dem normalen binären Baum. • Innerhalb einer Seite wird (im Hauptspeicher) sequentiell oder binär gesucht. Da der Hauptspeicher um ein Vielfaches schneller ist als der Hintergrundspeicher, fällt das Verfahren nicht so ins Gewicht. Stephan Karczewski - Datenbanken 6. Interne Datenorganisation Datenbanken Gedanke 65 Suchverfahren (Baum): 32 97 109 117 130 119 125 132 102 112 93 80 103 108 74 122 106 95 68 81 89 53 78 45 66 70 72 39 87 71 47 51 58 35 43 48 36 38 16 20 27 24 14 13 11 10 5 8 1 3 37 40 17 33 7 114 76 115 41 75 12 99 binärer Baum B-Baum 12 32 41 65 76 97 114 115 117 119 122 125 130 132 1 3 5 7 8 10 11 13 14 16 17 20 24 27 43 45 47 48 51 53 58 33 35 36 37 38 39 40 9 Stephan Karczewski - Datenbanken 66 68 70 71 72 74 75 99 102 103 106 108 109 112 78 80 81 87 89 93 95 6. Interne Datenorganisation Datenbanken Suchverfahren (B-Baum): Definition (B-Baum): Ein B-Baum der Ordnung n ist wie folgt definiert: • Jeder Knoten enthält maximal 2n Schlüssel. • Jeder Knoten mit Ausnahme des Wurzelknoten enthält mindestens n Schlüssel. Der Wurzelknoten enthält mindestens einen Schlüssel. • Ein Knoten hat m+1 Nachfolger-Knoten, wenn er m Schlüssel enthält. Für die NachfolgeKnoten gilt: Sie enthalten Schlüsselwerte, die jeweils in den Intervallen, die durch die Schlüssel des Vorgängers gegeben sind (s. u. Beispiel). Ausnahme sind Blattknoten: Diese haben keine Nachfolger. • Alle Blattknoten liegen auf einer Ebene, d.h. sie haben den gleichen Abstand zur Wurzel. Beispiel: B-Baum der Ordnung 2: 27 8 19 2 3 4 6 10 10 12 14 17 Stephan Karczewski - Datenbanken 33 42 21 22 23 25 28 31 35 39 45 49 6. Interne Datenorganisation Datenbanken Suchverfahren (B-Baum): Eigenschaften (B-Baum): 11 • Ein B-Baum hat deshalb so hervorragende Eigenschaften, da die Anzahl der Seitenzugriffe sehr gering im Verhältnis zu der Anzahl der Schlüssel ist. Ein Seitenzugriff muss üblicherweise nur bei dem Wechsel von einer auf die nächste Ebene erfolgen. • Dies liegt daran, dass die Höhe des Baums nur sehr langsam wächst bei gleichzeitig starkem Wachstum der Schlüsselmenge. Ist beispielsweise n=50, so kann bei optimaler Füllung und drei Ebenen des Baumes eine Schlüsselmenge in der Größenordnung von 100 + (100*100) + (100*100*100) = 1,01 Mio Schlüsseln gespeichert werden. • Eine Variante des B-Baums, der B*-Baum, ist dafür ausgelegt, dass in den Blättern die tatsächlichen Daten liegen, so dass nach Finden eines Schlüssels, ganze Bereiche von Daten abgearbeitet werden können. Stephan Karczewski - Datenbanken 6. Interne Datenorganisation Datenbanken 27 8 19 Löschen im B-Baum: hier Schlüssel 33 2 3 4 6 10 12 14 17 33 42 28 31 21 22 23 25 35 39 • Gelöscht werden darf nur im Blatt, da sonst die gleiche Höhe in den Blättern und die Regeln zur Menge der Schlüssel und Nachfolger in den Knoten nicht eingehalten werden kann. • Ist ein Schlüssel in einem inneren Knoten zu löschen (oben z.B. 33), dann muss dieser direkt ersetzt werden durch einen unmittelbaren Nachbarn, der in einem Blatt ist (hier z.B. 35). Hat der Blattknoten n oder mehr Schlüssel, sind wir fertig. • Nun hat der Blattknoten nur noch einen Schlüssel (39) und auch seine Nachbarn sind bereits auf minimalem Füll-Niveau. Somit müssen zwei Nachbarknoten (hier Blätter) verschmolzen werden zusammen mit dem zwischen ihnen liegenden Schlüssel (39, 42, 45, 49). • Hätte der Nachbarknoten mindestens n+1 Schlüssel, dann könnte zwischen den beiden Nachbarn verschoben werden. • Der Vorgänger-Knoten hat nun allerdings nur noch einen Schlüssel (35). Auf dieser Ebene erfolgt nun der gleiche Prozess. Zusammenfassung von (8, 19, 27, 35). Die Wurzel, die bisher nur einen Schlüssel hat, verschwindet. Der Baum verliert eine Ebene. • Ergebnis ist der folgende Baum. Alle aufgeführten Regeln sind eingehalten. 45 49 8 19 27 35 2 3 4 6 12 10 12 14 17 Stephan Karczewski - Datenbanken 21 22 23 25 28 31 39 42 45 49 6. Interne Datenorganisation Datenbanken 8 19 27 35 Einfügen im B-Baum: 2 3 4 6 hier Schlüssel 15 10 12 14 17 21 22 23 25 28 31 39 42 45 49 • Eingefügt wird nur in Blattknoten. Zunächst wird nach dem Suchverfahren der passende Knoten gefunden, d.h. in der Wurzel wird sequentiell nach dem Schlüssel gesucht. Wird er nicht gefunden, dann wird zu dem Nachfolger gesprungen, in den der Schlüssel hineinpasst (ggfs. über mehrere Ebenen). Soll z.B. der Schlüssel 15 eingefügt werden, dann ist das zweite Blatt geeignet. Dieser Knoten ist aber mit 2n Schlüsseln gefüllt. Bei nicht vollständiger Füllung trägt man den neuen Schlüssel einfach in den passenden Knoten. • In unserem Beispiel erfolgt eine Splittung des Knoten in die Knoten (10, 12) und (15, 17). Der mittlere Schlüssel wird eine Ebene nach oben geschoben. • Die Ebene darüber ist bereits maximal gefüllt. Daher wiederholt sich das Ganze. (8, 15) und 27, 35) entstehen. 19 wird die neue Wurzel. • Somit entsteht folgender Baum mit einer zusätzlichen Ebene. 19 8 14 2 3 4 6 13 Stephan Karczewski - Datenbanken 10 12 15 17 27 35 21 22 23 25 28 31 39 42 45 49 6. Interne Datenorganisation Datenbanken B-Baum (Aufgabe): 1. Gegeben sei ein leerer B-Baum der Ordnung 2. Tragen Sie in der folgenden Reihenfolge die Schlüssel in den B-Baum. Nach jedem „;“ zeichnen Sie den entstandenen B-Baum auf: 20; 40 10 30 15; 35 7 26 18 22; 5; 42 13 46 27 8 32; 38 24 45 25; 2. Gegeben sei der Baum aus Aufgabe 1. Löschen Sie in der folgenden Reihenfolge die Schlüssel in dem B-Baum. Nach jedem „;“ zeichnen Sie den entstandenen B-Baum auf. 25 45 24; 38 32; 8 27 46 13 42; 5 22 18 26; 7 35 15; 14 Stephan Karczewski - Datenbanken 6. Interne Datenorganisation Datenbanken Suchverfahren (Hash): Eigenschaften (Hash-Verfahren): 15 • Die Hash-Organisation ist eine direkte Methode, bei der jedem Schlüssel über die HashFunktion eine eindeutige Adresse zugeordnet wird. Die Hash-Funktion sollte so gewählt sein, dass sie die Adressen breit streut und dass ein Wiederfinden mit der Umkehrfunktion in einem Schritt möglich ist. • Üblicherweise ist der Adressbereich kleiner als die Menge der zu verteilenden Daten. Daher kommt es zu Kollisionen von Funktionszuordnungen. • Neben der Hash-Funktion bedarf es einer Kollisionsbehandlung, so dass ein Wiederauffinden der Informationen möglich ist. • Die bekannteste Hash-Funktion ist das Divisions-Rest-Verfahren, das jedem Schlüssel eine Adresse zuweist, indem dividiert wird durch die Speicherbereich-Größe und der Rest der Division die Adresse liefert. • Bei Kollisionen gibt es ebenfalls verschiedene Möglichkeiten vorzugehen. Die Kollisionsbehandlung liefert dabei entweder offene Hashverfahren also eine Ersatzadresse im gleichen Bereich (z.B. der direkte/übernächste/… Nachbar) oder einen Überlaufbereich (z.B. eine verkettete Liste an der Zieladresse). Stephan Karczewski - Datenbanken 6. Interne Datenorganisation Datenbanken Suchverfahren (Hash) Beispiel: • Der betrachtete Bereich umfasse n = 10 Werte. Wir wenden das Divisions-Rest-Verfahren an, also gilt: Adresse von k (Schlüssel) = k mod n. • Bei Ankommen der Beispielschlüssel 15, 22, 7, 3, 9, 16, 4, 6, 12, 8 ergibt sich folgende Zuteilung: 0 • 16 1 2 3 4 5 6 7 8 9 22, 12 3 4 15 16, 6 7 8 9 Sowohl 16 und 6 als auch 22 und 12 beanspruchen den selben Speicherplatz Kollisionsbehandlung. Diese kann auf verschiedene Weise geregelt werden. Man unterscheidet zwischen Verfahren, die einen Überlaufbereich, z.B. eine verkettete Liste hinter dem Array nehmen oder die den vorhandenen Bereich verwenden (z.B. man nimmt die Nachbaradresse und wenn diese nicht frei ist, die nächste usw.). Stephan Karczewski - Datenbanken 6. Interne Datenorganisation Datenbanken Suchverfahren (Hash) Beispiel: 0 Überlaufbereich 17 1 2 3 4 5 6 7 8 9 22 3 4 15 16 7 8 9 12 6 • Tritt eine Kollision auf, wird ein neuer Record (Überlaufbereich) angelegt und der Wert eingetragen. Von der eigentlichen Adresse wird ein Pointer auf den neuen Record gelegt. • Bei diesem Verfahren könnte es im Extremfall zu einer linearen Liste kommen, die sehr ineffizient wäre. • Alternativ kann durch das Verfahren: „Trage den Schlüssel im Nachbarfeld ein“ eine Häufung von Kollisionsbehandlungen notwendig werden, falls ein Feld oft gefunden wird. Stephan Karczewski - Datenbanken 6. Interne Datenorganisation