Der Suchbaum (B-Tree) macht den Index schnell


Die physische Reihenfolge der Indexseiten ist willkürlich und lässt keinen Rückschluss auf die logische Position im Index zu. Die Suche darin ist also so, als wären die Seiten eines Telefonbuches durcheinander. Wenn man nach „Schmied“ sucht und das Telefonbuch bei „Müller“ öffnet, ist keineswegs sichergestellt, dass „Schmied“ weiter hinten kommt. Um die Indexeinträge dennoch schnell zu finden, wird eine zweite Struktur verwaltet: ein balancierter Suchbaum, kurz B-Tree genannt.

Abbildung 1.2. Struktur eines Suchbaumes


Abbildung 1.2 zeigt einen Index mit 30 Einträgen. Die Reihenfolge der Blattkno­ten (engl. Leaf-Nodes) wird durch die doppelte Verkettung hergestellt. Die Wurzel- und Zweigknoten (Root- und Branch-Nodes) dienen der Suche nach bestimmten Einträgen.

Die Abbildung hebt hervor, wie ein Zweigknoten auf die darunter liegenden Blattknoten verweist. Dabei entspricht der jeder Eintrag Zweigkoten dem größten Wert im Blattknoten. Da der größte Wert im ersten Blattknoten 46 ist, ist der erste Eintrag im Zweigknoten ebenfalls 46. Dasselbe gilt für alle weiteren Blattknoten, sodass der Zweigknoten letztendlich die Einträge 46, 53, 57 und 83 enthält. Nach diesem Schema wird eine Verzweigungsschicht aufgebaut, bis alle Blattknoten von einem Zweigknoten erfasst sind.

Coaching vom Author
Schneller, einfacher und einprägsamer als lesen.

Die nächste Schicht ist ebenso aufgebaut, nur dass dabei auf die Zweigknoten verwiesen wird. Das Ganze wiederholt sich so lange, bis eine Schicht entsteht, die nur aus einem Knoten besteht – dem Wurzelknoten oder Root-Node. Das Besondere an dieser Baumstruktur ist, dass sie eine einheitliche Tiefe hat: Der Weg zwischen dem Wurzelknoten und den Blattknoten ist überall gleich lang.

Beachte

B-Tree steht für Balanced Tree – nicht Binary Tree.

Nachdem ein Index angelegt wurde, wird er von der Datenbank au­to­ma­tisch gepflegt. Der Index wird also mit jeder insert-, delete- und update-Anweisung aktualisiert. Die Datenbank hält den Index auch „im Gleichgewicht“ (balanced). Der dadurch entstandene Wartungsaufwand kann durchaus signifikant werden. Kapitel 8, „Schreiboperationen, geht genauer darauf ein.

Abbildung 1.3. Durchwandern des Suchbaumes


Abbildung 1.3 zeigt, wie der Suchbaum genutzt wird, um den Eintrag „57“ zu finden. Die Suche beginnt links, beim Wurzelknoten. Die Einträge des Wurzelknotens werden der Reihe nach mit dem Suchbegriff „57“ verglichen, bis ein Eintrag gefunden wird, der größer-gleich (>=) dem Suchbegriff ist. In der Abbildung trifft das auf den Eintrag „83“ zu. Die Datenbank folgt dem Verweis auf den entsprechenden Zweigknoten und wiederholt die Prozedur so lange, bis sie einen Blattknoten erreicht.

Wichtig

Mit dem Indexbaum findet man einen Blattknoten sehr schnell.

Das Durchwandern des Suchbaumes ist sehr effektiv. So effektiv, dass ich diesen Vorgang als die erste Macht der Indizierung bezeichne. Das liegt einerseits daran, dass der Baum immer balanciert ist. Andererseits wächst der Suchbaum nur sehr langsam in die Tiefe. Ein Baum mit vier oder fünf Verzweigungen kann bereits einige Millionen Einträge abdecken. Eine Indextiefe von sechs wird nur ausgesprochen selten erreicht. Der Kasten „Logarithmische Skalierbarkeit“ erklärt das Indexwachstum etwas genauer.

Logarithmische Skalierbarkeit

Mathematisch gesprochen ist der Logarithmus die Umkehroperation des Potenzierens. Er löst also die Gleichung a = bx nach dem Exponenten x auf [Wikipedia].

Bei einem Suchbaum entspricht die Anzahl der Einträge pro Zweigknoten der Basis b und die Baumtiefe dem Exponenten x. Der Index aus Abbildung 1.2 kann offenbar bis zu vier Einträge pro Zweigknoten fassen und hat eine Tiefe von drei. Daraus resultiert, dass die Blattknoten bis zu 64 (43) Einträge fassen können. Wenn der Index um eine Verzweigungsschicht wächst, kann er bereits 256 (44) Einträge fassen. Jede neue Schicht vervierfacht also die Anzahl der möglichen Einträge. Der Logarithmus kehrt dieses Verhältnis um. Die Baumtiefe entspricht also log4(Indexeinträge).

BaumtiefeIndexeinträge
364
4256
51.024
64.096
716.384
865.536
9262.144
101.048.576

Durch das logarithmische Wachstum kann der Beispielindex eine Million Einträge mit nur zehn Ebenen abdecken. Ein echter Index ist aber noch effektiver. Denn der Hauptfaktor für die Baumtiefe ist die Anzahl der Einträge pro Zweigknoten – mathematisch gesprochen, die Basis des Logarithmus. Je größer die Basis, desto flacher bleibt der Baum.

Datenbanken nutzen diesen Effekt aus und speichern so viele Einträge wie möglich in den einzelnen Knoten – oft hundert oder mehr. Das bedeutet, dass jede weitere Verzweigungsschicht die Indexkapazität verhundertfacht.

Recent Questions at Ask.Use-The-Index-Luke.com

0
votes
1
answer
228
views

query regd the CBO decision

Apr 17 at 10:27 Hulda(suspended)
index-choice optimizer
0
votes
3
answers
2.0k
views

Examples for Function Based Indexes?

Mar 25 at 15:52 Castorp 1
function-based
0
votes
1
answer
607
views

Updating multiple rows using a subquery in SQL

Jan 08 at 09:52 Jan 26
subquery update sql