Universität Augsburg, Institut für Informatik Prof. Dr. Werner Kießling M. Endres, A. Huhn, T. Preisinger WS 2005/2006 16. Jan. 2006 Lösungsblatt 10 Datenbanksysteme I Aufgabe 1: Einrichten einer DB für Query-Optimierung Kein Lösungsvorschlag notwendig. Aufgabe 2: Algebraische Query-Optimierung Lösungsvorschlag: a) SQL-Statement in relationaler Algebra πg.ngc, g.messier, g.sternbildname (σg.sternbildname = s.name ∧ s.name = sb.sternbildname ∧ g.kategorie=’Galaxie’ (g × s) × sb) b) Hill-Climbing-Algorithmus: Initaler und optimierter Operatorbaum: c) Zwischenergebnisse: Anzahl der Elemente: Anzahl der Elemente in der Relation Galaxie: 98 Anzahl der Elemente in der Relation Sternbild: 86 Anzahl der Elemente in der Relation Sternbildbeschreibung: 12 Ohne Optimierung: Nach g × s: 8428 Nach (g × s) × sb: 101136 Nach der Selektion: 15 Mit Optimierung: Selektion auf g: 38 Equijoin mit s: 38 1 Equijoin mit sb: 15 In der Ergebnismenge sind die Galaxien enthalten, die in einem Sternbild mit Beschreibung liegen und tatsächlich Galaxien sind. Aufgabe 3: Ausführungsplan in Oracle EXPLAIN PLAN und plan table. a) Erstellen der plan table: CREATE TABLE plan_table (statement_id VARCHAR2(30), timestamp DATE, remarks VARCHAR2(80), operation VARCHAR2(30), options VARCHAR2(30), object_node VARCHAR2(128), object_owner VARCHAR2(30), object_name VARCHAR2(30), object_instance NUMERIC, object_type VARCHAR2(30), optimizer VARCHAR2(255), search_columns NUMERIC, id NUMERIC, parent_id NUMERIC, position NUMERIC, cost NUMERIC, cardinality NUMERIC, bytes NUMERIC, other_tag VARCHAR2(255), other LONG); b) Query ausführen: EXPLAIN PLAN SET STATEMENT_ID = ’Optimierung’ FOR SELECT g.ngc, g.messier, g.sternbildname FROM Galaxie g, Sternbild s, Sternbildbeschreibung sb WHERE g.sternbildname = s.namedeutsch AND s.namedeutsch = sb.sternbildname AND g.kategorie=’Galaxie’; c) Anfrage an die plan table: SELECT operation, options, object_name, id, parent_id FROM plan_table WHERE statement_id=’Optimierung’ Ergebniss: 2 OPERATION SELECT STATEMENT NESTED LOOPS NESTED LOOPS TABLE ACCESS INDEX INDEX OPTIONS null null null FULL UNIQUE SCAN UNIQUE SCAN OBJECT NAME null null null GALAXIE SYS C0025960 SYS C0025961 ID 0 1 2 3 4 5 PARENT ID null 0 1 2 2 1 Graphische Darstellung: SELECT Statement NESTED LOOPS VVVV i VVVV iiii i i VVVV i VVVV iii i i i VV i i i Zugriff mit Index (SB) NESTED LOOPS TTTT jj j T j T j T TTTT jjj TTTT jjjj j TT j j j TABLE ACCESS Zugriff mit Index (S) Galaxie Interpretation: Der Zugriff erfolgt, sofern möglich, mit den Primärschlüssel-Indizes. Die EquiJoins werden als NESTED LOOPS durchgeführt. Die Reihenfolge der Operationen entspricht dem optimierten Operatorbaum. Aufgabe 4: Erstellen eines Index - Performancemessung a) Erstellen und Füllen der Relation Kart Produkt: CREATE TABLE Kart_Produkt( ngc integer, messier integer, G_sternbildname varchar2(50), kategorie varchar2(200), namedeutsch varchar2(50), namelateinisch varchar2(50), abkuerzung varchar2(5), SB_sternbildname varchar2(50) ); INSERT INTO Kart_Produkt SELECT g.ngc, g.messier, g.sternbildname, g.kategorie, s.namedeutsch, s.namelateinisch, s.abkuerzung, sb.sternbildname FROM Galaxie g, Sternbild s, Sternbildbeschreibung sb b) SQL-Statement 3 1) Die Query benötigt im Mittel etwa 15 Millisekunden. 2) Der Index kann auf kategorie oder messier eingerichtet werden, da diese Attribute in der WHERE-Klausel abgefragt werden. Wird auf beiden Attributen jeweils ein Index erstellt, verlangsamen diese aufgrund eines komplexeren Ausführungsplans die Query. CREATE INDEX kategorie_index ON Kart_Produkt(kategorie); oder RCEATE INDEX messier_index ON Kart_Produkt(messier); 3) Die Query braucht wiederum ca. 15 Millisekunden, es hat sich also keine Beschleunigung ergeben. 4) Das Statement mit EXPLAIN PLAN: EXPLAIN PLAN SET STATEMENT_ID = ’Kart_Prod’ FOR SELECT ngc, messier, G_sternbildname FROM Kart_Produkt WHERE Kategorie=’Diff. Nebel’ AND messier < 60; Die Anfrage an die plan table: SELECT operation, options, object_name FROM plan_table WHERE statement_id=’Kart_Prod’ und das Ergebnis: OPERATION SELECT STATEMENT TABLE ACCESS OPTIONS null FULL OBJECT NAME null KART PRODUKT Oracle entscheidet automatisch, dass der Index nicht verwendet werden soll und die Relation FULL gelesen wird. Andernfalls würde an dieser Stelle der Relation ein INDEX auftauchen, beispielsweise, wenn Oracle den PRIMARY KEY-Index verwendet. Da Oracle den Index nicht verwendet, entsteht auch kein Unterschied in der Ausführungsdauer der Query. Aufgabe 5: 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) 4