Institut für Informatik - Lehrstuhl Datenbanken Datenbanken II B: Implementierung von DBMS Wintersemester 08/09 - Dr. Alexander Hinneburg Übung 5: Index-Erstellung und Z-Kurven (Abgabe bis 3.12.2007, 10.00 Uhr) 10 Punkte Geben Sie die Lösung als PDF-Datei ab. (Auf die Größe achten, keine eingescannten Bilder!) Aufgabe 5.1: 10 Punkte Für diese Aufgabe sollen Sie auf zwei verschiedene Arten in einer Datenbank einen Index erstellen. Sie können sich über das Web-Frontend unter http://mozart.informatik. uni-halle.de:5560/isqlplus/ mit den Nutzernamen DBIIB008_Vorname_Nachname und dem Passwort, das Sie für das SVN bekommen haben, einloggen. Der Connect Identifier ist studdb. Bei der Aufgabe geht es um Zeitmessung, deshalb aktivieren Sie zuerst die Ausgabe der Zeit, die ein Statement braucht, durch set timing on. Erstellen Sie eine Tabelle mit 131072 Tupeln und einen Index auf folgende zwei Arten 1. create table test(test_key integer); create index test_idx on test (test_key); insert into test select * from DBIIB08_HINNEBURG.data; analyze index test_idx VALIDATE STRUCTURE; analyze table test compute statistics; 2. create table test(test_key integer); insert into test select * from DBIIB08_HINNEBURG.data; create index test_idx on test (test_key); analyze index test_idx VALIDATE STRUCTURE; analyze table test compute statistics; Um Ihre Quotas nicht zu überschreiten, müssen Sie nach jedem Erstellen von Tabelle und Index beide wieder löschen mit drop index test_idx; drop table test; Führen Sie beide Methoden zur Erstellung der Tabelle und des Indexes mehrmals (mind. fünf mal) durch, berechnen Sie jeweils die Gesamtzeit für alle Operationen und bilden Sie den Mittelwert von der Durchläufe. Gibt es einen Unterschied zwischen den durchschnittlichen Gesamtlaufzeiten für Methode 1 und 2? Wie erklären Sie den Unterschied? 1 Aufgabe 5.2: 10 Punkte In der Datenbank aus Aufgabe 1 können Sie auf die Tabelle DBIIB08_HINNEBURG.multidim zugreifen. Die Tabelle hat vier Integer-Attribute a1, a2, a3 und a4, die jeweils Werte zwischen 0 und 7 annehmen können. Es sind 128 Tupel in der Tabelle gespeichert. Mit der folgenden Anfrage können Sie die Anzahl der Tupel berechnen, deren Werte in a1 und a2 jeweils zwischen 2 und 3 liegen: select count(*) from DBIIB08_HINNEBURG.multidim where 2<=a1 and a1<=3 and 2<=a2 and a2<=3; Wenn Sie diese Anfrage mittels Linearisierung durch Z-Kurve und eindimensionalen Index unterstützen wollen, muss für alle Tupel die Position auf der Z-Kurve bezüglich der 2D-Koordinaten (a1,a2) berechnet werden. Außerdem muß noch geprüft werden, ob die Position auf der Z-Kurve innerhalb des Intervalls liegt, das das Anfragefenster vollständig enthält. Da die Z-Kurve die mehrdimensionalen Integer-Koordinaten monoton numeriert, müssen für die Prüfung die beiden Eckpunkte (3,3) und (4,4) transformiert werden. Deren Transformation ergibt die Eckpunkte des Intervalls auf der ZKurve, das das Anfrageintervall vollständig enthält. Die folgende Anfrage implementiert alle notwendigen Operationen in SQL: select count(*) from ( select a1,a2, mod(trunc(a1/1),2) *1 + mod(trunc(a2/1),2) *2 + mod(trunc(a1/2),2) *4 + mod(trunc(a2/2),2) *8 + mod(trunc(a1/4),2) *16 + mod(trunc(a2/4),2) *32 as zorder from DBIIB08_HINNEBURG.multidim ) tmp where mod(trunc(3/1),2) *1 + mod(trunc(3/1),2) *2 + mod(trunc(3/2),2) *4 + mod(trunc(3/2),2) *8 + mod(trunc(3/4),2) *16 + mod(trunc(3/4),2) *32 <= zorder and zorder <= mod(trunc(4/1),2) *1 + mod(trunc(4/1),2) *2 + mod(trunc(4/2),2) *4 + mod(trunc(4/2),2) *8 + mod(trunc(4/4),2) *16 + mod(trunc(4/4),2) *32 ; Erklären Sie, was die in SQL implementierte Transformation von den 2D-Koordinaten in die Z-Kurvennumerierung macht.1 Führen Sie beide Statements aus und geben Sie berechneten die Anzahlen an. Geben Sie das im zweiten Statement genutzte Suchintervall in Z-Kurvenpositionen an. Verallgemeinern Sie die Statements für den zweidimensionalen Fall auf drei und vier Dimensionen und berechnen Sie die Anzahl der im Anfragefenster enthaltenen Tupel bzw. die Anzahl der durch die Z-Kurve gefilterten Trefferkandidaten. 1 Die Funktion trunc schneidet von einer Kommazahl die Nachkommastellen ab und mod(a,b) ist a mod b. 2