Intelligentes Datenmanagement Sommersemester 2003 30. Juni 2003 Fachbereich Angewandte Informatik Prof. Dr. Peter Becker Aufgaben zum Praktikum 4 Für diese Aufgabe gehen wir davon aus, daß wir eine Relation OID x-Koordinate y-Koordinate mit folgenden Schema haben: nichtgeometrische Attribute ... Für diese Relation wollen wir eine Zugriffsstruktur implementieren und in eine Datenbank integrieren, so daß Bereichsanfragen effizient beantwortet werden können. Aufgabe 1 (Indexierung raumbezogener Daten) Implementieren Sie eine geometrische Zugriffsstruktur für Punktdaten. Erstellen Sie hierzu ein Programm, das folgendes leistet: Aufbau einer Verbindung zu einer Datenbank und Auslesen aller Tupel einer Relation, die Punktdaten enthält; Aufbau einer geometrischen Zugriffsstruktur für diese Punktdaten; Einfügen der Punktdaten in Verbindung mit den zugehörigen OIDs in diese Zugriffsstruktur; Implementierung einer Bereichssuche; Zu einem Anfragerechteck sollen die OIDs der Objekte geliefert werden, die sich innerhalb des Rechtecks befinden; Für die Implementierung dürfen Sie sich eine beliebige geometrische Zugriffsstruktur aussuchen, z.B. k-d-Baum, R-Baum, Grid-File etc. Aufgabe 2 (Retrieval raumbezogener Daten) Integrieren Sie Ihre Zugriffsstruktur in eine Datenbank. Deklarieren und implementieren Sie hierzu eine Tabellenfunktion, die dazu dient, Bereichsanfragen zu beantworten. Die Tabellenfunktion soll als Ergebnis die OIDs der Objekte liefern, die innerhalb eines in einer Anfrage gegebenen Koordinatenrechtecks liegen. Die Koordinaten des Anfragerechtecks werden als Parameter an die Tabellenfunktion übergeben. Hierzu drei Vorschläge, wie Sie innerhalb der Tabellenfunktion die Zugriffsstruktur nutzen können. Es wird das Client/Server-Paradigma benutzt. Die im Hauptspeicher liegende Zugriffsstruktur wird dabei über ein Serverprogramm zugänglich gemacht. Die Tabellenfunktion stellt den Client dar, der mit dem Server über ein einfaches Request/Reply-Protokoll kommuniziert. An den Server wird als Request das Anfragerechteck geschickt. Der Reply besteht aus der Liste der OIDs, die die Anfrage erfüllen. Für die Interprozeß-Kommunikation zwischen Client und Server können die üblichen Konzepte eingesetzt werden, z.B. Sockets, RPC, Named Pipes, Shared Memory, Java RMI, etc. Nach dem Aufbau der Zugriffsstruktur im Hauptspeicher wird die Zugriffsstruktur serialisiert und in einer Datei gespeichert. Die Zeiger müssen dabei in Dateiadressen (relative Byteadressen) umgewandelt werden. Die Tabellenfunktion nutzt nun die in der Datei liegende Zugriffsstruktur. Die Bereichsanfrage wird dabei so implementiert, daß nur die notwendigen Seiten während der Abarbeitung der Anfrage in den Hauptspeicher übertragen werden. Wie bei der vorigen Variante wird die Zugriffstruktur serialisiert in einer Datei gespeichert. Statt die Seiten nun aber nach Bedarf vom Sekundär- in den Hauptspeicher zu übertragen, erfolgt ein sogenanntes Memory Mapping der gesamten Datei in den Hauptspeicher. Hierbei wird eine komplette Datei in den virtuellen Speicher eines Programms abgebildet, so daß auf die Datei wie auf Hauptspeicherinhalte zugegriffen werden kann. Erfolgt ein Zugriff auf eine Hauptspeicheradresse, die mit einer Datei verbunden ist, so sorgt der Betriebssystem-Kern dafür, daß diese Seite in den Hauptspeicher geladen wird und unter der entsprechenden Adresse zur Verfügung steht. Hinweise zu Memory Mapping unter UNIX finden Sie in Büchern über Systemprogrammierung (der Klassiker hierzu ist: W.R. Stevens, Advanced Programming in the UNIX Environment, AddisonWesley, 1992) bzw. auf den Manualseiten des Systemaufrufs mmap(2). Aufgabe 3 (Anfragen und Analysen) Zum Testen der Zugriffsstruktur bauen Sie eine entsprechend große Beispielrelation auf (mindestens 100.000 Tupel). Geben Sie anschließend Bereichsanfragen in SQL an, die die Zugriffsstruktur nutzen bzw. nicht nutzen. Ermitteln Sie die Laufzeit für diese Anfragen und vergleichen Sie diese.