UNIVERSITÄT BASEL Prof. Dr. Heiko Schuldt Ihab Al Kabary, MSc Ilir Fetai, MSc Nenad Stojni¢, MSc cs243: Datenbanken Übung 3 FS 2013 Abgabe: 16.04.2013 (23:59 Uhr) Aufgabe 1: B*-Baum Implementierung (15 Punkte) In dieser Aufgabe sollen Sie die Implementierung einer wichtigen Indexstruktur des B*-Baums vervollständigen. Laden Sie sich die verfügbaren Java-Quelldateien herunter (u3.zip) und machen Sie sich zunächst mit dem schon implementierten Code vertraut. Die für Sie wichtigsten Operationen benden sich in den Klassen BPlusTree und SearchNode. Zum Testen verwenden Sie bitte die JUnit-Tests der Klasse SearchNodeTest.1 Alle benötigten Änderungen führen Sie bitte in der bereitgestellten Datei SearchNode.java durch.2 a) Implementieren Sie die Berechnung der maximal unterstützten Ordnung des Baums im öentlichen Konstruktor. Führen Sie die Berechnung entweder schrittweise durch, oder fügen Sie einen kurzen Kommentar ein, der beschreibt, wie Sie die benötigte Formel ermittelt haben. (3 Punkte) b) Implementieren Sie die Methode propagateInsert, die das Einfügen von überlaufenden Indexwerten in innere Baumknoten übernimmt. Hinweis: die Referenzimplementierung umfasst etwa 60 Zeilen Code; ein Grossteil der Logik dieser Methode ist sehr ähnlich aufgebaut wie die der leafInsert()-Methode. (12 Punkte) 1 Alternativ dazu können Sie die Klasse DBSU verwenden, die dieselben zwei Tests ohne JUnit implementiert. Durch umdenieren der Variablen TEST können Sie zwischen den zwei Tests umschalten. 2 Es wird emfohlen, Eclipse zur Entwicklung und Kompilierung zu verwenden, da der Standard-JavaCompiler von Sun (wegen unterschiedlicher Auassung von Generics und Klassenhierarchie) die Klasse SearchNode nicht kompiliert. 1 Aufgabe 2: Datenspeicherung (15 Punkte) Wir betrachten einen Teil einer Musikdatenbank mit der folgenden Schemadenition: CREATE TABLE Disk ( DiskID NUMBER PRIMARY KEY NOT NULL, DiskTitel VARCHAR(255) ); CREATE TABLE Musikstueck ( DiskID NUMBER, StueckID NUMBER, Titel VARCHAR(255), PRIMARY KEY (DiskID, StueckID) ); CREATE TABLE Person ( PID NUMBER PRIMARY KEY NOT NULL, Name VARCHAR(40) NOT NULL, Nationalitaet CHAR(5) ); CREATE TABLE Musikstueck_Autor ( PID NUMBER NOT NULL REFERENCES Person, DiskID NUMBER NOT NULL, StueckID NUMBER NOT NULL, Taetigkeit VARCHAR(20) NOT NULL, FOREIGN KEY (DiskID, StueckID) REFERENCES Musikstueck ); Als Kardinalitäten und mittlere Tupellängen der gegebenen Relationen nehmen wir an: Disk Musikstueck Person Musikstueck_Autor 1000 10000 6000 30000 Tupel Tupel Tupel Tupel à à à à 100 50 40 40 Bytes Bytes Bytes Bytes Zur Ezienzsteigerung von Anfragen sind unter anderem die folgenden mittelbaren Indexe angelegt, die jeweils als B∗ -Baum implementiert sind: CREATE UNIQUE INDEX DiskID ON Disk (DiskID); CREATE INDEX DiskTitel ON Disk (DiskTitel); CREATE INDEX AutorStueck ON Musikstueck_Autor (PID); 2 Nehmen Sie an, dass jede Relation jeweils einen eigenen Tablespace belegt, wobei die Seitengrösse 4 KB sei und der Seiten-Header die Länge 96 B habe. Datenseiten seien zu 90 Prozent, Indexseiten zu 70 Prozent gefüllt. Der Datentyp NUMBER belege 10 B, der Disktitel sei Schlüsselkandidat der Relation Disk und habe eine durchschnittliche Länge von 90 B; ein TID oder Zeiger im B∗ -Baum habe die Länge 6 B. a) Berechnen Sie den Speicherplatzbedarf für die Primärdaten, d.h. berechnen Sie die Tupel pro Seite und die Anzahl der Seiten, die zur Abspeicherung der in den Relationen des Schemas enthaltenen Daten benötigt werden. (4 Punkte) b) Berechnen Sie den für die Indexe benötigten Speicherplatzbedarf, d.h. berechnen Sie die Einträge pro Blattseite und pro inneren Knoten sowie mit Hilfe dieser Ergebnisse die Anzahl der Blattseiten und inneren Knoten. (7 Punkte) c) Berechnen Sie die Seitenzugrie (Index- und Datenseitenzugri) bei folgenden drei Anfragen unter Verwendung des jeweiligen Index. Sie können davon ausgehen, dass die angefrageten Tupel existieren. SELECT * FROM Disk WHERE DiskID = 4711; SELECT * FROM Disk WHERE DiskTitel = 'Opelgang'; SELECT * FROM Musikstueck_Autor WHERE PID = 1199; (4 Punkte) 3