Universität Augsburg, Institut für Informatik Dr. W.-T. Balke M. Endres, A. Huhn, T. Preisinger WS 2006/2007 18. Dez. 2006 Lösungsblatt 8 Datenbanksysteme I Aufgabe 1: Rekursion mit JDBC import java.sql.*; public class Ancestor { private String USER="USER"; private String PWD="PWD"; private String URL="jdbc:oracle:thin:" +"@info-dbis-srv1.informatik.uni-augsburg.de:1521:dbs1"; private Connection con; private Statement stmt; // Datenbanktreiber registrieren static { try { DriverManager.registerDriver( new oracle.jdbc.driver.OracleDriver()); } catch (SQLException e) { System.out.println("Unable to register JDBC driver: " + e.getMessage()); } } // Verbindung zur Datenbank aufbauen public void connect() { try { con = DriverManager.getConnection(URL,USER,PWD); } catch (SQLException e) { System.out.println("Unable to connect to database: " + e.getMessage()); } } // Beziehung zwischen Vor- und Nachfahre bestimmen public void r() { try { // Fuege die Eltern-Kind-Beziehungen in Ancestor ein stmt = con.createStatement(); stmt.executeUpdate("INSERT INTO Ancestor " + "(SELECT * FROM Parent)"); ResultSet rs; 1 // Berechne iterativ Vorfahren der naechsten // Generation und speichere die // neu hinzugekommenen in der Tabelle Ancestor while(true) { int vorher, nachher; rs = stmt.executeQuery("SELECT count(*) " + "FROM Ancestor"); rs.next(); vorher = rs.getInt(1); stmt.executeUpdate("INSERT INTO Ancestor ( " + "SELECT a.anc, b.des FROM Ancestor a, Ancestor b " + "WHERE a.des = b.anc " + "MINUS (SELECT * FROM Ancestor))"); rs = stmt.executeQuery("SELECT count(*) " + "FROM Ancestor"); rs.next(); nachher = rs.getInt(1); System.out.println(vorher); System.out.println(nachher); if(vorher==nachher) break; } // Aufraeumen rs.close(); con.close(); } catch (SQLException e) { // Fehler ausgeben System.out.println("error: " + e.getMessage()); } } // main Methode public static void main(String [] args) { Ancestor ancestor = new Ancestor(); ancestor.connect(); ancestor.r(); } } Aufgabe 2: Vertauschung von Selektion und Natural Join Zu zeigen war: σr ∧ s (R ./ S) = σr (R) ./ σs (S) Beweis: σr∧s (R ./ S) = σr (σs (R ./ S)) = σr (R ./ σs (S)) = σr (R) ./ σs (S) 2 Aufgabe 3: Algebraische Query-Optimierung Gegeben seien folgende Relationen: R (a, b) S (b, c, d) T (a, c, e) U (c, f) Dabei entsprechen sich Attribute mit dem gleichen Buchstaben. Optimieren Sie die folgenden Anfragen. Stellen Sie dazu den Ausgangs-Baum und den optimierten Baum dar. Beschreiben Sie Ihr Vorgehen und gehen Sie auf Besonderheiten der Anfragen ein. a) πa,d,e (σb<10 (T ./ σa>c (R ./ S))) Augsgangsbaum πa,d,e optimierter Baum πa,d,e σb<10 ./a,c ./a,c t t DD DD DD D £ ££ £ ££ ££ ££ £ £ GG GG GG G σa>c σa>c r y yy yy y y (πa,c,d ) ./b= == == = v vv vv v v s σb<10 ./b H HH HH HH σb<10 r s Die Selektion b < 10 ist jeweils auf R und S anwendbar und wird deshalb ganz nach unten geschoben. Nach dem Join auf R und S wird das Attribut b nicht mehr benötigt und deshalb über eine zusätzliche Projektion eliminiert. b) πa,b,f (σa=10 ∨ f =5 (R ./ (U ./ (T ./ S)))) 3 Augsgangsbaum πa,b,f optimierter Baum σa=10 ∨ f =5 σa=10 ∨ f =5 ./a,b R v vv vv v vv U II II II II uu uu u u uu ./a,b R vv vv v v vv πa,b,f ./c; ;; ;; ; ./c8 T U 88 88 8 ¤¤ ¤¤ ¤ ¤ KKK KKK KK r rr rr r r rr ./c A AA AA A ./c< ~~ ~~ ~ ~ πa,c S << << < πb,c T S Die Selektion bezieht sich auf a, welches in R und T auftaucht. f ist nur in U zu finden, kann aber wegen der Oder-Verknüpfung nicht nach unten verschoben werden. Die Attribute d und e sind ohne Bedeutung und können deshalb ’ausgeblendet’ werden. Sobald S,T und U gejoint wurden, ist auch C irreleveant. c) πe,f (σf =14 ∧ c=27 (R ./ (T ./ U ))) Augsgangsbaum πe,f optimierter Baum πe,f σf =14 ∧ c=27 R uu uu u u uu ./a E ./a J JJ JJ JJ J T tt tt tt t tt r EE EE EE ¢¢ ¢¢ ¢ ¢ πa,e,f ./c9 y yy yy y y 99 99 9 σc=27 U T ./c L LLL LLL LL σf =14 ∧ c=27 U Da die Bedingungen in der Selektion durch ein Und verknüpft werden, können diese zerlegt und nach unten geschoben werden. Nach dem Join ist das Attribut c nicht mehr notwendig, eine Projektion eliminiert c. Aufgabe 4: B*-Bäume: Einfügen und Löschen Zeichnen Sie den folgenden B*-Baum (k = 2) jeweils a) nach dem Einfügen von 15, 13 und 30 b) nach dem Einfügen von 23 4 c) nach dem Löschen von 42 einmal neu. • 3 ±± ±± ± ±± ±±¨ ± • • 20 ² ² 1 2 3 6 11 18 20 25 28 a) Nach dem Einfügen von 15, 13 und 30 • 3 • • 11 ²² ²² ² ²² ²²¨ ² ² 1 2 3 6 • 3 1 2 3 6 11 13 15 18 33 33 33 33 3¼ • 20 ² tt tt tt t t tt tt t tt ytt • 11 • 9 99 99 99 99 99 ¿ ² •3 37 42 37 •3 33 33 33 33 3¼ ² 11 13 15 18 b) Nach dem Einfügen von 23 t• ¶ ¶¶ ¶ ¶¶ ¶ª¶ ¶ 37 37 42 20 25 28 30 20 • OOOO OOO OOO OOO OOO OOO OOO ' • • 25 ³³ ³³ ³ ³³ ³³¨ ³ 20 23 37 •.. . .. .. .. .º ² 25 28 30 37 42 c) Nach dem Löschen von 42 • 3 ¶¶ ¶¶ ¶ ¶ ¶ª¶ ¶ 1 2 t• tt t t tt tt t t tt tt t ytt • 11 • 9 99 99 99 99 99 ² ¿ 3 6 11 13 15 18 20 • MMM MMM MMM MMM MMM MMM MM • 25 & • ³³ ³³ ³ ³³ ³³¨ ³ 20 23 5 ² 25 28 30 •.. . .. .. .. .º 30 37