Als Alternative zu den Verfahren
mit fester Gittergröße
stellten Hinrichs und Nievergelt im Jahre 1981 das
Grid File vor, welches auch bei dynamisch sich änderndem
Datenbestand eine 2-Platten-Zugriffsgarantie gibt.
Erreicht wird dies (bei k-dimensionalen Tupeln) durch
- k Skalen zum Einstieg ins Grid-Directory (im Hauptspeicher)
- Grid-Direktory zum Finden der Bucket-Nr. (im Hintergrundspeicher)
- Buckets für Datensätze (im Hintergrundspeicher)
Zur einfacheren Veranschaulichung beschreiben wir
die Technik für Dimension k = 2. Verwendet werden dabei
- zwei eindimensionale Skalen,
welche die
momentane Unterteilung der X- bzw. Y-Achse enthalten:
var X: array [0..max_x] of attribut_wert_x;
var Y: array [0..max_y] of attribut_wert_y;
- ein 2-dimensionales Grid-Directory,
welches Verweise auf die Datenblöcke enthält:
var G: array [0..max_x - 1, 0..max_y - 1] of pointer;
D.h. G[i, j] enthält eine Bucketadresse, in
der ein rechteckiger Teilbereich der Datenpunkte
abgespeichert ist. Zum Beispiel sind alle Punkte mit
30 < x 40, 2050 < y 2500
im Bucket mit Adresse G[1,2] zu finden
(in Abbildung 5.8 gestrichelt umrandet).
Achtung: mehrere Gitterzellen können im selben Bucket liegen.
- mehrere Buckets,
welche jeweils
eine maximale Zahl von Datenrecords aufnehmen können.
Skalen und resultierende Gitterzellen
- Beispiel
- für ein Lookup mit
x = 100, y = 1000:
Suche in Skala x den letzten Eintrag < x. Er habe den Index i = 3.
Suche in Skala y den letzten Eintrag < y. Er habe den Index j = 1.
Lade den Teil des Grid-Directory in den Hauptspeicher, der G[3, 1]
enthält.
Lade Bucket mit Adresse G[3, 1].
- Beispiel
- für den Zugriff auf das Bucket-Directory:
Vorhanden seien 1.000.000 Datentupel, jeweils 4 passen in einen Block.
Die X- und die Y-Achse habe jeweils 500 Unterteilungen.
Daraus ergeben sich 250.000 Einträge für das Bucket-Directory G.
Bei 4 Bytes pro Zeiger und 1024 Bytes pro Block passen 250 Zeiger
auf einen Directory-Block. Also gibt es 1000 Directory-Blöcke.
D.h. G[i, j] findet sich auf Block 2 . j als i-te Adresse,
falls i < 250 und befindet sich auf Block
2 . j + 1
als (i - 250)-te Adresse, falls
i 250
Bei einer range query, gegeben durch
ein Suchrechteck, werden zunächst alle Gitterzellen bestimmt,
die in Frage kommen, und dann die zugehörenden Buckets eingelesen.