Untersuchungen zur Optimierung von Universalrelation-Sichten Diplomarbeit im Studiengang Mathematik mit Studienrichtung Informatik vorgelegt von: Martin Boroske Universität Hannover – Institut für Informatik Fachgebiet Datenbanken und Informationssysteme Prüfer: Dr. Hans Hermann Brüggemann Zweitprüfer: Prof. Dr. Udo Lipeck Hannover, 4. Oktober 2001 1 Zusammenfassung Universalrelation-Systeme sind ein Konzept, dem Benutzer eines relationalen Datenbankmanagementsystems beim Stellen einer Anfrage die Arbeit der Bestimmung der beteiligten Relationen und des Verknüpfens dieser Relationen abzunehmen, indem das System diese Verknüpfungen automatisch erstellt. Der Benutzer erhält dadurch eine einheitliche uni” verselle“ Sicht auf das Datenbankschema. In früheren Arbeiten vorgestellte Universalrelation-Systeme waren als ein Frontend realisiert, welche diese Arbeit durch Erzeugen entsprechender SQL-Befehle erledigten. Diese dabei vom System erzeugten SQL-Befehle können sehr schnell sehr komplex werden. Die vorliegende Arbeit geht von einer früheren Implementierung eines solchen Universalrelation-Systems aus und untersucht die von diesem System erzeugten Anfragen auf Optimierungsmöglichkeiten. Es wird der Frage nachgegangen, inwieweit bei der Erzeugung des sog. Fensters auf die Universalrelation das Erstellen von Sichten sich auf die Performance auswirkt. Ebenso analysiert wird die Frage, ob bei der Konstruktion des Fensters der Verbund der beteiligten Relationen über den äußeren Verbund“ ” (Outer Join) durchgeführt werden kann, und inwiefern dies Auswirkungen auf die Komplexität und Performance des Universalrelation-Systems hat. Beide Untersuchungen sind mit positivem Ergebnis zu bewerten. Die sich daraus ergebende neue Arbeitsweise des vorgestellten Universalrelation-Systems wird übersichtlich dargestellt. 2 Inhaltsverzeichnis 1 Einführung 6 2 Universalrelation-Systeme 8 2.1 2.2 2.0.1 Beispiel . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 2.0.2 Datenbankschemas und Hypergraphen . . . . . . . . . . . 12 2.0.3 γ-Azyklizität . . . . . . . . . . . . . . . . . . . . . . . . . 13 Voraussetzungen an das Datenbankschema . . . . . . . . . . . . . 17 2.1.1 Test der Attributnamen-Eindeutigkeit . . . . . . . . . . . 18 2.1.2 Umformung des Film-Datenbankschemas . . . . . . . . . 20 2.1.3 Test auf γ-Azyklizität . . . . . . . . . . . . . . . . . . . . 26 Arbeitsweise des Universalrelation-Systems . . . . . . . . . . . . 27 2.2.1 Bezeichnungen . . . . . . . . . . . . . . . . . . . . . . . . 29 2.2.2 Universalrelation-Kern . . . . . . . . . . . . . . . . . . . . 29 2.2.3 1. Erweiterung: Datenbank-Variablen . . . . . . . . . . . . 32 2.2.4 2. Erweiterung: Geschachtelte Anfragen . . . . . . . . . . 33 2.2.5 3. Erweiterung: Mengen-Operationen . . . . . . . . . . . . 35 2.2.6 4. Erweiterung: ODER-Bedingungen . . . . . . . . . . . . 35 2.2.7 Beispiele . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 3 Literaturübersicht zum Thema Universalrelation-Systeme“ 43 ” 3.1 Vorläufer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 3.2 Theorie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 3.3 Weiterführungen und Anwendungen . . . . . . . . . . . . . . . . 44 4 Die Überarbeitung des bisherigen Universalrelation-Systems 46 4.1 Erweiterung auf Sichten . . . . . . . . . . . . . . . . . . . . . . . 46 4.2 Umwandlung der Applikation in ein Applet . . . . . . . . . . . . 49 4.2.1 Einschränkungen eines Applets . . . . . . . . . . . . . . . 49 4.2.2 Änderungen am Programm . . . . . . . . . . . . . . . . . 50 Vereinheitlichung von Disjunktionen und Vereinigungen . . . . . 51 4.3 3 5 Optimierungsuntersuchungen 5.1 5.2 55 Ersetzen der Sicht-Definitionen . . . . . . . . . . . . . . . . . . . 55 5.1.1 Mehrfach vorkommende Hypergraph-Kanten . . . . . . . 55 5.1.2 Verzicht auf Sichten-Erzeugung . . . . . . . . . . . . . . . 55 5.1.3 Fazit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 Verwendung von Outer-Joins . . . . . . . . . . . . . . . . . . . . 59 TM 5.2.1 Outer-Join und Oracle8 . . . . . . . . . . . . . . . . . 60 5.2.2 Verwendung von Outer-Joins im Universalrelation-System 63 5.2.3 Die einzelnen Fälle des Universalrelation-Systems in Verbindung mit Outer-Joins . . . . . . . . . . . . . . . . . . . 66 Beispiele und Zugriffspläne . . . . . . . . . . . . . . . . . 67 5.2.4 TM 5.2.5 Outer-Join und Oracle9 . . . . . . . . . . . . . . . . . 72 5.2.6 Zeitmessungen . . . . . . . . . . . . . . . . . . . . . . . . 74 5.2.7 Fazit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 6 Das neue“ Universalrelation-System ” 84 7 Ausblick 87 Abbildungsverzeichnis 1 ER-Modell des Bibliotheks-Datenbankschemas . . . . . . . . . . 9 2 Hypergraph des Bibliotheks-Datenbankschemas . . . . . . . . . . 12 3 ER-Modell des γ-zyklischen Bibliotheks-Datenbankschemas . . . 14 4 Hypergraph des γ-zyklischen Bibliotheks-Datenbankschema . . . 14 5 Hypergraph des γ-zyklischen Bibliotheks-Datenbankschema . . . 16 6 ER-Modell des ursprünglichen Film-Datenbankschemas . . . . . 18 7 Hypergraph des Film-Datenbankschemas nach erster Umbenennung 22 8 Hypergraph des endgültigen Film-Datenbankschemas . . . . . . . 23 Tabellenverzeichnis 1 SQL-Kommandos zum Bibliotheks-Datenbankschema . . . . . . . 2 SQL-Kommandos zum γ-zyklischen Bibliotheks-Datenbankschema 15 3 SQL-Kommandos zum ursprünglichen Film-Datenbankschema . . 4 10 19 4 SQL-Kommandos zum endgültigen Film-Datenbankschema . . . 24 5 SQL-Kommandos zum endgültigen Film-Datenbankschema Fortsetzung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 HTML-Seite zum Aufruf des Universalrelation-System-Applets . 50 6 Algorithmenverzeichnis 1 DMF-Reduktion . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 2 Erzeugung des Fensters [X] mit der minimalen Verbindungssemantik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 3 modifizierter GYO-Algorithmus . . . . . . . . . . . . . . . . . . . 30 4 Outer-Join-Bildung über alle Relationen . . . . . . . . . . . . . . 63 5 Outer-Join-Bildung über alle Relationen - Anmerkungen . . . . . 64 6 Outer-Join-Bildung über alle Relationen in Oracle9i . . . . . . . 72 7 Outer-Join-Bildung über alle Relationen in Oracle9i - Anmerkungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 Erzeugung des Fensters [X] mittels Outer-Join . . . . . . . . . . 84 8 5 1 Einführung Ein Benutzer eines relationalen Datenbankmanagementsystems (DBMS) hat bei der Erstellung einer Anfrage in der Regel drei wichtige Kriterien zu beachten: 1. Welche Daten möchte ich haben? 2. Aus welchen Relationen erhalte ich diese Daten? 3. Welche Bedingungen und Einschränkungen gelten für diese Daten? Insbesondere Punkt 2 und 3 erfordern erhöhte Aufmerksamkeit, da für diese das zugrundeliegende Datenbankschema und auch die Regeln zur Verknüpfung der einzelnen Relationen (sog. Verbundbedingungen“) dieses Schemas gut bekannt ” sein müssen. Universalrelation-Systeme sind ein Konzept, dem Benutzer eines relationalen DBMS diese logische Navigation“ in einem Datenbankschema zu erleichtern, ” indem es die Bestimmung der beteiligten Relationen sowie das Erzeugen der Verbundbedingungen automatisch durchführt, das heißt der Benutzer kann sich ganz darauf beschränken, die gewünschten Attribute und die für diese Attribute geltenden Einschränkungen zu bestimmen. Ein Universalrelation-System kann als eigenständige System entwickelt sein, oder aber relativ unkompliziert als Frontend für bestehende DBMS entwickelt werden (vgl. [Bor01], [BT93]). Diese Systeme stellen dem Benutzer eine an SQL angelehnte Anfragesprache zu Verfügung und erhalten das Ergebnis einer Anfrage, indem die vom Benutzer eingegebene Anfrage in entsprechende SQL-Befehle umgesetzt wird. Die Anzahl und die Komplexität der dabei erzeugten SQL-Befehle kann dabei sehr stark anwachsen. Die vorliegende Arbeit versucht, durch Analyse der von dem in [Bor01] vorgestellten Universalrelation-Systems erzeugten SQL-Befehle mögliche Optimierungen der Arbeitsweise des Universalrelation-Systems, und damit implizit eine Verringerung der Anzahl oder Komplexität der SQL-Befehle zu finden. Gliederung der vorliegenden Arbeit In den Abschnitten 2, 2.1 und 2.2 wird eine Einführung in die Theorie der Universalrelation-Systeme gegeben, es wird erläutert, welche Voraussetzungen an das zugrundeliegende Datenbankschema gestellt werden, und die Arbeitsweise des in [Bor01] vorgestellten Universalrelation-Systems wird dargestellt. Der Abschnitt 3 gibt eine Übersicht über Literatur zum Thema Universalrelation-Modelle und -Systeme. Im Abschnitt 4 werden Änderungen beschrieben, die am in [Bor01] vorgestellten Universalrelation-System unabhängig von den Optimierungsuntersuchungen vorgenommen wurden. Der Abschnitt 5 werden die vorgenommenen Optimierungsuntersuchungen beschrieben, dokumentiert und ausgewertet. 6 Die in diesem Abschnitt gefundenen positiven Ergebnisse werden in Abschnitt 6 zusammengefaßt, und es wird die aus diesen Untersuchungen abgeleitete geänderte Arbeitsweise des Universalrelation-Systems beschrieben. Abschließende Betrachtungen finden im Ausblick (Abschnitt 7) ihren Platz. 7 2 Universalrelation-Systeme In relationalen Datenbankmanagementsystemen ist es zum Stellen einer Anfrage notwendig, alle Attribute anzugeben, die vom System ausgegeben werden sollen, aus welchen Relationen diese Attribute selektiert werden, sowie die Eigenschaften, die diese zu erfüllen haben. Ein Teil dieser Eigenschaften sind die Bedingungen, in welcher Form die beteiligten Relationen miteinander verknüpft werden sollen (Verbundbedingungen). Es ist also notwendig, die innere Struktur eines Datenbankschemas genau zu kennen, um erfolgreich Anfragen stellen zu können. Universalrelation-Systeme wurden entwickelt mit der Zielsetzung, den Benutzer von dieser logischen Navigation durch das Datenbankschema zu befreien. Erreicht wird dies, indem dem Benutzer nur noch eine universelle Relation zugänglich ist, in der alle Daten der Datenbank gespeichert sind. Der Ansatz zu dieser universellen Relation liegt darin, daß die in einem Datenbankschema vorkommenden Relationen stets über den natürlichen Verbund miteinander verknüpft sind. In einem Universalrelation-System muß zum Stellen einer Anfrage nur noch die gewünschte Menge der Attribute sowie die gewünschten Eigenschaften dieser Attribute angegeben werden. Zusammen mit der Information über das benutzte Datenbankschema ist dann das System in der Lage, die gewünschten Ergebnistupel zu bestimmen. Dazu muß ein (möglichst minimaler) Ausschnitt aus dem Datenbankschema gefunden werden. Um semantisch eindeutige Ergebnisse zu erhalten, ist unter anderem notwendig, daß das verwendete Datenbankschema γ-azyklisch ist. 8 Autor Autorenname Hrsg hat Autor Position Signatur Inventarnr ISBN Titel Erscheinungsjahr Buch ist Exemplar von Exemplar Auflage wird verlegt ISBN-Code Verlagsname Verlag Verlagsort Abbildung 1: ER-Modell des Bibliotheks-Datenbankschemas 2.0.1 Beispiel Anhand eines Beispiels seien die Vorteile eines Universalrelation-Systems veranschaulicht. Gegeben sei das in Abbildung 1 definierte Datenbankschema einer Bibliotheksdatenbank. Gespeichert sind Informationen über Bücher, ihre Autoren und ihre Verlage sowie über die in der Bibliothek vorhandenen Exemplare. Ein Buch wird durch seine ISBN identifiziert. Jedes Buch kann mehrfach vorhanden sein, verschiedene Exemplare eines Buches haben die gleiche ISBN, unterscheiden sich jedoch in Signatur und Inventarnummer. Verlage werden identifiziert durch die ersten Stellen der ISBN ihrer Bücher, den ISBN-Code. Weitere Attribute eines Verlages sind der Verlagsname sowie das mengenwertige Attribut Verlagsort. Eine relationale Umsetzung dieses Schemas könnte wie in Tabelle 1 aussehen. 9 CREATE TABLE Buch ( ISBN char(13) primary key, Titel char(150), Erscheinungsjahr number, Auflage number(4) ); CREATE TABLE wird_verlegt ( ISBN char(13) primary key, ISBN_Code char(9) not null ); CREATE TABLE Verlag ( ISBN_Code char(9) primary key, Verlagsname char(30) not null ); CREATE TABLE Verl_Orte ( ISBN_Code char(9) not null, Verlagsort char(30) ); CREATE TABLE Autor ( ISBN char(13) not null, Autorenname char(30) not null, Hrsg char(4) not null, Position number(2) not null ); CREATE TABLE Exemplar ( ISBN char(13) not null, Signatur char(16) primary key, Inventarnr char(8) not null ); Tabelle 1: SQL-Kommandos zum Bibliotheks-Datenbankschema 10 Gegeben sei nun folgende Anfrage: Gesucht sind alle Bücher, mit ihren Autorennamen und ihrem Verlagsnamen. Unter SQL würde dies zu folgender Anfrage führen: SELECT Buch.Titel, Autor.Autorenname, Verlag.Verlagsname FROM Buch, Autor, Verlag, wird_verlegt WHERE Buch.ISBN = Autor.ISBN AND Buch.ISBN = wird_verlegt.ISBN AND wird_verlegt.ISBN_code = Verlag.ISBN_code; Es fällt auf, daß in vier der fünf Zeilen dieser Anfrage nur die Relationen und ihre Verbundbeziehungen festgelegt werden. Die äquivalente Anfrage an das Universal-Relation-System lautet folgendermaßen: SELECT Titel, Autorenname, Verlagsname; Sei nun folgende Anfrage gegeben: Gesucht sind alle ISBN-Nummern. Unter SQL lautet diese Anfrage: SELECT UNION SELECT UNION SELECT UNION SELECT ISBN FROM Buch ISBN FROM wird_verlegt ISBN FROM Autor ISBN from Exemplar; Bei dieser Anfrage fällt auf, daß die Hauptarbeit in der Festlegung der einzelnen Relationen besteht, in denen das gesuchte Attribut vorkommt. Die äquivalente Anfrage an das Universal-Relation-System lautet hier: SELECT ISBN; Allerdings werden durch die Benutzung des Universal-Relation-Systems nicht alle Anfragen einfacher: Die SQL-Anfrage SELECT titel, verlagsname FROM Buch, Verlag; hätte im Universal-Relation-System folgende Entsprechung: SELECT a.Titel AS Titel, b.Verlagsname AS Verlagsname; Das Universalrelation-System geht davon aus, daß zwischen alle beteiligten Relationen einer Anfrage eine Standardverknüpfung vorliegt. Um hier zu verhindern, daß diese Beziehung verwendet wird, muß an dieser Stelle mit verschiedenen Kopien das Datenbankschemas gearbeitet werden. 11 Verl_Orte Verlagsname Verlagsort Verlag Exemplar ISBN_Code Inventarnr Signatur wird_verlegt ISBN Autor Titel Autorenname Hrsg Position Buch Erscheinungsjahr Auflage Abbildung 2: Hypergraph des Bibliotheks-Datenbankschemas 2.0.2 Datenbankschemas und Hypergraphen Im Rahmen der Theorie von Universalrelation-Systemen ist es zweckmäßig, Datenbankschemas als Hypergraphen aufzufassen, da viele Erkenntnisse der Theorie der Hypergraphen ihre Anwendung finden. Ein Hypergraph ist definiert als ein Paar (N, E), wobei N eine endliche Menge von Knoten und E eine Menge von Kanten ist mit e ∈ E ⇒ e ⊂ N . Man kann nun Datenbankschemas als Hypergraphen auffassen, indem jedes Attribut eines Datenbankschemas als Knoten, und jedes Relationsschema als eine Kante des Hypergraphens interpretiert wird. Ein Hypergraph (N, E) heißt zusammenhaängend, falls zu je zwei Kanten e1 , e2 ∈ E ein Weg existiert, es also eine Folge von Kanten (e1 , en1 , . . . , enk , e2) ∈ E gibt, so daß gilt: e1 ∩en1 6= ∅, enk ∩e2 6= ∅ und eni ∩eni+1 6= ∅ ∀i ∈ (1, . . . , k−1). Ein Datenbankschema heißt zusammenhängend, falls der zugehörige Hypergraph zusammenhängend ist. Betrachten wir wiederum das Beispiel-Datenbankschema in Tabelle 1, so wird dadurch der in Abbildung 2 dargestellte Hypergraph definiert. Zur Bearbeitung einer Anfrage wird vom Universalrelation-System ein geeigneter Ausschnitt aus dem Datenbankschema bestimmt. Dieser Ausschnitt ist ein Teil-Hypergraph des Datenbankschemas, und wird Anfragehypergraph genannt. 12 2.0.3 γ-Azyklizität Wie schon weiter oben erwähnt, ist die γ-Azyklizität eines Datenbankschemas eine notwendige Eigenschaft, damit ein Universalrelation-System verwendet werden kann. Aus diesem Grunde soll hier dieser Begriff im Zusammenhang mit Datenbankschemas näher erläutert werden. Ein γ-azyklischer Hypergraph wird wie folgt definiert: Sei H = (N, E) ein Hypergraph. 1. (e1 , A1 , e2 , A2 , . . . , em , Am , em+1 ) ist γ-Kreis (der Länge m) in H :⇔ (a) A1 , . . . , Am sind verschiedene Knoten aus N . (b) e1 = em+1 , e1 , . . . , em sind verschiedene Kanten aus E. (c) m ≥ 3. (d) ∀i ∈ {1..m} : Ai ∈ ei ∩ ei+1 S (e) ∀i ∈ {1..m − 1} : Ai ∈ / j∈{1..m}\{i,i+1} ej . 2. H ist γ-azyklisch :⇔ H enthält keinen γ-Kreis. In Worten formuliert: Ein Hypergraph besitzt einen γ-Kreis, wenn mindestens drei verschiedene Hyperkanten immer paarweise einen Knoten gemeinsam haben, aber keiner dieser Knoten in einer anderen Hyperkante enthalten ist. Wir sprechen von einem γ-azyklischen Datenbankschema, wenn der zugehörige Hypergraph diese Eigenschaft besitzt. Anhand eines Beispieles soll die Notwendigkeit der γ-Azyklizität eines Datenbankschemas erläutert werden. Betrachten wir dazu das in Abbildung 3 und in Tabelle 2 definierte Datenbankschema. Durch dieses Schema wird der in Abbildung 4 angegebene Hypergraph definiert. In diesem Hypergraphen bildet die Folge (leiht aus, Benutzernr, bestellt vor, ISBN, Exemplar, Signatur, leiht aus) von Hyperkanten und Knoten einen γ-Kreis, der Hypergraph und damit das Datenbankschema ist also γ-zyklisch. Semantisch äußert diese Eigenschaft sich folgendermaßen: In diesem Schema gibt es nun zwischen den Attributen Benutzernr und Signatur zwei Beziehungen: • Der durch Benutzernr identifizierte Benutzer hat das Exemplar Signatur ausgeliehen. • Der durch Benutzernr identifizierte Benutzer hat ein Buch vorbestellt, von dem Signatur ein Exemplar ist. Bei der Anfrage SELECT Benutzernr, Signatur; 13 ISBN Titel Signatur Buch Exemplar ist Exemplar von bestellt vor Inventarnr leiht aus Benutzernr Benutzer Benutzername Abbildung 3: ER-Modell des γ-zyklischen Bibliotheks-Datenbankschemas Exemplar Signatur Inventarnr ISBN Titel Buch leiht_aus bestellt_vor Benutzernr Benutzername Benutzer Abbildung 4: Hypergraph des γ-zyklischen Bibliotheks-Datenbankschema 14 CREATE TABLE Buch ( ISBN char(13) primary key, Titel char(150), Erscheinungsjahr number, Auflage number(4) ); CREATE TABLE Exemplar ( ISBN char(13) not null, Signatur char(16) primary key, Inventarnr char(8) not null ); CREATE TABLE Benutzer ( Benutzernr number(10) primary key, Benutzername char(50) not null ); CREATE TABLE leiht_aus ( Benutzernr number(10) foreign key references Benutzer(Benutzernr), Signatur char(16) foreign key references Exemplar(Signatur) ); CREATE TABLE bestellt_vor ( Benutzernr number(10) foreign key references Benutzer(Benutzernr), ISBN char(13) foreign key references Buch(ISBN) ); Tabelle 2: SQL-Kommandos zum γ-zyklischen Bibliotheks-Datenbankschema 15 Exemplar Signatur Signatur Inventarnr ISBN leiht_aus bestellt_vor Benutzernr Benutzernr Abbildung 5: Hypergraph des γ-zyklischen Bibliotheks-Datenbankschema an das Universalrelation-System kann dieses nun ohne weitere Informationen nicht erkennen, welche Beziehung zwischen den beiden Attributen gemeint ist. Dies äußert sich darin, daß die Bestimmung des Ausschnittes aus dem Datenbankschema (dem Anfragehypergraphen) nicht eindeutig ist - die Abbildung 5 zeigt beide möglichen Anfragehypergraphen. 16 2.1 Voraussetzungen an das Datenbankschema Um mit dem hier vorgestellten Universalrelation-System arbeiten zu können, muß ein Datenbankschema folgende Voraussetzungen erfüllen: Die Attributnamen müssen datenbankweit gültig sein Es reicht nicht mehr aus, daß Attributnamen nur innerhalb einer Relation eindeutig sind. Dies ist nötig, da in einer UR-Anfrage nicht angegeben wird, aus welcher Relationen ein Attribut stammen soll. Es muß also gelten, daß zwei Attribute mit dem gleichen Namen stets den gleichen Aspekt der realen Welt bezeichnen (also keine Homonyme vorkommen) und umgekehrt. Diese Bedingung kann durch geeignetes Umbenennen stets erfüllt werden. Das Datenbankschema muß γ-azyklisch sein Wie im letzten Abschnitt dargestellt, führen γ-zyklische Datenbankschemas zu semantisch mehrdeutigen Beziehungen, und damit zu mißverständlichen Anfrageergebnissen. Um dem zu entgehen, sind die in dieser Arbeit vorgestellten Verfahren auf γ-azyklische Datenbankschemas beschränkt. 17 Alias Character Pos ID Title plays Year ID Movie follows Name Sex Person directs Abbildung 6: ER-Modell des ursprünglichen Film-Datenbankschemas 2.1.1 Test der Attributnamen-Eindeutigkeit Bezüglich der Eindeutigkeit von Attributnamen kann nur geprüft werden, ob die zum Datenbankschema gehörenden Attribute gleichen Namens vom gleichen Datentyp sind. Sind sie es nicht, so ist davon auszugehen, daß in diesem Datenbankschema diese Bedingung verletzt ist. Letztlich bleibt es die Aufgabe des Datenbank-Administrators, für die Einhaltung der ersten Bedingung Sorge zu tragen. Wie dies in der Praxis aussehen kann, soll am folgenden Beispiel erläutert werden. Gegeben sei das in Abbildung 6 definierte Datenbankschema einer FilmDatenbank. Gespeichert sind Informationen über Filme, sowie die Darsteller und die Regisseure. In der Relation plays wird festgelegt, welche Person in welchem Film spielt. Attribute dieser Relation sind Alias, in dem ein eventueller Alias-Name dieser Person festgehalten wird, Character , in dem der Name der Rolle gespeichert ist, den diese Person im betreffenden Film spielt, und Pos, in dem die Position festgehalten wird, an welcher Stelle des Abspanns die Person erwähnt wird. In der Relation directs wird der Regisseur eines Filmes gespeichert. Nachfolger eines Filmes werden in der Relation follows festgehalten. Eine relationale Umsetzung dieses Schemas könnte wie in Tabelle 3 aussehen. 18 CREATE TABLE t_Movie ( ID number(6) primary key, Title varchar2(154), Year number(4) ); CREATE TABLE t_Person ( ID number(6) primary key, Name varchar2(), Sex varchar2(1) ); CREATE TABLE t_plays ( Movie number(6) foreign key references t_Movie(ID), Player number(6) foreign key references t_Person(ID), Alias varchar2(45), Character varchar2(195), Pos number(8) ); CREATE TABLE t_directs ( Movie number(6) foreign key references t_Movie(ID), Director number(6) foreign key references t_Person(ID) ); CREATE TABLE t_follows ( Movie number(6) foreign key references t_Movie(ID), Successor number(6) foreign key references t_Movie(ID), ); Tabelle 3: SQL-Kommandos zum ursprünglichen Film-Datenbankschema 19 2.1.2 Umformung des Film-Datenbankschemas Das wie in Tabelle 3 vorgestellte Film-Datenbankschema erfüllt nicht die Forderung nach Attributnamen-Eindeutigkeit. So taucht zum Beispiel der Name ID mehrfach auf, und das Attribut Movie meint das Attribut ID aus der Relation t Movie. Es wird nun ein Verfahren vorgestellt, um ein Datenbankschema so anzupassen, daß es die Forderung nach Attributnamen-Eindeutigkeit erfüllt. Die einzelnen Schritte sind: • Unterschiedliche Attribute unterschiedlich benennen. • Gleiche Attribute gleich benennen. • Relationen aufspalten: – Verschiedene Relationenschemas unterschiedlich benennen und entsprechende Teil-Relationen bestimmen. Anhand des Beispieles des Film-Datenbankschemas sollen die einzelnen Schritte nun erläutert werden. Im Folgenden werden einige Operationen auf den einzelnen Relationen durchgeführt. Diese können prinzipiell auch durch ein Löschen und Neuanlegen der betroffenen Relationen durchgeführt werden. Hier werden diese Operationen allerdings durch Sichten emuliert. Dies hat den Vorteil, daß das alte Datenbankschema nicht verloren geht, man muß allerdings den Nachteil in Kauf nehmen, daß neue Namen für die beteiligten Relationen gefunden werden müssen. Unterschiedliche Attribute unterschiedlich benennen Das Attribut ID wird sowohl in der Relation t Movie als auch in der Relation t Person als Schlüssel verwendet. Da es sich hier offensichtlich um unterschiedliche Attribute handelt, werden diese geeignet umbenannt: CREATE VIEW s_Movie AS ( SELECT ID AS MovieID, Title, Year FROM t_Movie ); CREATE VIEW s_Person AS ( SELECT ID AS PersonID, Name, Sex FROM t_Person ); Gleiche Attribute gleich benennen Nicht nur durch den Schritt sind in dem Schema mehrere Attribute vorhanden, die unterschiedliche Namen haben, obwohl sie den gleichen Aspekt der realen ” Welt“ meinen: In der Relation t plays sind das die Attribute Movie und Player und Director , die sich jeweils auf das Attribut MovieID der Relation s Movie bzw. auf das Attribut PersonID der Relation s Person beziehen (analog verhält es sich mit den Attributen movie und director in der Relation t direts). Diese Attribute werden nun geeignet umbenannt: 20 CREATE VIEW s_plays AS ( SELECT Movie AS MovieID, Player AS PersonID, Alias, Character, Pos FROM t_plays ); CREATE VIEW s_directs AS ( SELECT Movie AS MovieID, Director AS PersonID FROM t_directs ); In der Relation t follows beziehen sich beide Attribute Movie und Successor auf das Attribut MovieID der Relation s Movie. Eine einfache Umbennung der Attribute in MovieID scheitert aber, da dann beide Attribute denselben Namen hätten, was nicht erlaubt ist: CREATE VIEW s_follows AS ( SELECT Movie AS MovieID, Successor AS MovieID FROM t_follows ); ERROR at line 2: ORA-00957: duplicate column name Wir nenne daher die Attribute soweit um, wie es möglich ist: CREATE VIEW s_follows AS ( SELECT Movie AS MovieID, Successor AS SuccessorID FROM t_follows ); Der aus dieser Umsetzung bestimmte Hypergraph ist in Abbildung 7 dargestellt. Wie zu erkennen ist, bildet dieser Hypergraph nicht mehr das in Abbildung 6 definierte Modell ab: Die Universalrelation-Anfrage SELECT MovieID, PersonID würde die Tupel sowohl aus der Relation s directs, als auch aus der Relation s plays selektieren - der Benutzer könnte nicht mehr zwischen Darsteller und Regisseur unterscheiden. Man beachte: Die Hyperkanten s directs, s plays und s follows, zusammen mit den Knoten MovieID und PersonID bilden keinen γ-Kreis. Um dieses Problem zu lösen, wird der letzte Schritt angewendet: Relationen aufspalten Die betroffenen Relationen müssen aufgeteilt“ werden, das heißt, um zum Bei” spiel bei der Relation s Person zu unterscheiden, ob ein Darsteller oder ein Regisseur gemeint ist, müßte man die Relation in zwei Teile teilen, von denen der eine Teil nur die Darsteller enthält, und der andere Teil nur die Regisseure. Am Beispiel der Relation s directs und der betroffenen Relation Person wird dies veranschaulicht: 21 s_directs s_Movie Title SuccessorID Year MovieID s_follows s_Person PersonID Character Alias Pos Name Sex s_plays Abbildung 7: Hypergraph des Film-Datenbankschemas nach erster Umbenennung 22 Player PlayerName PlayerSex PlayerID plays Alias Character Pos Movie MovieID MovieTitle MovieYear directs follows Director DirectorName DirectorSex Successor SuccessorID DirectorID SuccessorTitle SuccessorYear Abbildung 8: Hypergraph des endgültigen Film-Datenbankschemas CREATE VIEW Director AS ( SELECT p.ID AS DirectorID, p.Name AS DirectorName, P.Sex as DirectorSex FROM t_Person p, t_directs d WHERE p.ID = d.director ); In den Tabellen 4 und 5 sind alle Operationen übersichtlich dargestellt. Man beachte: Die Erzeugung der Relation Successor ist strenggenommen nicht notwendig, sondern wird nur aus Bequemlichkeitsgründen mit erzeugt. Aus dieser Umsetzung resultiert der in Abbildung 8 abgebildete Hypergraph. Mit diesem letzten Schritt sind die nötigen Umbenennungen abgeschlossen, und das so entstandene Datenbankschema ist tauglich für den Einsatz mit Universalrelation-Systemen. Zusammenfassend werden hier die ausgeführten Operationen im Überblick dargestellt: • Finde geeignete Umbenennungen für alle Attribute mit – gleichem Namen, die aber unterschiedliche Aspekte darstellen. – unterschiedlichem Namen, die aber denselben Aspekt darstellen. • Für alle Hyperkanten, die dieselbe Menge von Relationen umfassen, aber unterschiedliche Aspekte darstellen, müssen geeignete Aufteilungen der Relationen gefunden werden. 23 /*******************************************************/ /* Attribute geeignet umbenennen: */ /*******************************************************/ CREATE VIEW Movie AS ( SELECT ID AS MovieID, Title AS MovieTitle, Year AS MovieYear FROM t_Movie ); /*******************************************************/ /* Alle Attribute aus T_PERSON, die ein Regisseur */ /* sind, und die Attribute geeignet umbenennen: */ /*******************************************************/ CREATE VIEW Director AS ( SELECT p.ID AS DirectorID, p.Name AS DirectorName, P.Sex as DirectorSex FROM t_Person p, t_directs d WHERE p.ID = d.director ); /*******************************************************/ /* Attribute geeignet umbenennen: */ /*******************************************************/ CREATE VIEW directs AS ( SELECT Movie AS MovieID, Director AS DirectorID FROM t_directs ); /*******************************************************/ /* Alle Attribute aus T_PERSON, die ein Darsteller */ /* sind, und die Attribute geeignet umbenennen: */ /*******************************************************/ CREATE VIEW Player AS ( SELECT p.ID AS PlayerID, p.Name AS PlayerName, p.Sex AS PlayerSex FROM t_Person p, t_plays pl WHERE p.ID = pl.Player ); Tabelle 4: SQL-Kommandos zum endgültigen Film-Datenbankschema 24 /*******************************************************/ /* Attribute geeignet umbenennen: */ /*******************************************************/ CREATE VIEW plays AS ( SELECT Movie AS MovieID, Player AS PlayerID, Alias, Character, Pos FROM t_plays ); /*******************************************************/ /* Alle Attribute aus T_MOVIE, die ein Nachfolger */ /* sind, und die Attribute geeignet umbenennen: */ /*******************************************************/ CREATE VIEW Successor AS ( SELECT m.ID AS SuccessorID, m.Title AS SuccessorTitle, m.Year AS SuccessorYear FROM t_Movie m, t_follows f WHERE m.ID = f.Successor ); /*******************************************************/ /* Attribute geeignet umbenennen: */ /*******************************************************/ CREATE VIEW follows AS ( SELECT Movie AS MovieID, Successor AS SuccessorID FROM t_follows ); Tabelle 5: SQL-Kommandos zum endgültigen Film-Datenbankschema - Fortsetzung 25 2.1.3 Test auf γ-Azyklizität Die in Abschnitt 2.0.3 eingeführte Definition der γ-Azyklizität ist unhandlich, wenn es darum geht, diese Eigenschaft bei einem gegebenen Hypergraphen nachzuweisen. Als Test auf γ-Azyklizität von Hypergraphen (und damit von Datenbankschemas) dient der als DMF-Reduktion bekannte Algorithmus. In der Abbildung Algorithmus 1“ ist die Definition dieses Algorithmus zu finden. ” Eingabe: Der zu prüfende Hypergraph. Verfahren: Führe folgende Operationen in beliebiger Reihenfolge so lange aus, bis keine Änderung mehr auftritt: 1. Kommt ein Knoten nur in einer Hyperkante vor, so entferne diesen Knoten. 2. Enthält eine Hyperkante weniger als zwei Knoten, so entferne diese Hyperkante. 3. Enthalten zwei Hyperkanten die gleiche Knotenmenge, so entferne eine dieser Hyperkanten. 4. Sind zwei Knoten in genau den gleichen Hyperkanten enthalten, so entferne einen dieser Knoten aus allen Hyperkanten. Ausgabe: Der so modifizierte Hypergraph. Der Hypergraph ist γ-azyklisch genau dann, wenn die DMF-Reduktion zum leeren Ergebnis führt. Algorithmus 1: DMF-Reduktion 26 2.2 Arbeitsweise des Universalrelation-Systems Das in [Bor01] entwickelte Universalrelation-System ist ein Frontend, das aus einer vom Benutzer gestellten Anfrage SQL-Kommandos erzeugt, diese an das DBMS weitergibt, und die Ergebnisse dem Benutzer zugänglich macht. Bei der Anfragesprache wurde versucht, so nahe wie möglich am Vorbild“ des ” SELECT -Kommandos von Oracle-SQL zu bleiben, wie es in [Ora97] beschrieben ist. Insbesondere wurde versucht, SQL-typische Erweiterungen wie geschachtelte Anfragen, Tupel-Variablen oder Mengen-Operationen mit abzudecken. Weggelassen wurden alle Elemente aus Oracle-SQL, die sich auf einzelne Relationen des Datenbankschemas beziehen (also alle FROM -Teile des SELECT -Kommandos), sowie die Objekterweiterungen. Weiterhin wurden Aggregatfunktionen (zum Beispiel count(), sum() oder max()) weggelassen, was in Abschnitt 4.3 genauer erläutert wird. Die prinzipielle Arbeitsweise ist folgende: 1. Bestimme die Struktur des benutzten Datenbankschemas. Überprüfe dieses daraufhin, daß es die Voraussetzungen aus Abschnitt 2.1 erfüllt. 2. Aus der vom Benutzer angegebenen Anfrage und der Struktur des Datenbankschemas bestimme die benötigten Anfragehypergraphen, also alle benötigten Attribute und Relationen des Datenbankschemas, sowie deren Verbundbedingungen. 3. Stelle die Anfrage an die Anfragehypergraphen und mache die Ergebnisse dem Benutzer zugänglich. Der genaue Arbeitsablauf ist folgender: • 1. Schritt: ODER-Bedingungen Forme die Bedingungen der WHERE-Klausel in Disjunktive Form um: SELECT <Anfrageattribute> WHERE Disjunkt_1 OR ... OR Disjunkt_n Für jede Teilanfrage SELECT <Anfrageattribute> WHERE Disjunkt_i ermittle: • 2.Schritt: Mengenoperation Für jeden Operanden einer Mengenoperation (UNION, UNION ALL, INTERSECT, MINUS ) berechne: • 3. Schritt: Geschachtelte Anfragen Für die Hauptanfrage und für jede darin enthaltene Unteranfrage berechne: • 4. Schritt: Datenbank-Variablen Berechne für jede vorkommende Datenbank-Variable v ∈ Vj : • 5. Schritt: Anfragehypergraph Berechne Anfragehypergraph Hv,i , und für jede Kante R des 27 Anfragehypergraphen alle Oberrelationen des Datenbankschemas. Bilde anschließend die Vereinigung aller Projektionen auf R als Sicht: [ RelKante v,i := π(R) (S ) S∈D,S⊃R • 6. Schritt: Verbundbedingungen Berechne die Verbundbedingungen und den Ausschnitt der Universalrelation als Sicht: U R v,i := πAnf rageattribute (./Kantev,i , RelKantev,i ) • 7. Schritt: Kartesisches Produkt der Ausschnitte Ermittle das kartesische Produkt der UR-Ausschnitte zu allen Datenbank-Variablen als Sicht: U R j := × U R v,i v∈Vj • 8. Schritt: Einsetzen der Unteranfragen Erzeuge für die Unteranfragen keine Sicht, sondern setze die unter 8. Schritt erstellte SQL-Anfrage in die Sicht der erstellten Hauptanfrage ein. • 9. Schritt: Ergänzung um den Mengenoperanden Ergänze die bisherige (evtl. leere) Sichtdefinition für den UR-Ausdruck um die Anfrage für diesen Mengenoperanden. • 10. Schritt: Anfrage stellen Werte die gestellte UR-Anfrage bzgl. des Gesamtausschnittes der Universalrelation aus, ggf. ergänzt um ORDER-Klauseln und liefere das Ergebnis zurück. • 11. Schritt: Abschließendes Aufräumen Lösche alle definierten Sichten. Das Universalrelation-System wird in mehreren Stufen entwickelt. Dies sind im wesentlichen • Universalrelation-Kern (Schritt 5, 6, 10 und 11) • 1.Erweiterung: Datenbank-Variablen (Schritt 4 und 7) • 2.Erweiterung: Geschachtelte Anfragen (Schritt 3 und 8) • 3.Erweiterung: Mengen-Operationen (Schritt 2 und 9) • 4.Erweiterung: ODER-Bedingungen (Schritt 1) Es folgt nun eine Beschreibung der einzelnen Entwicklungsschritte und deren Arbeitsweise. 28 2.2.1 Bezeichnungen In der Beschreibung der Arbeitsweise der einzelnen Entwicklungsschritte treten immer wieder die Sichten [SET j ]KANTE[ m] k und [SET j ]AHG m auf. Die Benennung dieser Sichten folgt einem Schema, welches hier erläutert werden soll: • Der Namensteil SET j wird immer dann verwendet, wenn diese Sichten zu einem Mengen-Operanden gehören. In solch einem Fall gibt j die Nummer des zugehörigen Mengen-Operanden an. • Der Namensteil m tritt immer dann auf, wenn in der Anfrage DatenbankVariablen vorkommen. Dann wird m durch den Namen der Variable ersetzt, zu dem diese Sichten gehören. • Der Namensteil k bezeichnet die Nummer der Kante des Anfragehypergraphen, zu der diese Sicht gehört. Dieser Namensteil ist immer gleich 0 oder größer. 2.2.2 Universalrelation-Kern Der Universalrelation-Kern ist die grundlegende Ebene. Mit den in dieser Ebene vorkommenden Verfahren ist das System in der Lage, UniversalrelationAnfragen zu bestimmen, alle weiteren Ebenen sind nur noch Erweiterungen des Sprachumfanges des Universalrelation-Systems. Der Universalrelation-Kern kann Anfragen bearbeiten, die folgende Sprachelemente nicht enthalten: • ODER-Bedingungen in der WHERE -Klausel • Datenbank-Variablen • Schachtelungen • Mengen-Operatoren (UNION [ALL], MINUS, INTERSECT). Die Aufgabe des Kerns ist es, ausgehend von der in der Anfrage angegebenen Attribut-Menge X einen geeigneten Ausschnitt aus der Datenbank zu finden (dieser Ausschnitt wird auch Fenster genannt und mit [X] bezeichnet). Das Universalrelation-System berechnet minimalen Verbindungssemantik. dieses Fenster nach der Die formale Definition eines Fensters der minimalen Verbindungssemantik lautet: [ [X ]M C := πX ( o n πV (R )) V ∈AHG R∈RS,R⊇V Ausgehend von einem Anfragehypergraphen wird dieses Fenster also wie in der Abbildung Algorithmus 2“ bestimmt: ” Der Anfragehypergraph einer Menge von Anfrageattributen X wird dabei nach dem modifizierten GYO-Algorithmus bestimmt, welcher in der Abbildung Al” gorithmus 3“ definiert ist. 29 Eingabe: Anfragehypergraph, Attributmenge X Ausgabe: Das zu X gehörende Fenster [X]. Verfahren: • Für jede Kante Rk (k = 0, . . . , m) des Anfragehypergraphens mit der Attributmenge Ak – Bestimme die Projektion aller Relationen der Datenbank, deren Schema eine Obermenge dieser Attributmenge ist. – Bilde die Vereinigung aller dieser Projektionen. • Fasse alle diese Vereinigungen über den natürlichen Verbund zusammen. • Bilde [X] als die Projektion dieses Verbundes auf die Attributmenge X. Algorithmus 2: Erzeugung des Fensters [X] mit der minimalen Verbindungssemantik Eingabe: • γ -azyklisches Datenbankschema als Attributmenge und Menge der Relationenschemas • Anfrageattributmenge X Ausgabe: Der zu X gehörende Anfragehypergraph. Verfahren: So lange sich etwas ändert führe einen der beiden Schritte aus: • Kommt ein Attribut, das nicht in X ist, in höchstens einem Relationenschema vor, so lösche das Attribut. • Sind alle (nicht bereits gelöschten) Attribute eines Relationenschemas vollständig in einem anderen Relationenschema enthalten, so lösche das kleinere Relationenschema. Der Anfragehypergraph sind dann die Mengen der nicht gelöschten Attribute und Relationenschemas des Datenbankschemas. Algorithmus 3: modifizierter GYO-Algorithmus 30 Die genauen Arbeitsschritte sind also: • Auslesen der Informationen aus der Anfrage: Die vom Benutzer eingegebene Anfrage wird ausgewertet und alle relevanten Informationen gesammelt. Dies sind Anfrageattributmenge X Diese Menge enthält alle in der Anfrage vorkommenden Datenbank-Attribute (also die aus dem SELECT -Teil und die aus dem WHERE -Teil). Select-Liste Diese Liste besteht aus allen im SELECT -Teil vorkommenden Ausdrücken. Select-Attribut-Liste Diese Liste besteht aus allen in der Select-Liste vorkommenden Datenbank-Attributen. • Erzeugen des Anfragehypergraphens und des Fensters: Nach den in Algorithmus 2“ und Algorithmus 3“ beschriebenen Verfahren ” ” werden der Anfragehypergraph und die der Anfrage entsprechenden Sicht auf das Datenbankschema berechnet. Das Universalrelation-System erzeugt dabei folgende SQL-Kommandos: CREATE VIEW KANTE_<i> AS SELECT <Anfragehypergraph-Kante i> FROM <Oberrelation i_1> UNION ... UNION SELECT <Anfragehypergraph-Kante i> FROM <Oberrelation i_n> für i = 0, . . . , k. CREATE VIEW AHG_1 AS SELECT <Anfrage-Attribute> FROM KANTE_0, ..., KANTE_<k> WHERE <Verbundbedingungen> Die Verbundbedingungen werden folgendermaßen erzeugt: – Für jedes Attribut A, das in mehreren Relationenschemas (R1 , . . . , Rn ; n ≥ 2) des Anfragehypergraphen vorkommt, wird folgende Bedingung hinzugefügt: R1 .A = R2 .A AND R1 .A = R3 .A AND . . . AND R1 .A = Rn .A Es wird noch eine Sicht erzeugt, die alle Ergebnistupel enthält: CREATE VIEW UR_WINDOW AS SELECT DISTINCT <Select-Attribut-Liste> FROM AHG_1 WHERE <Selektions-Bedingungen>; An diese Sicht wird nun die Anfrage gestellt: 31 SELECT <Select-Liste> FROM UR_WINDOW; Hat man in der Anfrage SQL-typische Erweiterungen, wie ORDERKlauseln verwendet, so werden diese an die Anfrage angehängt: SELECT <Select-Liste> FROM UR_WINDOW ORDER BY Order_Clause; • Abschließendes Aufräumen: Alle zwischenzeitlich erzeugten Sichten werden wieder gelöscht: DROP VIEW UR_WINDOW; DROP VIEW AHG_1; DROP VIEW KANTE_<i>; für i = 0, . . . , k. 2.2.3 1. Erweiterung: Datenbank-Variablen Datenbank-Variablen werden verwendet, um mit verschiedenen Kopien der Datenbank arbeiten zu können. Es muß also für jede auftretende Variable m ein eigener Anfragehypergraph AHGm und das entsprechende Fenster [X]m auf die Datenbank erzeugt werden. Das kartesische Produkt über diese DatenbankAusschnitte ist dann die gesuchte Ergebnismenge. Es ergeben sich also folgende Arbeitsschritte: • Analysieren der Anfrage: Die vom Benutzer angegebene Anfrage wird analysiert. Gegenüber dem bisherigen Verfahren wird nun die Anfrageattributmenge für jede vorkommende Datenbank-Variable getrennt erstellt. Wie bisher werden die Select-Liste und die Select-Attribut-Liste gemeinsam für alle DatenbankVariablen erstellt. • Erzeugen der Anfragehypergraphen und der Fenster: Mit den in Algorithmus 2“ und Algorithmus 3“ beschriebenen Verfahren ” ” werden für jede Datenbank-Variable der Anfragehypergraph und die der Anfrage entsprechenden Sicht auf das Datenbankschema berechnet, und diese Sichten mit dem kartesischen Produkt vereinigt. Seien M := (M1 , . . . , Mn ) die vorkommenden Datenbank-Variablen. Für m ∈ M erzeugt das Universalrelation-System dabei folgende SQLKommandos: CREATE VIEW KANTE_m_i_k AS SELECT <Attribut-Liste>_m FROM <Oberrelation k_1>_m UNION ... UNION SELECT <Attribut-Liste>_m 32 FROM <Oberrelation k_n>_m CREATE VIEW AHG_1 AS SELECT <Anfrage-Attribute>_m1, ... <Anfrage-Attribute>_mn FROM AHG_m1, ..., AHG_mn WHERE VERB_m1, AND ... AND VERB_mn; für i = 0, . . . , k. Dabei sind AHGmj alle Sichten KANTE m i k, und analog V ERBmj die zu AHGmj gehörenden Verbundbedingungen (j = 1, . . . , n). Man beachte: Bei der Erzeugung der Sicht AHG 1 wurden die Erzeugung des Fensters [X]m für jede Datenbank-Variable m ∈ M und das Bilden des kartesischen Produktes über die einzelnen Fenster in einem Schritt durchgeführt. • Anfrage stellen und abschließendes Aufräumen: Am restlichen Teil des Verfahrens ändert sich nichts. Es wird noch eine Sicht erzeugt, die alle Ergebnistupel enthält: CREATE VIEW UR_WINDOW AS SELECT DISTINCT <Select-Attribut-Liste> FROM AHG_1 WHERE <Selektions-Bedingungen>; An diese Sicht wird nun die Anfrage gestellt: SELECT <Select-Liste> FROM UR_WINDOW; Und alle zwischenzeitlich erzeugten Sichten werden wieder gelöscht: DROP VIEW UR_WINDOW; DROP VIEW AHG_1; DROP VIEW KANTE_<i>; für i = 0, . . . , k. 2.2.4 2. Erweiterung: Geschachtelte Anfragen In SQL-Anfragen kommen geschachtelte Anfragen sowohl in der FROM -Klausel, als auch in der WHERE -Klausel vor. Da die FROM -Klausel in SQL-Anfragen keine Entsprechung in den Anfragen an das Universal-Relation-System hat, kann das UR-System deshalb nur geschachtelte Anfragen in der WHERE -Klausel bearbeiten. Es ist in geschachtelten SQL-Anfragen möglich, daß sich Teile der inneren Anfrage auf Attribute der Tabellen der äußeren Anfrage beziehen (sog. Korrelierte geschachtelte Anfragen). Dabei müssen Attributnamen der äußeren Anfrage mit einer Variable eindeutig gekennzeichnet werden, falls sie auch in den Tabellen der inneren Anfrage vorkommen. In den Anfragen des UR-Systems kann nur aufgrund des Namens nicht entschieden werden, ob eine Spalte zur äußeren oder inneren Anfrage gehört (sie kann ja in beiden vorkommen). Daher ist in inneren Anfragen die Verwendung von Variablen zwingend erforderlich, falls sich auf 33 Attribute der äußeren Anfrage bezogen wird. Sind keine Variablen verwendet worden, so wird davon ausgegangen, daß alle in der inneren Anfrage vorkommenden Attribute sich nicht auf die äußere Anfrage beziehen. Das Verfahren zur Bearbeitung von geschachtelten Anfragen ist: Für jede vorkommende geschachtelte Anfrage werden die entsprechenden Anfragehypergraphen und Fenster nach den bisherigen Verfahren berechnet. In der endgültigen Anfrage des Universalrelation-Systems an das Datenbanksystem werden die geschachtelten Anfragen dann übernommen. Somit ergeben sich folgende Arbeitsschritte: • Zerlegen der Anfrage nach den Unteranfragen Beim Parsen wird jedes Vorkommen einer Unteranfrage durch den Bezeichner Subquery j[ attribute ] ersetzt, wobei j das j-te Auftreten einer Unteranfrage beim Parsen bezeichnet, und attribute eine Liste aller Attribute aus der äußeren Anfrage ist, die in der Unteranfrage vorkommen. Für jede Unteranfrage werden vom Parser wie gewohnt alle relevanten Informationen weitergegeben. • Bearbeitung der Unteranfragen Für die auftretenden Unteranfragen werden in der Reihenfolge ihres Auftretens alle ihre Anfragehypergraphen und Fenster bis einschließlich VIEW i nach den bisher bekannten Verfahren erzeugt. Zur eindeutigen Unterscheidung erhalten alle Namen der Sichten ein Präfix SUBQUERY j . Analog zur bisherigen Erzeugung der Sicht UR WINDOW (es wird nur der Teil CREATE VIEW UR WINDOW AS weggelassen) ergibt sich die Definition der Unteranfrage Subquery j[ ] : Subquery_j[ ] ≡ SELECT <Select-Liste_j> FROM SUBQUERY_j_VIEW_1 WHERE <DISJ_1> UNION ... UNION SELECT <Select-Liste_j> FROM SUBQUERY_j_VIEW_n WHERE <DISJ_n> Falls in der Unteranfrage keine Attribute aus der äußeren Anfrage vorkommen, wird der Platzhalter innerhalb [ ]“ leer gelassen. ” • Bearbeitung der äußeren Anfrage Für die äußere Anfrage werden nach den bisherigen Verfahren alle Anfragehypergraphen und das Fenster erzeugt. Die View UR WINDOW wird dann wie bisher erzeugt, allerdings wird jeder Bezeichner Subquery i, der beim Parsen für die entsprechende Unteranfrage in der WHERE -Klausel eingefügt wurde, durch seine Definition der Unteranfrage ersetzt. 34 2.2.5 3. Erweiterung: Mengen-Operationen Als Mengen-Operationen werden Verknüpfungen von zwei Anfragen mit einem Mengen-Operator bezeichnet. Mengenoperatoren sind INTERSECT , MINUS und UNION . Oracle8 kennt darüber hinaus noch den den Operator UNION ALL. Die Auswertung solcher Operationen erfolgt von links nach rechts, falls die Reihenfolge der Auswertung nicht durch die Benutzung von Klammern geändert wird. Eine Mengen-Operation besteht aus einem linken Mengen-Operanden, einem Mengen-Operator und einem rechten Mengen-Operanden. Die genaue Syntax einer Anfrage mit Mengen-Operatoren lautet: Anfrage_1 ( INTERSECT | MINUS | UNION [ALL] ) Anfrage_2 dabei kann Anf rage1 oder Anf rage2 wiederum aus einer Mengen-Operation bestehen. Auf Attribute, die in Anf rage1 vorkommen, darf in Anf rage2 nicht verwiesen werden, und umgekehrt. Laut der Oracle8-SQL-Referenz ([Ora97]) können sowohl Anf rage1 , als auch Anf rage2 , als auch der gesamte Ausdruck in Klammern eingeschlossen sein. Allerdings werden Anfragen, die über die JDBC-Schnittstelle an das RDBMS gestellt werden, nicht korrekt ausgewertet, falls die Anfrage mit einer öffnenden Klammer beginnt (Es wird die Bearbeitung mit dem Fehler ORA-01009: Obligatorischer Parameter fehlt abgebrochen). Daraus ergibt sich (da das Programm zur Universal-Relation über JDBC auf das RDBMS zugreift), daß nur Anf rage2 in Klammern gesetzt werden darf. Die Bearbeitung solcher Anfragen durch das Universalrelation-System erfolgt so, wie man es intuitiv erwarten würde: Jede einzelne Teilanfrage wird komplett bearbeitet, und die Ergebnis-Mengen werden dann bei der Erzeugung der Sicht UR WINDOW entsprechend den Angaben in der Anfrage miteinander vereint, geschnitten oder abgezogen. Eine Besonderheit ist zu beachten: Da in Unteranfragen auch Mengenoperatioen vorkommen können, ist es wichtig, daß die Erzeugung der Anfragehypergraphen und der Fenster aller Teilanfragen in der umgekehrten Reihenfolge ihres Auftretens in der Anfrage vorgenommen wird. 2.2.6 4. Erweiterung: ODER-Bedingungen Möchte der Benutzer Anfragen stellen, die im Bedingungs-Teil OR-Klauseln enthalten, so erwartet man als Ergebnis alle die Tupel, deren Attribute eine der Bedingungen erfüllen, insbesondere auch solche Tupel, die nicht auf allen Attributen definiert sind. Möchte man solche Anfragen mit der bisher vorgestellten Methode bearbeiten, so wird das im Allgemeinen nicht zum gewünschten Ergebnis führen, wie folgendes Beispiel zeigt: Gegeben sei folgender Datenbank-Zustand: 35 Buch Verlag ISBN 0-540-12345-1 0-673-12383-1 ISBN Code 0-540 Titel Datenbanken Java Erscheinungsjahr 1996 1996 Auflage 1 1 Verlagsname Addison-Wesley Gegeben sei nun eine Anfrage nach allen nach 1994 oder im Addison-WesleyVerlag erschienenen Büchern: SELECT Titel WHERE Erscheinungsjahr > 1994 OR Verlagsname = ’Addison-Wesley’; Die Bearbeitung dieser Anfrage mit der bisherigen Methode würde folgende Definition der Hilfssichten UNION i und der Sicht VIEW 1 ergeben: CREATE VIEW KANTE_0 AS SELECT Titel, Erscheinungsjahr, ISBN FROM Buch; Diese Sicht enthält die Werte: KANTE 0 Titel Datenbanken Java Erscheinungsjahr 1996 1996 ISBN 0-540-12345-1 0-673-12383-1 CREATE VIEW KANTE_1 AS SELECT ISBN, ISBN_CODE FROM WIRD_VERLEGT; CREATE VIEW KANTE_2 AS SELECT ISBN_CODE, VERLAGSNAME FROM VERLAG; Die Sicht KANTE 1 enthält dann die Werte KANTE 1 ISBN 0-540-12345-1 ISBN CODE 0-540 CREATE VIEW AHG_1 AS SELECT KANTE_0.ERSCHEINUNGSJAHR ERSCHEINUNGSJAHR, KANTE_2.VERLAGSNAME VERLAGSNAME, KANTE_0.TITEL TITEL FROM KANTE_0, KANTE_1, KANTE_2 WHERE KANTE_0.ISBN = KANTE_1.ISBN AND KANTE_1.ISBN_CODE = KANTE_2.ISBN_CODE; Diese Sicht enthält die Werte: AHG 1 Titel ’Datenbanken’ Erscheinungsjahr 1996 Verlagsname Addison-Wesley Der Datensatz zum Buch Java ist nicht enthalten, da er auf den Attributen ISBN und ISBN CODE in der Tabelle wird verlegt nicht definiert ist. Die Anfrage würde lauten: SELECT Titel FROM KANTE_1 36 WHERE Erscheinungsjahr = 1996 OR Verlagsname = ’Addison-Wesley’; Da in der Sicht VIEW 1 nur der Datensatz zum Buch Datenbanken vorkommt, wird nur dieser von der Anfrage zurückgegeben, obwohl man eigentlich“ auch ” den Datensatz zum Buch Java erwartet. Um auch Anfragen mit OR-Bedingungen (Disjunktionen) zu ermöglichen, muß das bisherige Konzept entsprechend erweitert werden. Um die Methode zu verstehen, vergegenwärtige man sich, daß eine Anfrage der Form SELECT <attribute> WHERE <bedingung1> OR <bedingung2> äquivalent ist zu einer Anfrage der Form SELECT <attribute> WHERE <bedingung1> UNION SELECT <attribute> WHERE <bedingung2> Dabei sind bedingung1 und bedingung2 Konjunktionen. Um nun mit dem Universalrelation-System auch Anfragen mit disjunktiven Bedingungen zu verarbeiten, werden diese nach dem obigen Prinzip in mehrere Teilanfragen von Konjunktionen zerlegt und diese dann mit den bisher bekannten Methoden abgearbeitet: Der Bedingungsteil (die WHERE -Klausel) der von Benutzer angegebenen Anfrage wird durch Ausklammern und Ausmultiplizieren in eine disjunkte Form gebracht, anschließend wird diese Anfrage in eine äquivalente Form von Teilanfragen zerlegt, welche durch den Mengenoperator UNION vereinigt werden: Die Anfrage SELECT <Select-Liste> WHERE <bedingungen> wird umgeformt zu der Anfrage SELECT <Select-Liste> WHERE <DISJ_1> OR <DISJ_2> ... OR <DISJ_n> und schließlich zu SELECT <Select-Attribut-Liste> WHERE <DISJ_1> UNION SELECT <Select-Attribut-Liste> WHERE <DISJ_2> ... UNION SELECT <Select-Attribut-Liste> WHERE <DISJ_n> Diese Anfrage wird wie gewohnt bearbeitet. 2.2.7 Beispiele Anhand einiger ausgewählter Beispiel-Anfragen soll die Arbeitsweise des Universalrelation-Systems verdeutlicht werden. Gesucht seien alle ISBN-Nummern im Bibliotheks-Datenbankschema. 37 Die zugehörige Universalrelation-Anfrage wäre: SELECT ISBN; Diese Anfrage würde vom Universalrelation-System folgendermaßen umgesetzt: Es handelt sich offenbar um eine Anfrage ohne ODER-Bedingungen, Megenoperanden, Unteranfragen oder Datenbank-Variablen. Daher werden nur die Methoden des Universalrelation-Kernes benötigt. Zuerst werden die Anfrageattributmenge“ X , die Select-Liste“ und die Select” ” ” Attribut-Liste“ bestimmt. Diese sind in diesem Falle gleich X : X = {ISBN}. Der Anfragehypergraph ergibt sich zu: AHG X = { ISBN } Buch,wirdv erlegt,Autor,Exemplar Damit wird also für jede Kante des Anfragehypergraphen (in diesem Fall nur eine) eine Sicht erzeugt: CREATE VIEW KANTE_0 AS SELECT ISBN FROM Buch UNION SELECT ISBN FROM wird_verlegt UNION SELECT ISBN FROM Autor UNION SELECT ISBN FROM Exemplar; Das Fenster“ und die Sicht mit den Ergebnistupeln werden erzeugt und die ” Anfrage gestellt: CREATE VIEW AHG_1 AS SELECT UNION_1_0.ISBN ISBN FROM KANTE_0; CREATE VIEW UR_WINDOW AS SELECT DISTINCT "ISBN" FROM AHG_1; SELECT "ISBN" FROM UR_WINDOW; Abschließend werden alle zwischenzeitlich erzeugten Sichten gelöscht: DROP VIEW UR_WINDOW; DROP VIEW AHG_1; DROP VIEW KANTE_0; Betrachten wir nun ein komplexeres Beispiel: Gesucht sind alle Filme, wobei der Regisseur nicht der Hauptdarsteller sein darf oder der Film einen Nachfolger besitzt. Die Anfrage an das Universalrelation-Systems lautet dann: SELECT A.MovieTitle WHERE A.Directorname NOT IN ( SELECT B.PlayerName WHERE B.Pos = 1 38 AND B.MovieID = A.MovieID ) OR A.SuccessorID IS NOT NULL; Die Bearbeitung dieser Anfrage läuft wie folgt: Der erste Schritt ist das Umformen der Bedingung in disjunktive Form (ist in diesem Fall gleich der gegebenen Form). Anschließend wird die Anfrage in eine Vereinigung von Teil-Anfragen umgeformt: SELECT A.MovieTitle WHERE A.Directorname NOT IN ( SELECT B.PlayerName WHERE B.Pos = 1 AND B.MovieID = A.MovieID ) UNION SELECT A.MovieTitle WHERE A.SuccessorID IS NOT NULL; Die so entstandene Anfrage wird nach dem Verfahren für Mengenoperationen weiter bearbeitet. Es ergeben sich die beiden Teilanfragen SET_0 := SELECT A.MovieTitle WHERE A.Directorname NOT IN ( SELECT B.PlayerName WHERE B.Pos = 1 AND B.MovieID = A.MovieID ) SET_1 := SELECT A.MovieTitle WHERE A.SuccessorID IS NOT NULL; Eine weitere Analyse ergibt folgende Struktur: auessere_Anfrage ( innere_anfrage ) UNION Teilanfrage wobei gilt: auessere_Anfrage := SELECT A.MovieTitle WHERE A.Directorname NOT IN ( ... ) innere_anfrage := SELECT B.PlayerName WHERE B.Pos = 1 AND B.MovieID = A.MovieID Teilanfrage := SELECT A.MovieTitle 39 WHERE A.SuccessorID IS NOT NULL; Diese werden der Reihe nach abgearbeitet, wobei mit der letzten zuerst angefangen wird. In der Teilanfrage SET 0 ist eine Unteranfrage. Für diese wird nach dem Verfahren für geschachtelte Anfragen die Definition der Unteranfrage“ bestimmt: ” SUBQUERY_1[A.MovieID] := SELECT DISTINCT "B.PlayerName" FROM SUBQUERY_1_AHG_1 WHERE "B.Pos" = 1 AND "B.MovieID" = "A.MovieID" Analog wird für jeden rechten Operanden“ einer Mengenoperation (in diesem ” Fall nur einer) die Definition der Teilanfrage“ bestimmt: ” SET_1 := SELECT DISTINCT "A.MovieTitle" FROM SET_1_AHG_1 WHERE "A.SuccessorID" IS NOT NULL; Die einzelnen Kommandos lauten nun: • Die Kanten für den Anfragehypergraph der letzten Teilanfrage: CREATE VIEW SET_1_KANTE_A_0 AS SELECT MovieID, SuccessorID FROM follows; CREATE VIEW SET_1_KANTE_A_1 AS SELECT MovieID, MovieTitle FROM Movie; • Das Fenster“ für die letzte Teilanfrage:: ” CREATE VIEW SET_1_AHG_1 AS SELECT SET_1_KANTE_A_0.SuccessorID "A.SuccessorID", SET_1_KANTE_A_1.MovieTitle "A.MovieTitle" FROM SET_1_KANTE_A_0, SET_1_KANTE_A_1 WHERE SET_1_KANTE_A_0.MovieID = SET_1_KANTE_A_1.MovieID; Die Definition der Teilanfrage“: ” SELECT DISTINCT "A.MovieTitle" FROM SET_1_AHG_1 WHERE "A.SuccessorID" IS NOT NULL; • Die Kanten für den Anfragehypergraph der inneren Anfrage: CREATE VIEW SUBQUERY_1_KANTE_B_0 AS SELECT PlayerID, PlayerName FROM Player; CREATE VIEW SUBQUERY_1_KANTE_B_1 AS SELECT MovieID, PlayerID, Pos FROM plays; • Das Fenster“ für die innere Anfrage: ” 40 CREATE VIEW SUBQUERY_1_AHG_1 AS SELECT SUBQUERY_1_KANTE_B_1.Pos "B.Pos", SUBQUERY_1_KANTE_B_1.MovieID "B.MovieID", SUBQUERY_1_KANTE_B_0.PlayerName "B.PlayerName" FROM SUBQUERY_1_KANTE_B_0, SUBQUERY_1_KANTE_B_1 WHERE SUBQUERY_1_KANTE_B_0.PlayerID = SUBQUERY_1_KANTE_B_1.PlayerID • Die Kanten für den Anfragehypergraph der äußeren Anfrage: CREATE VIEW KANTE_A_0 AS SELECT DirectorID, DirectorName FROM Director; CREATE VIEW KANTE_A_1 AS SELECT MovieID, DirectorID FROM Directs; CREATE VIEW KANTE_A_2 AS SELECT MovieID, MovieTitle FROM Movie; • Das Fenster“ für die äußere Anfrage: ” CREATE VIEW AHG_1 AS SELECT KANTE_A_0.DirectorName "A.DirectorName", KANTE_A_1.MovieID "A.MovieID", KANTE_A_2.MovieTitle "A.MovieTitle" FROM KANTE_A_0, KANTE_A_1, KANTE_A_2 WHERE KANTE_A_0.DirectorID = KANTE_A_1.DirectorID AND KANTE_A_1.MovieID = KANTE_A_2.MovieID; • Die Sicht der Ergebnistupel im ersten Schritt: CREATE VIEW UR_WINDOW AS SELECT DISTINCT "A.MovieTitle" FROM AHG_1 WHERE "A.DirectorName" NOT IN ( SUBQUERY_1[A.MOVIEID] ) UNION SET_1; • Die Sicht der Ergebnistupel nach dem Einsetzen der Definitionen von Unter- und Teilanfragen: CREATE VIEW UR_WINDOW AS SELECT DISTINCT "A.MovieTitle" FROM AHG_1 WHERE "A.DirectorName" NOT IN ( SELECT DISTINCT "B.PlayerName" FROM SUBQUERY_1_AHG_1 WHERE "B.Pos" = 1 AND "B.MovieID" = "A.MovieID" ) UNION SELECT DISTINCT "A.MovieTitle" FROM SET_1_AHG_1 WHERE "A.SuccessorID" IS NOT NULL; • Die Anfrage und abschließendes Aufräumen: SELECT "A.MovieTitle" FROM UR_WINDOW; DROP VIEW UR_WINDOW; DROP VIEW AHG_1; DROP VIEW KANTE_A_0; 41 DROP DROP DROP DROP DROP DROP DROP DROP VIEW VIEW VIEW VIEW VIEW VIEW VIEW VIEW KANTE_A_1; KANTE_A_2; SET_1_AHG_1; SET_1_KANTE_A_0; SET_1_KANTE_A_1; SUBQUERY_1_AHG_1; SUBQUERY_1_KANTE_B_0; SUBQUERY_1_KANTE_B_1; 42 3 3.1 Literaturübersicht zum Thema Universalre” lation-Systeme“ Vorläufer Bereits 1976 haben Carlson und Kaplan in [CK76] ein Verfahren zur automatischen Erzeugung eines Zugriffsplanes für Datenbankanfragen vorgestellt. Sie erkannten das Problem der semantischen Mehrdeutigkeit, das bei dem Vorhandensein mehrerer Zugriffspläne auftritt, und versuchten dieses zu lösen, indem dem System Hinweise gegeben wurde, welche Relationen semantisch zueinan” der“ gehören. 3.2 Theorie Anfang der achtziger Jahre des letzten Jahrhunderts entwickelte sich eine rege Diskussion um das Universalrelation-Modell. Während unter anderem Kent das Modell einer universellen Relation“ in [Ken81] wegen Realitätsferne in Frage ” stellte, bemühte sich Ullman in [Ull82c] um Klärung und Zusammenfassung. Er stellte mehrere von verschiedenen Autoren entwickelte Modelle vor und bemühte sich, von Gegnern dieses Modells aufgeworfene Einwände zu zerschlagen. Ein Ansatz zur Entwicklung des Universalrelation-Modells war der von Maier und Ullman in [MU81] entwickelte Ansatz der maximalen Objekte“. Dieser An” satz geht von von der Annahme der Join Dependency“ aus, sieht also die Uni” versalrelation als eine Sicht, entstanden aus dem natürlichen Verbund aller Relationen. Die Probleme, die durch γ-zyklische Datenbankschemas und hängende ” Tupel“ entstehen, versuchen sie durch Zerlegung der Anfrage auf maximale ” Objekte“ (das sind γ-azyklische Teilanfragehypergraphen) und der Vereinigung dieser Teilergebnisse zu umgehen. Eine strengere Fassung des Ansatzes, die Einschränkung der Join Dependency“ auf γ-azyklische Schemas, beschreiben beide ” Autoren in [MU82]. Ullman beschreibt in [Ull82a] und [Ull82b] die Implementierung von System/U“, einer Universalrelation-Benutzerschnittstelle. In weiteren ” Arbeiten ([MUV82], [Ull83] ) fassen Ullman, Maier und Vardi den Stand der Forschung zusammen. Malvestuto und Moscarini stellen in [MM98] eine Optimierung der vom Maier und Ullman entwickelten Methode zur Verbundbestimmung vor. McCure Kuck und Sagiv beschreiben in [MKS82] die Implementierung eines Datenbanksystems mit Universalrelation-Schnittstelle über einem NetzwerkDatenbanksystem. Wie auch schon Maier und Ullman in [MU81], beschäftigte sich Laue in [Lau82] mit dem Problem der hängenden Tupel“, also Tupeln, die nicht auf ” allen Attributen in allen Relationen definiert sind. Laue erlaubt in seinem Universalrelation-Modell Nullwerte nur auf den Attributen, die keine Schlüssel sind, und definiert die Universalrelation als den Outer-Join über alle Relationen und der zusätzlichen Bedingung, daß nur die Tupel enthalten sind, die auf den Schlüssel-Attributen nicht Null sind. 43 In [BB83] stellen Brüggemann einen pragmatischen Zugang“ zum Konzept der ” Universalrelation vor. Ausgehend von den Erfahrungen zweier Benutzergruppen, den sporadischen“ (diese kennen nur die Attribute eines Datenbankschemas) ” und den fortgeschrittenen“ Benutzern (diese kennen die Struktur des Daten” bankschemas und benutzen das Universalrelation-System, um sich die Arbeit der Verbundoperationen abnehmen zu lassen) entwickeln sie ein UniversalrelationModell, das auf der Vereinigung von teilweisen Verbunden der beteiligten Relationen basiert. zusammen mit Schnetgöke und Kramer führen sie in [BBSK86] neben den Annahmen Universal Relation Scheme Assumption“ (URSA: die Be” deutung der Attribute wird vollständig durch den Attributnamen ausgedrückt) und Basic Connection Assumption“ ( BCA: Für alle Attributmengen X gibt ” es genau eine elementare Beziehung zwischen den Attributen aus X) eine dritte Annahme, die One Flavor Assumption“ (OFA: Die Bedeutung eines Attributes ” in der Sicht auf die Universalrelation ist unabhängig von der Konstruktion dieser Sicht). Sie zeigen, daß γ-azyklische Datenbankschemas diese dritte Annahme erfüllen, und führen aus, daß die Berechnung der Sicht auf die Universalrelation nach dem in [MU82] angegebenen Verfahren der GYO-Reduktion bestimmt werden kann. Diese Ergebnisse lassen sie in das von ihnen entwickelte Universalrelation-System DURST einfließen. In [BB87] schließlich beschreiben sie für das Universalrelation-System DURST eine SQL-ähnliche und eine QBE-ähnliche Daten-Manipulations-Sprache. Brüggemann vergleicht in [Brü86] verschiedene Semantiken von Universalrelation-Systemen, die Verbundpfadsemantik, eine von der unique minimal connec” tion“ von Yannakakis abgeleitete und die von der modifizierten GYO-Reduktion abgeleitete Semantik. Er zeigt, daß diese Semantiken nur für γ-azyklische Datenbankschemas die gleichen Ergebnisse liefert, und fordert daher die γ-Azyklizität als notwendige Eigenschaft eines Datenbankschemas. Er führt als neue Bedingung die Intersection Database Scheme Assumption“ (IDSA: ) ein, welche die ” URSA und BCA ersetzt. Eine allgemeine Einführung in Universalrelation-Systeme gibt Vardi in [Var88]. Neben der Theorie stellt er eine einige Universalrelation-Systeme beispielhaft vor. E. F. Codd, der Vater“ des relationalen Modells, reiht sich mit seiner Ant” wort auf diesen Artikel ([Cod88]) in die Reihe der Kritiker des Universalrelation-Modells ein (vgl. auch [Ken81]). 3.3 Weiterführungen und Anwendungen In [AP87] stellen Azar und Pichat einen Algorithmus zur Transformation eines erweiterten Entity-Relationship-Modells in das Universalrelation-Modell mit ” Einschlüssen“ vor. Dies ist eine Erweiterung des Universalrelation-Modells um die Inclusion Dependency“, welche verlangt, daß für zwei Mengen von Attribu” ten K und L und jedes Tupel t aus der Datenbank es ein Tupel t0 gibt, so daß t[K] = t0 [L] gilt. Levene und Loizou und später Levene allein entwickelten in [LL88], [Lev92] und [LL94]für das Modell der geschachtelten Relationen“ eine Universalrelation” Erweiterung, das nested UR model . Neben einer gründlichen Entwicklung dieses Modells stellen sie in [LL89] eine an SQL angelehnte Anfragesprache vor. 44 Laurent, Luong und Spyratos in [LLS97] sowie auch Torlone und Atzeni in [TA99] beschäftigen sich mit der Frage, wie Update- und Löschoperationen in einem Universalrelation-System auf deterministische Weise ablaufen können. Vermehrt findet das Universalrelation-Modell Verwendung als Benutzerschnittstelle für verteilte bzw. heterogene Datenbankmanagementsysteme oder Informationsquellen ([HL91] [ZSC95] [SW95] [RH96] [Rec97] [LW00] [KLSZ01] ). 45 4 Die Überarbeitung des bisherigen Universalrelation-Systems Die Überarbeitung gliedert sich in drei Bereiche, wobei zwei davon der Vereinfachung des Programmes dienen, und der dritte direkt eine Verallgemeinerung des Verfahrens umsetzt. Die drei Bereiche sind: 1. Das Universalrelation-Schema wird nicht nur über Basisrelationen, sondern kann - bei Bedarf - auch über Sichten definiert werden. 2. Die Universalrelation-System-Schnittstelle wird als Java-Applet zur Verfügung gestellt, um sie internetfähig zu machen. 3. Die Bearbeitung von Disjunktionen (OR) und von Vereinigungen (UNION ) wird vereinheitlicht. 4.1 Erweiterung auf Sichten Wie in [Bor01] beschrieben, muß dem Universalrelation-System die Struktur des Datenbank-Schemas mitgeteilt werden. Der bisherige Weg war der, eine SQL-Kommando-Datei, welche alle CREATE TABLE -Befehle der beteiligten Relationen enthält, vom System parsen zu lassen. Das System war bisher nur in der Lage, SQL-Kommandos zur Erzeugung von Relationen korrekt zu parsen. Es ist allerdings wünschenswert, wenn das System auch mit Sichten umgehen kann, und der im Abschnitt 4.2 in [Bor01] beschriebene Workaround“ erscheint ” nicht praktikabel genug. Daher wird nach einer Lösung gesucht, die auch die Struktur von Sichten korrekt erkennt. Es werden nun zwei verschiedene Möglichkeiten diskutiert, wie diese Lösung aussehen könnte: 1. Wie bisher die SQL-Kommandodatei parsen und die Prozedur erweitern um die Möglichkeit, View-Definitionen parsen zu können. 2. Einen neuen Weg gehen und die Definition einer Tabelle oder Sicht über JDBC-Metadaten-Befehle erlangen. Der Vorteil der ersten Methode ist, daß das Konzept und damit die Programmstruktur gleich bleibt, und nur die Parser-Methode um die Behandlung von CREATE VIEW -Kommandos erweitert werden muß. Der Datentyp eines Attributes ergibt sich allerdings nicht mehr explizit, sondern muß aus dem EXPR des SUBQUERYs in der Sicht-Definition bestimmt werden. Die ist i. A. nicht trivial, wie folgendes Beispiel zeigt: SQL> create table t (t1 varchar2(10), t2 number(12, 5)); Table created. SQL> create view v1 as select t1 || t1 v1 from t; 46 View created. SQL> create view v2 as select t1 || ’10 laenger’ v2 from t; View created. SQL> create view v3 as select t1 || t2 v3 from t; View created. SQL> desc t; Name Null? Type ---------------------------- -------- ----------------------T1 VARCHAR2(10) SQL> desc v1 Name Null? Type ---------------------------- -------- ----------------------V1 VARCHAR2(20) SQL> desc v2; Name Null? Type ---------------------------- -------- ----------------------V2 VARCHAR2(20) SQL> desc v3; Name Null? Type ---------------------------- -------- ----------------------V3 VARCHAR2(50) Der Datentyp des Attributes V1 ergibt sich aus der Summe der Länge der Datentypen von T1 und T1 . Der Datentyp des Attributes V2 ergibt sich aus der Länge von T1 und der Länge der Zeichenkettenkonstanten ’10 laenger’. Während der Datentyp des Attributes V1 noch relativ leicht zu ermitteln ist, wenn man den Datentyp des Attributes T1 kennt, so ist dies beim Datentyp des Attributes V2 schon komplizierter (hier muß beim Parsen die Länge der Konstanten ermittelt werden), und beim Datentyp des Attributes V3 reicht dieses Vorgehen nicht aus - man benötigt Kenntnisse über das interne Vorgehen es DBMS, um zu verstehen, wie der Datentyp von V3 die Länge 50 bekommt, und nicht, wie vielleicht erwartet, die Länge 23 (10 von T1 , 12 von T2 und 1 vom Dezimalpunkt). Dies betrachte ich als einen großen Nachteil dieser Methode, da hier einerseits die Fehleranfälligkeit hoch ist, und es andererseits kompliziert ist, alle internen Besonderheiten heraus zu finden, die hier auftreten können. Die zweite vorgeschlagene Methode, die Erkennung der Schema-Struktur über JDBC-Metadaten, erfordert zunächst eine Änderung der Programmstruktur. 47 Allerdings wird der Nachteil der ersten Methode umgangen, da Sichten und Relationen gleich behandelt werden. Desweiteren kann auch das Konzept der Synonyme mit behandelt werden. Dies wiegt in meinen Augen den Nachteil der Neustrukturierung des Programmes auf. Ein weiterer Nachteil allerdings kann nicht umgangen werden: Enthält eine Relation (oder Sicht oder Synonym) ein Attribut des Datentyps MLSLABEL, so arbeitet die JDBC-Schnittstelle dies nicht korrekt ab (es wird mit der Fehlermeldung ORA-00932: inconsistent datatypes abgebrochen). Dies ist aber keine schwerwiegende Einschränkung in meinen Augen, da laut der Oracle-SQL-Dokumentation ([Ora97]) dieser Datentyp nur aus Abwärtskompatibilität zu alten Versionen mit Trusted Oracle unterstützt wird, also ein sehr spezieller Fall ist. Desweiteren wurde dieser Datentyp bisher auch nicht unterstützt, da alle SQL-Befehle über die JDBC-Schnittstelle laufen. Insgesamt bietet die zweite Methode einen unkomplizierteren Ansatz, um die Schema-Informationen einzulesen (auch für den Benutzer dieses Systems - er muß dem System nur noch die Namen der benötigten Relationen und Sichten mitteilen), so daß bei der Überarbeitung des Programms diese Methode benutzt wird. Die genaue Arbeitsweise soll nun erläutert werden: Wie bei der Arbeit mit der JDBC-Schnittstelle gewohnt (vgl. Abschnitt 5.3 in [Bor01]), wird zunächst eine Verbindung zum Datenbankserver eröffnet. Dann wird für jede Relation oder Sicht, deren Struktur gewünscht ist, an den Server eine Anfrage gestellt, die alle Attribute der gewünschten Relation oder Sicht einschließt - in der Regel ist das die Anfrage SELECT * FROM <table_name>; Dadurch wird eine Instanz der Klasse java.sql.ResultSet erzeugt, von der man mit der Methode getResultSetMetaData() eine Instanz der Klasse java.sql.ResultSetMetaData erhält. Mit den Methoden dieser Klasse lassen sich nun Name und Typ aller im Ergebnis vorkommenden Attribute ermitteln - das sind in diesem Fall alle Attribute der Relation oder Sicht: ResultSet rs ResultSetMetaData rsmd = stmt.executeQuery(query); = rs.getMetaData(); // Die Anzahl der Attribute: int colnum = rsmd.getColumnCount(); for (int i = 1; i <= colnum; i++) { // Der Name des Attributes: String name = rsmd.getColumnName(i); // Der Datentyp des Attributes: String type = rsmd.getColumnTypeName(i); // Details des Datentyps: int length = rsmd.getColumnDisplaySize(i); int precision = rsmd.getPrecision(i); int scale = rsmd.getScale(i); } 48 4.2 Umwandlung der Applikation in ein Applet Der grundlegende Unterschied zwischen Applets und Applikationen ist, daß Applets in einer Browser-Umgebung laufen, und prinzipiell dafür gedacht sind, über das Internet ausgetauscht zu werden. Um dem mißbräuchlichen Gebrauch solcher Applets zu verhindern, unterliegen Applets gegenüber Applikationen zwei wesentlichen Restriktionen: • Sie dürfen keine Dateien auf dem System lesen und schreiben, auf dem sie laufen, • Sie dürfen keine Netzwerkverbindungen zu anderen Servern aufbauen, außer zu dem Server, von dem sie geladen wurden. Es soll nun kurz erläutert werden, inwiefern diese Restriktionen das Programm betreffen, und wie diese Restriktionen sinnvoll umgangen werden können. 4.2.1 Einschränkungen eines Applets Die Möglichkeit, Dateien lesen und schreiben zu können wurde bisher verwendet, um Programmeinstellungen zu speichern und DatenbankBeschreibungen zu lesen. Dies wird im Applet umgangen, indem Einstellungen nicht gespeichert werden, bzw. über die aufzurufende HTML-Seite übergeben werden. Die Datenbank-Beschreibungen werden auf dem Web-Server abgelegt was allerdings die Wartung für Benutzer kompliziert macht - oder die Beschreibungen könnten auf einem beliebigen dem Benutzer zugänglichen Webspace abgelegt werden, und von dort aus eingelesen werden (da angeblich Dateien in Form von URLs (URL: Uniform Resource Locator) gelesen werden können). Auf die Feinheiten der HTML-Programmierung soll an dieser Stelle nicht eingegangen werden, und wir gehen davon aus, daß alle für das Applet notwendigen Parameter über die aufrufende HTML-Seite übergeben werden. Die Möglichkeit, Netzwerkverbindungen herstellen zu können wurde bisher verwendet, um mit dem DBMS zu kommunizieren, ist also ein zentraler Bestandteil der Applikation. Im Applet ist diese Kommunikation nur noch möglich, falls das DBMS auf demselben Rechner wie der Web-Server läuft. Da dies in den seltensten Fällen der Fall sein wird, ist dies eine ernstzunehmende Einschränkung. Diese ist im Applet nicht einfach zu umgehen. Eine Möglichkeit wäre die Programmierung einer Client-Server-Anwendung, wobei der Client das Applet ist, und der Server eine Applikation. Diese muß dann auf dem Webserver laufen, und kommuniziert mit dem Datenbank-Server, und liefert die entsprechenden Daten an das Applet weiter. Dieser Ansatz ist allerdings nicht optimal, da er letztendlich nicht wirklich aus der bisherigen Applikation ein Applet macht. Wir werden diesen Ansatz hier nicht weiter verfolgen, sondern gehen davon aus, daß das Applet mit dem DBMS kommunizieren kann (also auf demselben Rechner liegt). 49 <HTML> <HEAD></HEAD> <BODY> <APPLET code="UrApplet" archive="./ur.jar" codebase="." > <PARAM name=dburl value="jdbc:oracle:thin:@db.server.com:1521:instance"> <PARAM name=driver value="oracle.jdbc.driver.OracleDriver"> <PARAM name=file value="files/bib.txt"> <PARAM name=user value="bib"> <PARAM name=pass value="bibpw"> <PARAM name=anf value="Select Autorenname, Titel"> </APPLET> </BODY> </HTML> Tabelle 6: HTML-Seite zum Aufruf des Universalrelation-System-Applets 4.2.2 Änderungen am Programm Neben den bei einer Umwandlung einer Applikation in ein Applet üblichen Änderungen (Die Hauptklasse statt von java.lang.Object nun von java.applet.Applet ableiten, statt der Methode main{String[] argv} nun die Methoden init() und start() definieren, usw.) wurden aufgrund der im vorigen Abschnitt erläuterten Einschränkungen folgendes geändert: Datenbank-Beschreibungen können nicht mehr über eine Datei vom Benutzer ausgewählt und eingelesen werden. Stattdessen wird dem Applet beim Start ein URL übergeben, der auf die Datei mit der Beschreibung verweist. Dies führt dazu, daß ein anderes Datenbankschema nur durch Neustart des Applets ausgewählt werden kann. Intern arbeitet die Klasse dbis.appl.liste.MetaDaten nun nicht mehr mit einem java.io.File -Object als Datenquelle, sondern mit einem java.io.InputStream-Object. Programm-Optionen werden nicht mehr nach Beenden des Programms abgespeichert, sondern werden dem Applet beim Start übergeben. Allerdings können diese im laufenden Betrieb noch geändert werden. Der Aufruf des Applets erfolgt über eine HTML-Seite mit dem APPLET -Tag. Diese Seite muß mindestens die in Tabelle 6 aufgeführten Angaben erhalten: Die Parameter dburl , driver und file sind zwingend, die restlichen Parameter können weggelassen werden. Die Bedeutung der Parameter ist folgende: 50 Name dburl driver file user pass anf 4.3 Beispiel-Wert Beschreibung jdbc:oracle:thin:@db.server.com:1521:orcl Der JDBC-Connect-String oracle.jdbc.driver.OracleDriver Der Bezeichner für die JDBCTreiber-Klasse files/bib.txt enthält einen URL (absolut oder relativ), der auf die Datenbank-BeschreibungsDatei verweist. bib Der Benutzername für die Datenbank bibpw Das Passwort des DatenbankBenutzers Select Autorenname, Titel Die Anfrage, die voreingestellt im Anfrage-Fenster des Applets erscheint Vereinheitlichung von Disjunktionen und Vereinigungen Die in [Bor01] beschriebenen Verfahren für die Behandlung von Anfragen mit ODER-Bedingungen oder mit Mengen-Operationen lauten in Kurzform: • ODER-Bedingungen: – Anfrage: SELECT <Select-Liste> WHERE <bedingung1> OR <bedingung2>; – Verfahren: ∗ Umformen der Anfrage in Teilanfragen: SELECT <Attribut-Liste> WHERE <bedingung1> UNION SELECT <Attribut-Liste> WHERE <bedingung2>; ∗ Jede Teilanfrage einzeln bearbeiten ∗ Die Teilanfragen vereinigen und die Anfrage stellen: CREATE VIEW UR_WINDOW AS SELECT <Attribut-Liste> FROM VIEW_1 WHERE <bedingung1> UNION SELECT <Attribut-Liste> FROM VIEW_2 WHERE <bedingung2>; SELECT <Select-Liste> FROM UR_WINDOW; • Mengen-Operation: – Anfrage: 51 SELECT <Select-Liste1> <Set-Op> SELECT <Select-Liste2>; – Verfahren: ∗ Jede Teilanfrage einzeln bearbeiten ∗ Die Teilanfragen vereinigen und die Anfrage stellen: CREATE VIEW UR_WINDOW AS SELECT <Attribut-Liste1> FROM VIEW_1 <Set-Op> SELECT <Attribute-Liste2> FROM SET_1_VIEW_1; SELECT <Select-Liste1> FROM UR_WINDOW; Wenn nun im zweiten Fall der Mengenoperand Set-Op“ ein UNION ist, so ” fällt auf, daß beide Verfahren sich stark ähneln - im Prinzip laufen sie nach der Umformung der Anfrage mit ODER-Bedingungen analog. Hinzu kommt, daß die Sicht UR WINDOW nur für ODER-Bedingungen wirklich nötig ist (in den anderen Fällen wird sie nur aus Transparenzgründen und der Übersicht halber mit erzeugt). Diese beiden Punkte lassen die Frage aufkommen, in wie weit diese beiden Verfahren zu einem einzigen Verfahren zusammengefaßt werden können. Beispiel: Anfrage ::= SELECT sum(Auflage) WHERE Autorenname = ’Knuth’ OR Verlagsname = ’Addison-Wesley’; Anfrage_1 ::= SELECT Auflage WHERE Autorenname = ’Knuth’; Anfrage_2 ::= SELECT Auflage WHERE Verlagsname = ’Addison-Wesley’; ... CREATE VIEW VIEW_1 AS SELECT Auflage, Autorenname FROM UNION_1_0, UNION_1_1 WHERE UNION_1_0.ISBN = UNION_1_1.ISBN; CREATE VIEW VIEW_2 AS SELECT Auflage, Verlagsname FROM UNION_2_0, UNION_2_1, UNION_2_2 WHERE UNION_2_0.ISBN = UNION_2_1.ISBN AND UNION_2_1.ISBN_CODE = UNION_2_2.ISBN_CODE; 52 CREATE VIEW UR_WINDOW SELECT Auflage FROM WHERE Autorenname UNION SELECT Auflage FROM WHERE Verlagsname AS VIEW_1 = ’Knuth’ VIEW_2 = ’Addison-Wesley’; SELECT sum(Auflage) FROM UR_WINDOW; oder als UNION“-Fall: ” Anfrage_3 ::= SELECT Auflage where Autorenname = ’Knuth’ UNION SELECT Auflage WHERE Verlagsname = ’Addison-Wesley’; ... CREATE VIEW VIEW_1 AS SELECT Auflage, Autorenname FROM UNION_1_0, UNION_1_1 WHERE UNION_1_0.ISBN = UNION_1_1.ISBN CREATE VIEW SET_1_VIEW_1 AS SELECT Auflage, Verlagsname FROM SET_1_UNION_1_0, SET_1_UNION_1_1, SET_1_UNION_1_2 WHERE SET_1_UNION_1_0.ISBN = SET_1_UNION_1_1.ISBN AND SET_1_UNION_1_1.ISBN_CODE = SET_1_UNION_1_2.ISBN_CODE; CREATE VIEW UR_WINDOW SELECT Auflage FROM WHERE Autorenname UNION SELECT Auflage FROM WHERE Verlagsname AS VIEW_1 = ’Knuth’ SET_1_VIEW_1 = ’Addison-Wesley’; SELECT Auflage FROM UR_WINDOW; Man sieht an diesem Beispiel, daß der Ablauf bis auf Kleinigkeiten (SET 1 VIEW 1 statt VIEW 2 etc.) und die SELECT -Anfrage identisch ist. Die Idee ist nun, eine Anfrage mit ODER-Bedingungen durch Umwandlung in disjunktive Form und dann in eine Anfrage mit UNION-Operatoren genauso wie eine solche zu behandeln, und nur bei der letztlichen SELECT-Anfrage die Select-Liste der ursprünglichen Anfrage zu verwenden. Man beachte, daß dies nur funktionieren kann, solange in der Anfrage mit ODER-Bedingungen in der Select-Liste keine Aggregatfunktionen vorkommen, wie folgendes Gegenbeispiel zeigt: Gegeben sei vom Benutzer die Anfrage SELECT count(pos) WHERE pos < 2 OR pos > 3; 53 Diese Anfrage nach Zerlegung in disjunktive Form sähe dann folgendermaßen aus SELECT count(pos) FROM Autor WHERE pos < 2 UNION SELECT count(pos) FROM Autor WHERE pos > 3 und sollte einen Wert zurückliefern, aber nach dem bisherigen Verfahren erhält man für jeden Term der Mengenoperation einen Wert. Aus diesem Grunde wird verlangt, das Vorkommen von Aggregatfunktionen in der Anfragesprache auszuschließen. Damit ergibt sich folgender Ablauf der Anfrage: • Wandle in jeder (Teil-)Anfrage mit ODER-Bedingungen die Bedingung in disjunktive Form um. • Wandle die (Teil-)Anfrage von der disjunkten Form in eine Anfrage mit UNION -Operatoren um. • Bearbeite jede (Teil-)Anfrage wie gewohnt ab. 54 5 Optimierungsuntersuchungen 5.1 5.1.1 Ersetzen der Sicht-Definitionen Mehrfach vorkommende Hypergraph-Kanten Beim Bearbeiten komplexerer Anfragen, insbesondere Anfragen mit ODERBedingungen fällt auf, daß manche Attribute in mehreren Teilen der Anfrage vorkommen. Bei Anfragen mit ODER-Bedingungen sind dies auf jeden Fall alle Select-Attribute, da diese bei allen für jeden Disjunkt der Anfrage-Bedingung erzeugten Teilanfragen gleich sind. Dies führt dazu, daß dann auch in den verschiedenen Anfrage-Hypergraphen dieser Teilanfragen einige Kanten (teilweise) gleich sind in dem Sinne, daß Kantei im einem Anfragehypergraphen eine Untermenge der Attribute derselben Relation der Kantej eines anderen Anfragehypergraphen enthält: Beispiel: Kante_1: SELECT ISBN, TITEL FROM BUCH Kante_2: SELECT ISBN, TITEL, ERSCHEINUNGSJAHR, AUFLAGE FROM BUCH Folgende Kanten sind nicht gleich: Kante_3: SELECT ISBN FROM BUCH UNION SELECT ISBN FROM WIRD_VERLEGT UNION SELECT ISBN FROM AUTOR UNION SELECT ISBN FROM EXEMPLAR Kante_4: SELECT ISBN, TITEL FROM BUCH Ein erster Optimierungsansatz besteht hier darin, solche doppelt vorkommen” den“ Kanten nur einmal zu erzeugen, und in den anderen Teilanfragen auf die schon erzeugte Kante zu verweisen. Der Gewinn aus dieser Maßnahme besteht darin, daß nun weniger Sichten erzeugt werden müssen. Demgegenüber steht ein erhöhter Aufwand bei der Erzeugung der Sichtdefinitionen, da nun bei jeder Kante zuerst geprüft werden muß, ob sie bereits zu einer bisher erzeugten Kante im oben beschriebenen Sinne gleich ist. Desweiteren geht die hier beschriebene Maßnahme in der folgenden auf, so daß auf eine weitere Untersuchung dieses Ansatzes verzichtet wird. 5.1.2 Verzicht auf Sichten-Erzeugung Sichten sind, gespeicherte Anfragen“ in dem Sinne, daß die Anfrage an eine ” Sicht SELECT <Attribut-Liste> FROM <view_name> [WHERE <cond> ...]; mit der Definition der Sicht CREATE VIEW <view_name> AS <Sicht_Definition> 55 äquivalent ist zu der Anfrage SELECT <Attribut-Liste> FROM ( <Sicht_Definition> ) [WHERE <cond> ...]; , also zu der Anfrage, in der die Sicht durch ihre Definition ersetzt wurde. Daraus folgt insbesondere, daß man in Anfragen stets die Verwendung einer Sicht vermeiden kann, indem eine äquivalente Unteranfrage in der FROM Klausel benutzt wird. Untersucht wird nun die Frage, inwiefern die Tatsache, das bisher im Verfahren explizit mit Sichten anstatt nur mit deren Definition gearbeitet wird, einen Einfluß auf den Verarbeitungsaufwand einer Universalrelation-System-Anfrage hat. Dazu wird untersucht, wie sehr das Oracle-DBMS mit den einzelnen Teilen dieses Verfahrens 1. Erzeugung der Sichten (CREATE VIEW ) 2. Stellen der Anfrage an die Sichten (SELECT FROM ) 3. Löschen der Sichten (DROP VIEW ) beschäftigt ist. Betrachten wir den ersten Teil, das Erzeugen der Sichten. Dies kann unter bestimmten Voraussetzungen einen beträchtlichen Zeitaufwand kosten, wie folgendes Beispiel zeigt: Betrachten wir folgende Befehle zur Erzeugung von Sichten: CREATE CREATE CREATE ... CREATE CREATE CREATE VIEW View_0 AS (SELECT isbn FROM autor); VIEW View_1 AS (SELECT isbn FROM View_0); VIEW View_2 AS (SELECT isbn FROM View_1); VIEW View_30 AS (SELECT isbn FROM View_29); VIEW View_31 AS (SELECT isbn FROM View_30); VIEW View_32 AS (SELECT isbn FROM View_31); Diese Befehlsfolge erzeugt eine künstliche“ Verschachtelung von Sichten, in der ” jede Sicht alle Attribute der vorangegangenen Sicht ohne Einschränkungen selektiert. Der Zugriffsplan einer Select-Operation auf die Sicht VIEW 32 sieht folgendermaßen aus: 56 Die Zeit, die zum Erzeugen dieser Sichten benötigt wird, wurde mit dem Sql*Plus-Befehl set timing on angezeigt, die Ergebnisse lauten wie folgt: Sicht Zeit / sec Sicht Zeit / sec Sicht Zeit / sec Sicht Zeit / sec Sicht Zeit / sec 0 0.03 7 0.01 14 0.05 21 0.33 28 37.71 1 2 3 4 0.01 0.03 0.01 0.01 8 9 10 11 0.03 0.01 0.05 0.01 15 16 17 18 0.03 0.03 0.05 0.06 22 23 24 25 0.63 1.23 2.38 4.76 29 30 31 75.55 151.55 301.80 5 6 0.03 0.01 12 13 0.03 0.03 19 20 0.10 0.20 26 27 9.50 18.88 32 603.88 Insbesondere bei der Betrachtung der Zeiten ab Sicht VIEW 16 (die Zeiten für die Sichten 0 bis 15 sind im Rahmen der Meßgenauigkeit zu unpräzise) fällt einem eine ständige Verdoppelung auf, der Zeitbedarf ist O(2n ). Der zweite Teil, das Stellen der Anfrage an die Sicht VIEW 32 , benötigt 1208.48 Sekunden. Nur das Löschen der Sichten nimmt einen normalen“ Zeitverbrauch in An” spruch: Es benötigt jeweils etwa 0.25 Sekunden pro Sicht, also insgesamt 8.25 Sekunden. Die gesamten Operationen zusammen (CREATE , SELECT , DROP) benötigten also CREATE SELECT DROP Σ + 1209.02 sec 1208.48 sec 8.25 sec 2425.75 sec insgesamt über 40 Minuten. Zum Vergleich wurde die gleiche Anfrage ohne Sichten, aber mit Unteranfragen gestellt: SELECT * FROM ( SELECT isbn FROM ( SELECT isbn FROM ... --View_32 --View_31 ( SELECT isbn FROM 57 --View_2 ( SELECT isbn FROM ( SELECT isbn FROM autor ) ) ) --View_1 --View_0 ... ) ); Für die Bearbeitung dieser Anfrage benötigte das System 0.43 Sekunden. Daß die Verarbeitung von verschachtelten Sichten nicht immer so viel Zeit beansprucht, zeigt das folgende Beispiel: create VIEW View_0 AS (SELECT isbn FROM autor); create VIEW View_1 AS (SELECT isbn FROM autor WHERE isbn in (SELECT isbn FROM View_0 ) ); create VIEW View_2 AS (SELECT isbn FROM buch WHERE isbn in (SELECT isbn FROM View_1 ) ); ... create VIEW View_31 AS (SELECT isbn FROM autor WHERE isbn in (SELECT isbn FROM View_30 ) ); create VIEW View_32 AS (SELECT isbn FROM buch WHERE isbn in (SELECT isbn FROM View_31 ) ); Mit dieser Befehlsfolge wird wiederum eine Verschachtelung erreicht, allerdings ist hier der Zugriffsplan einer Select-Operation auch verschachtelt, wie folgende Grafik des Zugriffsplanes für die Sicht View 6 zeigt: Das Erzeugen der Sichten geht hier in O(n) vor sich, pro Sicht werden etwa 0.1 Sekunden benötigt, also insgesamt etwa 3.3 Sekunden. Das Stellen der Anfrage an die Sicht View 32 benötigte etwa 765.18 Sekunden, das Löschen der Sichten pro Sicht etwa 0.25 Sekunden, also insgesamt 8.25 Sekunden. Dies ergibt als Gesamtsumme 58 CREATE SELECT DROP Σ + 3.30 sec 765.18 sec 8.25 sec 776.73 sec Betrachten wir im Vergleich dazu die äquivalente Anfrage mit Unteranfragen: SELECT isbn FROM (SELECT isbn FROM buch WHERE isbn in ( SELECT isbn FROM (SELECT isbn FROM autor WHERE isbn in ( SELECT isbn FROM (SELECT isbn FROM buch WHERE isbn in ... ( SELECT isbn FROM (SELECT isbn FROM autor WHERE isbn in ( SELECT isbn FROM (SELECT isbn FROM autor) ) ) ) ... ) ) ) ) ); -- View_32 -- View_31 -- View_30 -- View_1 -- View_0 Für diese Anfrage benötigte das Oracle-DBMS 772.16 Sekunden. 5.1.3 Fazit Im Abschluß ist festzustellen, daß die Verwendung einer Unteranfrage anstatt einer Sicht nicht mehr (manchmal sogar erheblich weniger) Zeit für eine SELECT Operation beanspruchen kann. Hinzu kommt noch die Zeit-Ersparnis, die durch das Wegfallen der CREATE - und DROP-Operationen gewonnen wird (insbesondere die CREATE -Operationen können manchmal teuer sein). Auf der praktischen Seite wird durch das Verwenden von Unteranfragen die TransaktionsVerarbeitung vereinfacht (statt einer Menge von 2k + 1, (k: Anzahl der Sichten) Anfragen wird nur noch eine Anfrage benötigt). Das hier vorgestellte Universalrelation-System erzeugt genau die Schachtelungstiefe, die der Benutzer durch seine Anfrage vorgibt: Bei der Verwendung einer k-fach verschachtelten Unteranfrage ergibt sich eine k + 1-fach verschachtelte Anfrage an das DBMS. Der hohe Zeitbedarf entsteht also nur, wenn der Benutzer selbst eine stark verschachtelte Anfrage an das Universalrelation-System stellt. 5.2 Verwendung von Outer-Joins Das bisherige Verfahren zur Erzeugung des Anfragehypergraphen benutzte immer den sogenannten inneren Verbund, oder auch Inner-Join genannt, (im DBMS Oracle realisiert durch den =“-Operator) zur Verbindung zweier Re” lationen. Dieser Verbundoperator hat die Eigenschaft, daß nur Tupel im Ergebnis erscheinen, wenn sie die Verbundbedingung erfüllen und auf den Attributen 59 definiert sind, die in der Verbundbedingung vorkommen. Dies führte dazu, daß bei der Behandlung von Anfragen mit ODER-Bedingungen diese in einzelne Disjunkte zerlegt werden müssen. Der äußere Verbund oder auch Outer-Join ist eine Art Erweiterung des Inner-Joins in der Form, daß beim Outer-Join zweier Relationen R1 und R2 mit der Verbundbedingung R1 .Ai = R2 .Bj im Ergebnis nicht nur alle Tupel vorkommen, die diese Bedingung erfüllen, sondern auch alle Tupel, die auf den Attributen Ai oder Bj nicht definiert sind, und zwar in der Form, daß alle Tupel, die kein passendes Gegenstück“ in der anderen Relation haben, für jedes ” Attribut aus der anderen Relation um einen NULL-Wert erweitert werden. Es wird unterschieden zwischen Left- bzw. Right- Outer-Join (nur die Tupel aus der linken“ bzw. rechten“ Relation ohne Gegenstück werden dem Ergebnis ” ” hinzugefügt) und dem Full-Outer-Join, bei dem alle Tupel aus beiden Relationen berücksichtigt werden. Es gilt folgende Beziehung: R1 FULL OUTER JOIN R2 ON R1 .Ai = R2 .Bj ⇔ (R1 LEFT OUTER JOIN R2 ON R1 .Ai = R2 .Bj UNION R1 RIGHT OUTER JOIN R2 ON R1 .Ai = R2 .Bj ) Laut [Dat00] wird ein Left-Outer-Join (und analog dazu ein Right-Outer-Join) zwischen zwei Relationen R1 und R2 (mit den Attributen A1 , . . . , Ai , . . . , An1 in R1 und B1 , . . . , Bj , . . . , Bn2 in R2 ) und der Verbundbedingung R1 .Ai = R2 .Bj wie folgt konstruiert: R1 LEFT OUTER JOIN R2 ON R1 .Ai = R2 .Bj :⇔ (R1 JOIN R2 ) UNION ( EXTEND ((R1 {Ai } MINUS R2 {Bj }) JOIN R1 ) ADD NULL AS B1 , . . . , NULL AS Bj−1 , NULL AS Bj+1 , . . . , NULL AS Bn2 , ) Analog dazu kann man auch einen Outer-Join für mehr als zwei Relationen und mehr als einer Vergleichs-Operation in der Verbundbedingung konstruieren. Für die Belange einer Universalrelation-System-Anfragebearbeitung interessant ist der Full-Outer-Join, da dann die Bearbeitung der Anfragen mit ODERBedingungen stark vereinfacht wird. In diesem Abschnitt soll nun untersucht werden, inwiefern die Verwendung des Outer-Joins bei der Anfragebearbeitung zu Optimierungen führt. 5.2.1 Outer-Join und Oracle8T M Das DBMS Oracle8T M stellt laut [Ora97] mit dem (+)-Operator einen Operator für Outer-Joins zur Verfügung. Es gelten folgende Einschränkungen für den Outer-Join-Operator (+): • Dieser Operator ermöglicht keinen Full Outer Join, sondern nur Left- bzw. Right Outer Joins. 60 • Ein Join-Operator kann nur auf maximal zwei Relationen gleichzeitig angewandt werden. Diese Einschränkungen lassen sich glücklicherweise durch geschicktes Konstruieren der Anfrage umgehen, wie folgendes Beispiel verdeutlichen möge: Gegeben sei folgende Datenbankausprägung: Autor Buch ISBN 0-201-38590-2 0-540-12345-1 ISBN 0-666-98765-1 0-201-38590-2 Autorenname C. J. Date Erich Kästner Titel Schlafes Bruder Database Systems Der Outer-Join dieser beiden Relationen über das Attribut ISBN sollte dann folgendes Ergebnis liefern: ISBN 0-201-38590-2 0-540-12345-1 0-666-98765-1 Autorenname C. J. Date Erich Kästner Titel Database Systems Schlafes Bruder Da der (+)-Operator immer nur den Left- oder Right Outer Join liefert, nimmt man beide Join-Varianten und vereinigt beide Ergebnisse: Der Right Outer Join SELECT b.isbn, a.autorenname, b.titel FROM autor a, buch b WHERE a.isbn (+) = b.isbn; liefert ISBN 0-201-38590-2 0-666-98765-1 Autorenname C. J. Date Titel Database Systems Schlafes Bruder , der Left Outer Join SELECT a.isbn, a.autorenname, b.titel FROM autor a, buch b WHERE a.isbn = b.isbn (+); liefert ISBN 0-201-38590-2 0-540-12345-1 Autorenname C. J. Date Erich Kästner Titel Database Systems , und die Vereinigung der beiden Anfragen SELECT FROM UNION SELECT FROM b.isbn, a.autorenname, b.titel autor a, buch b WHERE a.isbn (+) = b.isbn a.isbn, a.autorenname, b.titel autor a, buch b WHERE a.isbn = b.isbn (+); 61 liefert das gewünschte Ergebnis ISBN 0-201-38590-2 0-540-12345-1 0-666-98765-1 Autorenname C. J. Date Erich Kästner Titel Database Systems Schlafes Bruder Um den Outer-Join von mindestens drei Relationen zu bilden, gehe man wie folgt vor: Die obige Datenbankausprägung sei folgendermaßen erweitert: Verlag ISBN 0-201-38590-2 0-666-98765-1 0-540-12345-1 0-333-19283-7 Verlagsname Addison Wesley DTV Ullstein Verlag RoRoRo Der Outer-Join aller drei Relationen Autor, Buch und Verlag über das Attribut ISBN sollte dann folgendes Ergebnis liefern: ISBN 0-201-38590-2 0-540-12345-1 0-666-98765-1 0-333-19283-7 Autorenname C.J. Date Erich Kästner Titel Database Systems Schlafes Bruder Verlagsname Addison Wesley Ullstein Verlag DTV RoRoRo Wegen der Einschränkung des Outer-Joins auf zwei Relationen ist es nun nicht möglich, dieses Ergebnis in einer Anfrage etwa der Form SELECT ISBN, Autorenname, Titel, Verlagsname FROM Autor a, Buch b, Verlag v WHERE a.isbn (+) = b.isbn AND a.isbn (+) v.isbn zu erhalten. Allerdings ist es möglich, den im letzten Beispiel erhaltenen OuterJoin in einer Sicht zu speichern, und anschließend diese Sicht mit der der noch verbliebenen letzten Relation Verlag nach der schon bekannten Art zu einem Outer-Join zu verknüpfen: CREATE VIEW ab AS SELECT b.isbn, a.autorenname, b.titel FROM Autor a, Buch b WHERE a.isbn (+) = b.isbn UNION SELECT a.isbn, a.autorenname, b.titel FROM autor a, buch b WHERE a.isbn = b.isbn (+); SELECT v.isbn, ab.autorenname, ab.titel, v.verlagsname FROM ab, verlag v WHERE ab.isbn (+) = v.isbn UNION SELECT ab.isbn, ab.autorenname, ab.titel, v.verlagsname 62 FROM ab, verlag v WHERE ab.isbn = v.isbn (+); Anmerkung: Es muß nicht explizit eine Sicht erzeugt werden, es kann auch, wie im Abschnitt 5.1.2 beschrieben, mit der Definition der Sicht als Unteranfrage gearbeitet werden. Der besseren Übersicht wegen wird aber in diesem Dokument immer die Erzeugung der Sicht der Unteranfrage vorgezogen. 5.2.2 Verwendung von Outer-Joins im Universalrelation-System Die einfachste Art der Verwendung von Outer-Joins im UniversalrelationSystem besteht darin, einen Outer-Join aller zum Datenbankschema gehörenden Relationen zu bilden und diesen in einer Sicht VIEW OJ zu speichern. Eine Anfrage an das Universalrelation-System würde dann bearbeitet, indem die Anfrage um die FROM -Klausel FROM VIEW_OJ erweitert würde. Möchte man nur die Tupel im Ergebnis, die keine NULL-Werte enthalten, so wird die Anfrage noch um folgende Bedingung ergänzt: Für jedes Attribut A aus der Select-Attribut-Liste ergänze um: • AND A IS NOT NULL Die Bildung des Outer-Joins über alle zum Datenbankschema gehörenden Relationen geschieht dabei, wie in den Abbildungen Algorithmus 4“ und Algo” ” rithmus 5“ dargestellt. Eingabe: Datenbankschema 1. Bilde den Hypergraph aller im Datenbankschema vorkommenden Relationen. 2. Bilde die Verbundbedingung für diesen Hypergraphen als Folge von ANDverknüpften Termen. 3. Zu den ersten Term der Verbundbedingung Ri .A1 = Rj .A1 bilde den Outer-Join zwischen den Relationen Ri und Rj . 4. Tue folgendes, solange es geht: • Jeder Term der Verbundbedingung, deren beide Relationen schon im Outer-Join enthalten sind, wird als erledigt betrachtet. • Für jeden Term der Verbundbedingung, der die Relationen Ri und Rj verbindet, und bei dem genau eine Relation Ri im bisherigen Outer-Join enthalten ist, bilde den Outer-Join zwischen dem bisherigen Outer-Join und der Relation Rj . 5. Für eine Verbundbedingung, deren beide Relationen nicht im Outer-Join enthalten sind, bilde das kartesische Produkt zwischen dem bisherigen Outer-Join und einer der beiden Relationen. 6. Beginne wieder bei Punkt 4. Ausgabe: Der so entstandene Outer-Join. Algorithmus 4: Outer-Join-Bildung über alle Relationen 63 • Den Outer-Join zwischen Relationi und Relationj bilden“ bedeutet fol” gendes: – Bilde folgende Anfrage: SELECT <eindeutige Attribute-Liste> FROM <Relation_i>, <Relation_j> WHERE <Right-Outer-Join-Bedingung> UNION SELECT <eindeutige Attribute-Liste> FROM <Relation_i>, <Relation_j> WHERE <Left-Outer-Join-Bedingung> – Die eindeutige Attribute-Liste erstellt sich folgendermaßen: ∗ Jedes Attribut, das nur in einer der beiden Relationen vorkommt, wird übernommen ∗ Für jedes Attribut A, das in beiden Relationen Ri , Rj vorkommt, wird folgendes übernommen: · Beim Left Outer Join das Attribut aus der linken’Relation ” · Beim Right Outer Join das Attribut aus der rechten“ Rela” tion Dies stellt sicher, daß dieses Attribut nicht NULL ist, falls es in einem der beiden Relationen NULL ist. – Die Right-Outer-Join-Bedingung wird folgendermaßen berechnet: Für jedes Attribut Ak , das in beiden Relationen Ri , Rj vorhanden ist, füge die Bedingung O_i.A_k (+) = O_j.A_k hinzu (Analog für die Left-Outer-Join-Bedingung). • Punkt 5 im Verfahren von Algorithmus 4“ dient dazu, auch nichtzusam” menhängende Hypergraphen bearbeiten zu können. Algorithmus 5: Outer-Join-Bildung über alle Relationen - Anmerkungen 64 Satz: Für ein Datenbankschema aus n Relationen ergibt sich die Summe aller verknüpften Relationen zur Bildung des Outer-Joins als SOJ (1) := 1 für n = 1 bzw. SOJ (n) := 2n + n−2 X 2k für n > 1 k=1 Beweis: Durch Induktion über n. Induktions-Anfang: n = 1: Es gibt nur eine Relation, daher besteht der Outer-Join nur aus dieser Relation. Daraus folgt SOJ (1) = 1 n = 2: Es gibt zwei Relationen A und B. Diese werden einmal zum Left-Outer-Join und einmal zum Right-Outer-Join verknüpft. Jede dieser Verknüpfungen besteht aus zwei Relationen, sodaß sich ergibt: 4 = 2 ∗ 2 = 22 + 2−2 X 2k = 4 + k=1 0 X 2k = SOJ (2) k=1 Induktions-Schluß: n → n + 1: Der Outer-Join bei n + 1 Relationen A1 , . . . , An , B wird wie folgt gebildet: Bilde den Left-Outer-Join aus dem bisherigen Outer-Join und der Relation B, vereinigt mit dem Right-Outer-Join aus der Relation B und dem bisherigen Outer-Join. Dabei ist der bisherige Outer-Join der Outer-Join, der bisher aus den Relationen A1 , . . . , An erzeugt wurde. Es ergibt sich also: SOJ (n + 1) = 2 ∗ (SOJ (n) + 1) = 2 ∗ (2n + n−2 X 2k + 1) k=1 = 2n+1 + 2 ∗ = 2n+1 + n−2 X 2k + 2 k=1 n−2 X k+1 2 + 21 X 2k k=1 (n+1)−2 =2 (n+1) + k=1 Durch die hohe Anzahl von Verknüpfungen ist die hier beschriebene Methode zwar prinzipiell geeignet, um Anfragen an das Universalrelation-Systemzu bearbeiten, allerdings nicht sehr performant. Zum Beispiel bei der Anfrage SELECT Autorenname, Titel 65 an das Bibliotheks-Datenbankschema werden viel zu viele Verknüpfungen vorgenommen, obwohl man in diesem Falle mit 4 Verknüpfungen ausgekommen wäre. Eine leichte Verbesserung der Performance wird erreicht, indem nicht mehr der Outer-Join des gesamten Datenbank-Schemas, sondern nur noch des wirklich benötigten Datenbank-Ausschnittes gebildet wird. Die bedeutet folgende Modifikationen im oben aufgeführten Algorithmus: • Bilde nur noch den Anfrage-Hypergraph, nicht den Hypergraph aller im Datenbankschema vorkommenden Relationen, und dementsprechend auch die Verbundbedingungen. • Ein Attribut wird nur dann übernommen, wenn es die schon genannten Eigenschaften erfüllt und zusätzlich in der Select-Attribut-Liste enthalten oder ein Attribut zur Verbund-Bildung ist. 5.2.3 Die einzelnen Fälle des Universalrelation-Systems in Verbindung mit Outer-Joins Wie in 2.2 erläutert, ist der genaue Arbeitsablauf des Universalrelation-Systems in mehrere Schritte unterteilt: • einfache“ Anfragen ” • Datenbank-Variablen • Geschachtelte Anfragen • Mengenoperationen Im Folgenden wird nun die Verwendung von Outer-Joins für jeden dieser Schritte erläutert. einfache“ Anfragen: ” Zur Bearbeitung von einfachen“ Anfragen wird das schon bekannte Verfahren ” verwendet, allerdings werden keine Sichten UNION * und VIEW 1 erzeugt, sondern ein entsprechender Outer-Join, wie im letzten Abschnitt beschrieben. Die Sicht UR WINDOW ergibt sich dann wie folgt: CREATE VIEW UR_WINDOW AS SELECT DISTINCT <Select-Attribut-Liste> FROM ( <Outer-Join-Definition> ) WHERE <Selektions-Bedingungen> Der Rest des Verfahrens bleibt unverändert. Datenbank-Variablen: Das Verfahren wird nur insofern abgeändert, daß nun für jede DatenbankVariable Ai ein Outer-Join erzeugt wird. Dadurch ändert sich die Erzeugung der Sicht UR WINDOW zu: CREATE VIEW UR_WINDOW AS SELECT DISTINCT <Select-Attribut-Liste> 66 FROM ( <Outer-Join-Definition zu Variable A_1> ) A_1, ... ( <Outer-Join-Definition zu Variable A_k> ) A_k WHERE <Selektions-Bedingungen> ODER-Bedingungen: Zur Bearbeitung von Anfragen mit ODER-Bedingungen bieten sich nun zwei Wege an. Der Erste ist der, wie im bisherigen Verfahren, die Umformung der ODER-Bedingungen in disjunktive Form und die Weiterverarbeitung über Vereinigungen von Teilanfragen. In diesem Fall wäre keine Anpassung nötig. Der andere Weg besteht darin, die Bedingungen nicht in disjunkte Form aufzulösen, und die Anfrage so zu bearbeiten, als handele es sich um eine einfa” che“ Anfrage (bzw. eine Anfrage mit Datenbank-Variablen). Da das SELECT Kommando an einen Outer-Join gestellt wird, treten die am Anfang von Abschnitt 2.2.6 erwähnten Probleme bei ODER-Bedingungen nicht mehr auf. Geschachtelte Anfragen: Auch an diesem Verfahren ändert sich nur, daß für jeden Anfragehypergraphen nun ein Outer-Join erzeugt wird. Mengenoperationen: Auch hier wird nun ein Outer-Join für jeden Anfragehypergraphen erzeugt. 5.2.4 Beispiele und Zugriffspläne Wie weiter oben schon erwähnt, wird durch die besondere Art der Verknüpfung der beteiligten Relationen zu einem Outer-Join eine Anfrage sehr schnell sehr umfangreich. Anhand einiger ausgewählter Beispiele wird nun versucht, die prinzipielle Struktur einer Anfrage mit Outer-Joins darzustellen. Das folgende Beispiel zeigt, wie ein Zugriffsplan bei einem Outer-Join von zwei Relationen aussieht: Gegeben sei folgende Anfrage an das Universalrelation-System: SELECT Autorenname, Titel; Der Anfragehypergraph AHG und die daraus resultierende Verbundbedingung sind: AHG ::= {{ISBN, Autorenname}Autor } {ISBN, Titel}Buch } Verbundbedingung ::= Autor.ISBN = Buch.ISBN Daraus ergibt sich folgender Outer-Join in der Oracle-Syntax: SELECT Autorenname, Titel FROM ( SELECT Buch.Titel, Autor.Autorenname FROM Buch, Autor WHERE Buch.ISBN (+) = Autor.ISBN 67 UNION SELECT Buch.Titel, Autor.Autorenname FROM Buch, Autor WHERE Buch.ISBN = Autor.ISBN (+) ) ) Die Anfrage an das DBMS erzeugt schließlich folgenden Verbundpfad: Es läßt sich gut erkennen, wie durch das UNION im SQL-Befehl quasi eine Verdoppelung der beteiligten Relationen auftritt. Zum Vergleich sei hier der Verbundpfad gezeigt, wie er sich bei der Bearbeitung der Anfrage nach der herkömmlichen Methode ergibt: 68 Das folgende Beispiel führt zu einem Outer-Join mit drei beteiligten Relationen: Gegeben sei folgende Anfrage an das Universalrelation-System: SELECT Titel, Verlagsname; Der Anfragehypergraph AHG und die daraus resultierende Verbundbedingung sind: AHG ::= {{ISBN, Titel}Buch } {ISBN, ISBN_Code}wird_verlegt {ISBN_Code, Verlagsname}V erlag } Verbundbedingungen ::= Buch.ISBN = wird_verlegt.ISBN AND wird_verlegt.ISBN_Code = Verlag.ISBN_Code Daraus ergibt sich folgender Outer-Join in der Oracle-Syntax: SELECT Titel, Verlagsname FROM ( SELECT OJ.Titel, Verlag.Verlagsname FROM ( SELECT Buch.Titel, wird_verlegt.isbn, wird_verlegt.isbn_code 69 FROM Buch, wird_verlegt WHERE Buch.ISBN (+) = wird_verlegt.ISBN UNION SELECT Buch.Titel, Buch.isbn, wird_verlegt.isbn_code FROM Buch, wird_verlegt WHERE Buch.ISBN = wird_verlegt.ISBN (+) ) OJ, Verlag WHERE OJ.isbn_code (+) = Verlag.isbn_code UNION SELECT OJ.Titel, Verlag.Verlagsname FROM ( SELECT Buch.Titel, wird_verlegt.isbn, wird_verlegt.isbn_code FROM Buch, wird_verlegt WHERE Buch.ISBN (+) = wird_verlegt.ISBN UNION SELECT Buch.Titel, Buch.isbn, wird_verlegt.isbn_code FROM Buch, wird_verlegt WHERE Buch.ISBN = wird_verlegt.ISBN (+) ) OJ, Verlag WHERE OJ.isbn_code = BIB.VERLAG.isbn_code (+) ) Die Anfrage an das DBMS erzeugt schließlich folgenden Verbundpfad: Man erkennt, daß an der zweiten Verzweigungs-Ebene von oben“ zwei Merge” Joins sind. Diese verknüpfen jeweils die Relation Verlag mit einer verschachtelten Struktur: 70 Diese verschachtelte Struktur ist der Teil-Outer-Join, mit dem dann die Relation Verlag wiederum zu einem Outer-Join verknüpft wurde. Würde man die Anfrage nun um das Attribut Verlagsort erweitern, sodaß dann noch die Relation Verl Orte beteiligt wäre, so würde diese Relation mit dem in hier erzeugten Outer-Join zweimal verknüpft werden. Auch hier sei zum Vergleich der aus der herkömmlichen Methode resultierende Verbundpfad dargestellt: 71 5.2.5 Outer-Join und Oracle9T M In der mittlerweile veröffentlichten Version 9i des DBMS Oracle ist es laut [Ora01] nun möglich, direkt einen Full-Outer-Join über mehrere Relationen zu erzeugen. Die Syntax, um einen solchen Join über m Relationen zu bilden lautet: SELECT <Attribute> FROM <Relation_1> FULL OUTER JOIN <Relation_2> ON <Verbundbedingung_1> [FULL OUTER JOIN <Relation_3> ON <Verbundbedingung_2> [...] [FULL OUTER JOIN <Relation_m> ON <Verbundbedingung_m-1> [WHERE <Selektionsbedingung> ...] Dies bedeutet insbesondere, daß die noch in Version 8i vorhandenen Einschränkungen an den Join-Operator (+) wegfallen. Dadurch wird das im vorherigen Abschnitt beschriebene Verfahren stark vereinfacht und weniger umfangreich, da insbesondere das sukzessive Verbinden von Teil-Outer-Joins mit einzelnen Relationen nun wegfällt. Der Algorithmus zur Outer-Join-Bildung verläuft dadurch unkomplizierter - die geänderte Fassung ist in den Abbildungen Algorithmus 6“ und Algorithmus ” ” 7“ aufgeführt. Eingabe: Datenbankschema 1. Bilde den Hypergraph aller im Datenbankschema vorkommenden Relationen. 2. Bilde die Verbundbedingung für diesen Hypergraphen als Folge von ANDverknüpften Termen.. 3. Zu dem ersten Term der Verbundbedingung Ri .A1 = Rj .A1 bilde den Outer-Join zwischen den Relationen Ri und Rj . 4. Tue folgendes, solange es geht: • Jeder Term der Verbundbedingung, deren beide Relationen schon im Outer-Join enthalten sind, wird als erledigt betrachtet. • Für jeden Term der Verbundbedingung, bei der genau eine Relation Ri im Outer-Join enthalten ist, füge die anderen Relation Rj dem bisherigen Outer-Join hinzu. 5. Für eine Verbundbedingung, deren beide Relationen nicht im Outer-Join enthalten sind, bilde das kartesische Produkt zwischen dem bisherigen Outer-Join und einer der beiden Relationen. 6. Beginne wieder bei Punkt 4. Ausgabe: Der so entstandene Outer-Join. Algorithmus 6: Outer-Join-Bildung über alle Relationen in Oracle9i 72 • Den Outer-Join zwischen Relation i und Relation j bilden“ bedeutet fol” gendes: – Bilde folgende Anfrage: SELECT <eindeutige Attribute-Liste> FROM <Relation_i> FULL OUTER JOIN <Relation_j> ON <Outer-Join-Bedingung> – Die eindeutige Attribute-Liste wird folgendermaßen erstellt: ∗ Jedes Attribut, das nur in einer der beiden Relationen vorkommt, wird übernommen ∗ Bei Attributen, die in beiden Relationen Ri , Rj vorkommen, wird das Attribut nur aus einer der beiden Relationen übernommen. – Die Outer-Join-Bedingung wird folgendermaßen berechnet: Für jedes Attribut Ak , das in beiden Relationen Ri , Rj vorhanden ist, füge die Bedingung [AND] O_i.A_k = O_j.A_k hinzu. • Die Relation Rj dem Outer-Join hinzufügen“ bedeutet: ” – Die bisherige Anfrage wird erweitert um: FULL OUTER JOIN <Relation_j> ON <Outer-Join-Bedingung> – die eindeutige Attribut-Liste in der bisherigen Anfrage wird erweitert um die Attribute aus der Relation Rj , sofern diese nicht schon in der Liste vorkommen. • Punkt 5 im Verfahren Älgorithmus 6”dient dazu, auch nichtzusammenhängende Hypergraphen bearbeiten zu können. Algorithmus 7: Outer-Join-Bildung über alle Relationen in Oracle9i - Anmerkungen 73 5.2.6 Zeitmessungen Anhand ausgewählter Beispiele wurde der Zeitaufwand des UniversalrelationSystems zur Bearbeitung von Anfragen mit den verschiedenen Verfahren (herkömmlich, Outer-Join in Oracle8 , Outer-Join in Oracle9 ) ermittelt. Dazu wurde die Sicht UR WINDOW mit jedem dieser Verfahren erzeugt, und die Anfrage gestellt. Alle Anfragen wurden an dasselbe DBMS gestellt. Die Ermittlung des Zeit- und Speicherbedarfs erfolgte mit dem SQL*PlusKommandos SET TIMING ON SET AUTOTRACE ON Insbesondere die Parameter db block gets und consistent gets (Anzahl der Blockzugriffe, die aus dem Hauptspeicher bedient werden konnten ) und der Parameter physical reads (Anzahl der lesenden Zugriffe auf die Datenbank) wurden dabei betrachtet. Jede SQL-Anfrage an die Sicht UR WINDOW wurde mehrmals gestellt, und die Bedarfswerte ergaben sich aus dem arithmetischen Mittel der einzelnen Werte. Sei folgende Anfrage an das Universalrelation-System gegeben: SELECT MovieTitle, DirectorName, PlayerName WHERE Pos is not null; Gesucht sind also alle Filme mit Regisseur und Darstellern. Für die Messung für das Verfahren mit Outer-Join in Oracle8 wurde der OuterJoin wie folgt erzeugt: CREATE VIEW OJ1 AS ( SELECT OJ.DIRECTORNAME, OJ.MOVIEID, OJ.DIRECTORID, OJ.MOVIETITLE, OJ.POS, PLAYER.PLAYERNAME, PLAYER.PLAYERID FROM ( SELECT OJ.DIRECTORNAME, OJ.DIRECTORID, OJ.MOVIETITLE, PLAYS.PLAYERID, PLAYS.POS, PLAYS.MOVIEID FROM ( SELECT OJ.DIRECTORNAME, OJ.DIRECTORID, MOVIE.MOVIETITLE, MOVIE.MOVIEID FROM ( SELECT DIRECTOR.DIRECTORNAME, DIRECTS.MOVIEID, 74 DIRECTS.DIRECTORID FROM DIRECTOR, DIRECTS WHERE DIRECTOR.DIRECTORID (+) = DIRECTS.DIRECTORID UNION SELECT DIRECTOR.DIRECTORNAME, DIRECTS.MOVIEID, DIRECTOR.DIRECTORID FROM DIRECTOR, DIRECTS WHERE DIRECTOR.DIRECTORID = DIRECTS.DIRECTORID (+) ) OJ, MOVIE WHERE OJ.MOVIEID (+) = MOVIE.MOVIEID UNION SELECT OJ.DIRECTORNAME, OJ.DIRECTORID, MOVIE.MOVIETITLE, OJ.MOVIEID FROM ( SELECT DIRECTOR.DIRECTORNAME, DIRECTS.MOVIEID, DIRECTS.DIRECTORID FROM DIRECTOR, DIRECTS WHERE DIRECTOR.DIRECTORID (+) = DIRECTS.DIRECTORID UNION SELECT DIRECTOR.DIRECTORNAME, DIRECTS.MOVIEID, DIRECTOR.DIRECTORID FROM DIRECTOR, DIRECTS WHERE DIRECTOR.DIRECTORID = DIRECTS.DIRECTORID (+) ) OJ, MOVIE WHERE OJ.MOVIEID = MOVIE.MOVIEID (+) ) OJ, PLAYS WHERE OJ.MOVIEID (+) = PLAYS.MOVIEID UNION SELECT OJ.DIRECTORNAME, OJ.DIRECTORID, OJ.MOVIETITLE, PLAYS.PLAYERID, PLAYS.POS, OJ.MOVIEID FROM ( SELECT OJ.DIRECTORNAME, OJ.DIRECTORID, MOVIE.MOVIETITLE, MOVIE.MOVIEID FROM ( SELECT DIRECTOR.DIRECTORNAME, DIRECTS.MOVIEID, DIRECTS.DIRECTORID FROM DIRECTOR, DIRECTS WHERE DIRECTOR.DIRECTORID (+) = DIRECTS.DIRECTORID UNION SELECT DIRECTOR.DIRECTORNAME, DIRECTS.MOVIEID, 75 DIRECTOR.DIRECTORID FROM DIRECTOR, DIRECTS WHERE DIRECTOR.DIRECTORID = DIRECTS.DIRECTORID (+) ) OJ, MOVIE WHERE OJ.MOVIEID (+) = MOVIE.MOVIEID UNION SELECT OJ.DIRECTORNAME, OJ.DIRECTORID, MOVIE.MOVIETITLE, OJ.MOVIEID FROM ( SELECT DIRECTOR.DIRECTORNAME, DIRECTS.MOVIEID, DIRECTS.DIRECTORID FROM DIRECTOR, DIRECTS WHERE DIRECTOR.DIRECTORID (+) = DIRECTS.DIRECTORID UNION SELECT DIRECTOR.DIRECTORNAME, DIRECTS.MOVIEID, DIRECTOR.DIRECTORID FROM DIRECTOR, DIRECTS WHERE DIRECTOR.DIRECTORID = DIRECTS.DIRECTORID (+) ) OJ, MOVIE WHERE OJ.MOVIEID = MOVIE.MOVIEID (+) ) OJ, PLAYS WHERE OJ.MOVIEID = PLAYS.MOVIEID (+) ) OJ, PLAYER WHERE OJ.PLAYERID (+) = PLAYER.PLAYERID UNION SELECT OJ.DIRECTORNAME, OJ.MOVIEID, OJ.DIRECTORID, OJ.MOVIETITLE, OJ.POS, PLAYER.PLAYERNAME, OJ.PLAYERID FROM ( SELECT OJ.DIRECTORNAME, OJ.DIRECTORID, OJ.MOVIETITLE, PLAYS.PLAYERID, PLAYS.POS, PLAYS.MOVIEID FROM ( SELECT OJ.DIRECTORNAME, OJ.DIRECTORID, MOVIE.MOVIETITLE, MOVIE.MOVIEID FROM ( SELECT DIRECTOR.DIRECTORNAME, DIRECTS.MOVIEID, DIRECTS.DIRECTORID FROM DIRECTOR, DIRECTS WHERE DIRECTOR.DIRECTORID (+) = DIRECTS.DIRECTORID 76 UNION SELECT DIRECTOR.DIRECTORNAME, DIRECTS.MOVIEID, DIRECTOR.DIRECTORID FROM DIRECTOR, DIRECTS WHERE DIRECTOR.DIRECTORID = DIRECTS.DIRECTORID (+) ) OJ, MOVIE WHERE OJ.MOVIEID (+) = MOVIE.MOVIEID UNION SELECT OJ.DIRECTORNAME, OJ.DIRECTORID, MOVIE.MOVIETITLE, OJ.MOVIEID FROM ( SELECT DIRECTOR.DIRECTORNAME, DIRECTS.MOVIEID, DIRECTS.DIRECTORID FROM DIRECTOR, DIRECTS WHERE DIRECTOR.DIRECTORID (+) = DIRECTS.DIRECTORID UNION SELECT DIRECTOR.DIRECTORNAME, DIRECTS.MOVIEID, DIRECTOR.DIRECTORID FROM DIRECTOR, DIRECTS WHERE DIRECTOR.DIRECTORID = DIRECTS.DIRECTORID (+) ) OJ, MOVIE WHERE OJ.MOVIEID = MOVIE.MOVIEID (+) ) OJ, PLAYS WHERE OJ.MOVIEID (+) = PLAYS.MOVIEID UNION SELECT OJ.DIRECTORNAME, OJ.DIRECTORID, OJ.MOVIETITLE, PLAYS.PLAYERID, PLAYS.POS, OJ.MOVIEID FROM ( SELECT OJ.DIRECTORNAME, OJ.DIRECTORID, MOVIE.MOVIETITLE, MOVIE.MOVIEID FROM ( SELECT DIRECTOR.DIRECTORNAME, DIRECTS.MOVIEID, DIRECTS.DIRECTORID FROM DIRECTOR, DIRECTS WHERE DIRECTOR.DIRECTORID (+) = DIRECTS.DIRECTORID UNION SELECT DIRECTOR.DIRECTORNAME, DIRECTS.MOVIEID, DIRECTOR.DIRECTORID FROM DIRECTOR, DIRECTS WHERE DIRECTOR.DIRECTORID = DIRECTS.DIRECTORID (+) 77 ) OJ, MOVIE WHERE OJ.MOVIEID (+) = MOVIE.MOVIEID UNION SELECT OJ.DIRECTORNAME, OJ.DIRECTORID, MOVIE.MOVIETITLE, OJ.MOVIEID FROM ( SELECT DIRECTOR.DIRECTORNAME, DIRECTS.MOVIEID, DIRECTS.DIRECTORID FROM DIRECTOR, DIRECTS WHERE DIRECTOR.DIRECTORID (+) = DIRECTS.DIRECTORID UNION SELECT DIRECTOR.DIRECTORNAME, DIRECTS.MOVIEID, DIRECTOR.DIRECTORID FROM DIRECTOR, DIRECTS WHERE DIRECTOR.DIRECTORID = DIRECTS.DIRECTORID (+) ) OJ, MOVIE WHERE OJ.MOVIEID = MOVIE.MOVIEID (+) ) OJ, PLAYS WHERE OJ.MOVIEID = PLAYS.MOVIEID (+) ) OJ, PLAYER WHERE OJ.PLAYERID = PLAYER.PLAYERID (+) ); CREATE VIEW UR_WINDOW AS SELECT MovieTitle, DirectorName, PlayerName FROM OJ1 WHERE Pos IS NOT NULL; Für die Messung für das Verfahren mit Outer-Join in Oracle9 wurde der OuterJoin wie folgt erzeugt: CREATE VIEW OJ2 AS ( SELECT M.MovieID, M.MovieTitle, P.PlayerID, P.PlayerName, D.DirectorID, D.DirectorName, plays.Pos FROM Movie M FULL OUTER JOIN directs ON M.MovieID = directs.MovieID FULL OUTER JOIN Director D ON directs.DirectorID = D.DirectorID FULL OUTER JOIN plays ON M.MovieID = plays.MovieID FULL OUTER JOIN Player P ON P.PlayerID = plays.PlayerID ); 78 CREATE VIEW UR_WINDOW AS SELECT MovieTitle, DirectorName, PlayerName FROM OJ2 WHERE Pos IS NOT NULL; Die Anfrage beim herkömmlichen Verfahren lautete SELECT MovieTitle, DirectorName, PlayerName FROM UR_WINDOW; während bei den Outer-Join-Verfahren folgende Anfrage benutzt wurde: SELECT MovieTitle, DirectorName, PlayerName FROM UR_WINDOW WHERE MovieTitle IS NOT NULL AND DirectorName IS NOT NULL AND PlayerName IS NOT NULL; Mit der herkömmlichen Methode wurden folgende Werte gemessen: Durchlauf 1 2 3 4 5 Durchschnitt: Zeit / sec 154.56 73.84 65.89 81.07 77.60 90.59 db block gets 26 26 26 26 26 26 constistent gets 1243198 1243184 1243184 1243184 1243184 1243187 physical reads 1911 1907 1911 1907 1911 1909 Die Messungen beim Verfahren mit Outer-Join in Oracle8 ergaben: Durchlauf 1 2 3 4 5 Durchschnitt: Zeit / sec 233.41 138.81 193.77 138.25 164.46 173.74 db block gets 504 504 502 503 504 503 constistent gets 1407943 1407939 1407939 1407939 1407939 1407940 physical reads 24923 24920 24890 24906 24902 24908 Die Messungen beim Verfahren mit Outer-Join in Oracle9 ergaben: Durchlauf 1 2 3 4 5 Durchschnitt: Zeit / sec 164.46 65.70 123.71 68.23 66.46 97.71 db block gets 10 10 10 10 10 10 constistent gets 559956 559956 559956 559956 559956 559956 physical reads 0 0 0 0 0 0 Durch die vielen Verschachtelungen beim Erzeugen des Outer-Joins benötigt das Verfahren mit Outer-Join in Oracle8 etwa doppelt so viel Zeit wie das herkömmliche Verfahren, während das Verfahren mit echtem Outer-Join in etwa gleich viel Zeit beansprucht. Erwartungsgemäß benötigt das Verfahren mit Outer-Join in Oracle8 viel mehr Leseoperationen und damit mehr Zugriffe auf die Datenbank als die beiden 79 anderen Verfahren. Das Verfahren mit Outer-Join in Oracle9 konnte alle Leseoperationen komplett aus dem Hauptspeicher bedienen, war allerdings etwas langsamer in der Zeit als das herkömmliche Verfahren. Sei nun folgende Anfrage an das Universalrelation-System gegeben: SELECT MovieTitle, DirectorName, PlayerName WHERE Pos pos = 1 OR Directorname = Playername; Gesucht sind also alle Filme mit Regisseur und Darsteller, wobei der Darsteller entweder der Hauptdarsteller oder gleichzeitig der Regisseur ist. Die Sichten OJ1 bzw. OJ2 wurden wie im letzten Beispiel erzeugt. Bei der Erzeugung der Sicht UR WINDOW wurden bei den Outer-Join-Verfahren je einmal die Sicht mit ODER-Bedingungen und je einmal mit UNION -Verknüpfung erzeugt: CREATE VIEW UR_WINDOW AS ( SELECT "MOVIETITLE" , ‘‘DIRECTORNAME" , "PLAYERNAME" FROM OJ1 WHERE POS = 1 OR Directorname = Playername ); bzw. CREATE VIEW UR_WINDOW AS ( SELECT "MOVIETITLE" , ‘‘DIRECTORNAME" , "PLAYERNAME" FROM OJ1 WHERE POS = 1 UNION SELECT "MOVIETITLE" , ‘‘DIRECTORNAME" , "PLAYERNAME" FROM OJ1 WHERE Directorname = Playername ); Mit der herkömmlichen Methode wurden folgende Werte gemessen: Durchlauf 1 2 3 4 5 Durchschnitt: Zeit / sec 9.70 16.65 8.72 8.71 8.70 10.50 db block gets 13 13 13 13 13 13 constistent gets 827069 827043 827043 827043 827043 827048 physical reads 186 186 186 186 186 186 Die Messungen beim Verfahren mit Outer-Join in Oracle8 und UNION Verknüpfung ergaben: 80 Durchlauf 1 2 3 4 5 Durchschnitt: Zeit / sec 180.91 182.33 182.20 182.43 181.94 181.96 db block gets 922 922 922 922 922 922 constistent gets 2701508 2701502 2701502 2701502 2701502 2701503 physical reads 39840 39862 39882 39848 39854 39857 Die Messungen beim Verfahren mit Outer-Join in Oracle8 und ODERBedingungen ergaben: Durchlauf 1 2 3 4 5 Durchschnitt: Zeit / sec 202.86 202.85 200.33 287.33 218.79 222.43 db block gets 481 481 481 481 481 481 constistent gets 1539973 1539969 1539969 1539969 1539969 1539970 physical reads 22333 22331 22353 22348 22348 22342 Die Messungen beim Verfahren mit Outer-Join in Oracle9 und UNION Verknüpfung ergaben: Durchlauf 1 2 3 4 5 Durchschnitt: Zeit / sec 12.12 16.82 12.00 16.63 12.03 13.92 db block gets 25 25 25 25 25 25 constistent gets 893577 893571 893571 893571 893571 893572 physical reads 185 185 185 185 185 185 Die Messungen beim Verfahren mit Outer-Join in Oracle9 und ODERBedingungen ergaben: Durchlauf 1 2 3 4 5 Durchschnitt: Zeit / sec 10.42 10.42 10.43 10.40 10.45 10.42 db block gets 10 10 10 10 10 10 constistent gets 730090 730086 730086 730086 730086 730087 physical reads 0 0 0 0 0 0 Erwartungsgemäß benötigen die Outer-Join-Verfahren in Oracle8 ein Vielfaches mehr an Zeit und Leseoperationen als die anderen Verfahren. Als erstes Fazit steht somit fest, daß das Verfahren mit Outer-Join in Oracle8 keinen Optimierungsgewinn bringt. Das herkömmliche Verfahren und die Verfahren mit Outer-Join in Oracle9 benötigen etwa gleich viel Zeit und Leseoperationen, wobei das Verfahren mit Outer-Join und ODER-Bedingungen leicht gewinnt, was Zeitbedarf und Anzahl der Leseoperationen betrifft. Sei nun folgende Anfrage an das Universalrelation-System gegeben: SELECT a.MOVIEtitle, a.Directorname, a.Playername, b.MovieTitle, B.Directorname 81 WHERE b.MovieID = a.SuccessorID; Gesucht sind also alle Filme mit ihrer Fortsetzung. Die Messungen wurden jetzt nur noch für das herkömmliche Verfahren und das Verfahren mit Outer-Join in Oracle9 durchgeführt, da das Verfahren mit Outer-Join in Oracle8 sich schon als nicht empfehlenswert erwiesen hat. Die Sichten für das Outer-Join-Verfahren wurden wie folgt erzeugt: CREATE VIEW oj_a_1 AS SELECT m.MOVIETITLE, d.Directorname, p.Playername, f.SuccessorID FROM movie m FULL OUTER JOIN directs ON m.MovieID = directs.MovieID FULL OUTER JOIN director d ON directs.directorID = d.directorID FULL OUTER JOIN follows f ON f.movieID = m.movieID FULL OUTER JOIN plays ON plays.movieID = m.movieID FULL OUTER JOIN player p ON plays.playerID = p.playerID; CREATE VIEW oj_b_1 AS SELECT m.MOVIEID, m.MOVIETITLE, d.directorname FROM movie m FULL OUTER JOIN directs ON m.movieID = directs.movieID FULL OUTER JOIN director d ON directs.directorID = d.directorID; CREATE VIEW UR_WINDOW AS SELECT DISTINCT A.MOVIETITLE "A.MOVIETITLE" , A.DIRECTORNAME "A.DIRECTORNAME", A.PLAYERNAME "A.PLAYERNAME", B.MOVIETITLE "B.MOVIETITLE", B.DIRECTORNAME "B.DIRECTORNAME" FROM oj_a_1 A, oj_b_1 B WHERE A.SUCCESSORID = B.MOVIEID; und die Anfrage lautete SELECT "A.MOVIETITLE", "A.DIRECTORNAME", "B.MOVIETITLE", "B.DIRECTORNAME" FROM URW2 WHERE "A.MOVIETITLE" IS NOT NULL AND "A.DIRECTORNAME" IS NOT NULL AND "A.PLAYERNAME" IS NOT NULL AND "B.MOVIETITLE" IS NOT NULL AND "B.DIRECTORNAME" IS NOT NULL; Mit der herkömmlichen Methode wurden folgende Werte gemessen: 82 Durchlauf 1 2 3 4 5 Durchschnitt: Zeit / sec 32.96 34.01 33.62 33.63 33.21 33.48 db block gets 2 2 2 2 2 2 constistent gets 19526 19504 19504 19504 19504 19508 physical reads 0 0 0 0 0 0 Die Messungen beim Verfahren mit Outer-Join in Oracle9 ergaben: Durchlauf 1 2 3 4 5 Durchschnitt: Zeit / sec 30.96 30.37 29.90 30.49 30.39 30.42 db block gets 22 22 22 22 22 22 constistent gets 821865 821859 821859 821859 821859 821860 physical reads 38 38 38 38 38 38 Der Zeitbedarf ist für beide Verfahren in etwa gleich, mit leichtem Vorsprung für das Outer-Join-Verfahren. Allerdings sind beim Outer-Join-Verfahren die Leseoperationen um ein Vielfaches höher als beim herkömmlichen Verfahren. 5.2.7 Fazit Von den untersuchten Verfahren bietet sich nur das Outer-Join-Verfahren in Oracle9 als Alternative zum herkömmlichen Verfahren an. Insbesondere bei der Behandlung von ODER-Bedingungen kommen die Vorteile des Outer-Joins zum Tragen. Allerdings sind die Ergebnisse für das Outer-Join-Verfahren nicht immer optimaler als bei der herkömmlichen Methode, denn insbesondere bei der Verwendung von Datenbankvariablen lag der Leseaufwand um ein Vielfaches höher als beim herkömmlichen Verfahren, was sich allerdings nicht im Zeitbedarf bemerkbar gemacht hat. 83 6 Das neue“ Universalrelation-System ” In diesem Abschnitt werden die Neuerungen zusammengefaßt, die sich aus den in den vorigen Abschnitten durchgeführten Untersuchungen ergeben Die Untersuchungen aus Abschnitt 5 ergab folgende positive Ergebnisse: • Die Verwendung von Unteranfragen anstatt Sichten für Zwischenanfragen kann den Zeitaufwand verringern, außerdem wird die Fehleranfälligkeit gesenkt, da nur noch ein CREATE -Befehl gesendet werden muß. • Die Verwendung von Outer-Joins zumindest in Oracle-DMBS ab Version 9i ergibt keine tiefgreifenden Optimierungen im Zeitaufwand, allerdings wird das Konzept vereinfacht, da für ODER-Bedingungen keine Sonderbehandlung mehr erforderlich ist. Daraus ergibt sich der weitere Vorteil, daß das Verbot von Aggregatfunktionen wieder aufgehoben werden kann. Wir verwenden daher in der neuen Fassung des Universalrelation-Systems keine Zwischensichten“ mehr, und das Fenster“ auf die Universalrelation wird mit ” ” dem Outer-Join konstruiert. Die Bestimmung des Fensters“ verläuft analog zu der Bildung des Outer-Joins ” im in Algorithmus 6“ beschriebenen Verfahrens und wird in Algorithmus 8“ in ” ” der Übersicht dargestellt. Der Einfachheit halber wird das Verfahren auf zusammenhängende Datenbankschemas eingeschränkt. Eingabe: Anfragehypergraph, Attributmenge X Ausgabe: Das zu X gehörende Fenster [X]. Verfahren: • Für jede Kante Rk (k = 0, . . . , m) des Anfragehypergraphens mit der Attributmenge Ak – Bestimme die Projektion aller Relationen der Datenbank, deren Schema eine Obermenge dieser Attributmenge ist. – Bilde die Vereinigung aller dieser Projektionen. • Fasse alle diese Vereinigungen über den Outer-Join zusammen. Die OuterJoin-Bedingung wird dabei über alle gleichen Attribute gebildet. • Bilde [X] als die Projektion dieses Verbundes auf die Attributmenge X mit der zusätzlichen Bedingung, daß jedes Attribut A ∈ X nicht NULL ist. Algorithmus 8: Erzeugung des Fensters [X] mittels Outer-Join Beispiel Betrachten wir noch einmal die in Abschnitt 2.2.6 vorgestellte Anfrage nach allen nach 1994 oder im Addison-Wesley-Verlag erschienenen Büchern im BibliotheksDatenbankschema: SELECT Titel WHERE Erscheinungsjahr > 1994 OR Verlagsname = ’Addison-Wesley’; Die Attributmenge X und der Anfragehypergraph zu dieser Anfrage sind: 84 X = AHG(X)= {T itel, Erscheinungsjahr, V erlagsname} {(ISBN, T itel, Erscheinungsjahr)Buch, (ISBN, ISBN CODE)wird verlegt , (ISBN CODE, V erlagsname)V erlag } Die Definitionen der Kanten“ des Anfragehypergraphen ergeben sich wie folgt: ” Kante_0 ≡ SELECT ISBN, Titel, Erscheinungsjahr FROM Buch Kante_1 ≡ SELECT ISBN, ISBN_CODE FROM wird_verlegt Kante_2 ≡ SELECT ISBN_CODE, Verlagsname FROM Verlag Das Fenster“ wird berechnet: ” [X] ≡ SELECT Titel, Erscheinungsjahr, Verlagsname FROM ( SELECT ISBN, Titel, Erscheinungsjahr FROM Buch ) Kante_0 FULL OUTER JOIN ( SELECT ISBN, ISBN_CODE FROM wird_verlegt ) Kante_1 ON Kante_0.ISBN = Kante_1.ISBN FULL OUTER JOIN ( SELECT ISBN_CODE, Verlagsname FROM Verlag ) Kante_2 ON Kante_1.ISBN_CODE = Kante_2.ISBN_CODE Die Sicht auf die Ergebnistupel wird erzeugt und die Anfrage gestellt: UR_WINDOW ≡ SELECT Titel FROM ( <Fenster [X]> ) AHG WHERE Erscheinungsjahr > 1994 OR Verlagsname = ’Addison-Wesley’ SELECT Titel FROM ( <UR_WINDOW> ) WHERE Titel IS NOT NULL; Anmerkung: < F enster[X] > und < U R W IN DOW > wurden hier der Übersichtlichkeit halber nicht durch ihre Definition ersetzt. Die fertige“ Anfrage sähe ” folgendermaßen aus: SELECT Titel 85 FROM ( SELECT Titel FROM ( SELECT Titel, Erscheinungsjahr, Verlagsname FROM ( SELECT ISBN, Titel, Erscheinungsjahr FROM Buch ) Kante_0 FULL OUTER JOIN ( SELECT ISBN, ISBN_CODE FROM wird_verlegt ) Kante_1 ON Kante_0.ISBN = Kante_1.ISBN FULL OUTER JOIN ( SELECT ISBN_CODE, Verlagsname FROM Verlag ) Kante_2 ON Kante_1.ISBN_CODE = Kante_2.ISBN_CODE ) AHG WHERE Erscheinungsjahr > 1994 OR Verlagsname = ’Addison-Wesley’ ) UR_WINDOW WHERE Titel IS NOT NULL; 86 7 Ausblick Wir haben in der vorliegenden Arbeit die Versuche zur Optimierung eines Universalrelation-Systems und die Umsetzung der Ergebnisse beschrieben. Die dabei gewonnenen Erkenntnisse sind nicht spektakulär. Allenfalls die Erkenntnis, daß ein Outer-Join die Sonderbehandlung von ODER-Bedingungen überflüssig macht, ragt ein wenig heraus. Es bleibt am Ende die Frage, was noch zusätzlich zu tun bleibt. Optimierungsuntersuchungen ohne konkrete Anfragen oder gar Datenbankschemas sind eine vage Angelegenheit. Mit dem Fortschreiten der Fähigkeiten des Optimierers im DBMS Oracle wird diese Frage immer mehr eine akademische. Das bereits in [Bor01] vorgestellte Universalrelation-System wurde durch die Umsetzung der Erkennung der Datenbankschema-Struktur über JDBC Metadaten flexibler in der Anwendung. Der aus Optimierungsgründen vorgenommene Verzicht auf Erzeugung von Sichten hat auch den positiven Nebeneffekt, daß das in [Bor01] erwähnte Problem der Sichten-Benennung sich gelöst hat. Die vom Universalrelation-System akzeptierte Anfragesprache ist so nah wie möglich am Vorbild“ SQL geblieben. Interessant wäre in diesem Zusammen” hang eine mögliche Erweiterung der Anfragesprache auf objektrelationale Erweiterungen, wie Oracle sie seit der Version 8 anbietet. 87 Literatur [AP87] Nabiha Azar and Etienne Pichat. Translation of an extended entityrelationship model into the universal relation with inclusions formalism. Entity-Relationship Approach, 1987. [BB83] Joachim Biskup and Hans Hermann Brueggemann. Universal relation views: A pragmatic approach. In 9th International Conference on Very Large Data Bases,October 31 - November 2, Florence,Italy, 1983. [BB87] Joachim Biskup and Hans Hermann Brüggemann. Data manipulation languages for the universal relation view durst. MFDBS, 1987. [BBSK86] J. Biskup, H. H. Brüggemann, L. Schnetgöke, and M. Kramer. One flavor assumption and γ-acyclicity for universal relation views. ACM PODS, 1986. [Bor01] Martin Boroske. Universalrelation-Sichten in Java. Studienarbeit, Universität Hannover, Institut für Informatik, January 2001. Der Vorgänger dieser Arbeit. [Brü86] Hans Hermann Brüggemann. Semantik von UniversalrelationSichten und ihre Datenbankschemas. Forschungsbericht nr. 214, Universität Dortmund, Abteilung Informatik, 1986. [BT93] Hans H. Brüggemann and Bernd Teßmer. Ein UniversalrelationFrontend für SQL. In Hildesheimer Informatik-Berichte. Universität Hildesheim, Institut für Informatik, July 1993. Der Vorgänger von [Bor01]. [CK76] C. Robert Carlson and Robert S. Kaplan. A generalized access path model and its application to a relational data base system. In ACM SIGMOD International Conference on Management of Data, Washington, D.C., 1976. [Cod88] E. F. Codd. ’universal’ relation fails to replace relational model. IEEE Software, 1988. Brief an den Herausgeber von [Var88], mit einer beigefügten Antwort von Vardi. [Dat00] C. J. Date. An Introduction to Database Systems. Addison-Wesley, seventh edition, 2000. [HL91] Heikki Hyötyniemi and Aarno Lehtola. A universal relation database interface for knowledge based systems. In International Symposium on Database Systems for Advanced Applications, Tokyo, Japan, April 1991. [Ken81] W. Kent. Consequences of assuming a universal relation. ACM Transactions on Database Systems, 6(4):539 – 556, 1981. [KLSZ01] Ramayya Krishnan, Xiaoping Li, David Steier, and Leon Zhao. On heterogeneous database retrieval: A cognitively guided approach. Information Systems Research, 12(3):286 – 301, September 2001. 88 [Lau82] R. Laue. A universal relation with null-values. Technical report, RWTH Aachen, 1982. [Lev92] M. Levene. The nested universal relatione database model. In Lecture Notes in Computer Science, volume 595. Springer Verlag, 1992. [LL88] M. Levene and G. Loizou. A universal relation model for nested relations. EBDT, 1988. [LL89] M. Levene and G. Loizou. Nurql: A nested universal relation query language. Information Systems, 14:307 – 316, 1989. [LL94] Mark Levene and George Loizou. The nested universal relation data model. Journal of Computer and System Sciences, 49:683 – 717, 1994. [LLS97] D. Laurent, V. Phan Luong, and N. Spyratos. The use of deleted tuples in database querying and updating. Acta Informatica, 34(12):905 – 925, 1997. [LW00] S.Nilakanta L. Wu, L. Miller. Design of data warehouses using metadata. Information and Software Technology, 2000. [MKS82] Sharon McCure Kuck and Yehoshua Sagiv. A universal relation database system implemented via the network model. In Proceedings 1st ACM SIGACT SIGMOD Symposium on Principles of Database Systems, Los Angeles, California, March 1982. [MM98] Francesco Mario Malvestuto and Marina Moscarini. A fast algorithm for query optimization in universal-relation databases. Journal of Computer and System Sciences, 56:299 – 309, 1998. [MU81] David Maier and Jeffrey D. Ullman. Maximal objects and the semantics of universal relation databases. Interim report, Department of Computer Science, Stanford University, Stanford, CA, October 1981. [MU82] David Maier and Jeffrey D. Ullman. Connections in acyclic hypergraphs - extended abstract. In Proceedings 1st ACM SIGACT SIGMOD Symposium on Principles of Database Systems, Los Angeles, California, March 1982. [MUV82] David Maier, Jeffrey D. Ullman, and Moshe Y. Vardi. The equivalence of universal relation definitions. Technical report, Department of Computer Science, Stanford University, Stanford, CA, October 1982. [Ora97] Oracle Corporation, Redwood Shores, California. Oracle8 T M SQL Reference Release 8.0, December 1997. [Ora01] Oracle Corporation. Oracle9i SQL Reference Release 1 (9.0.1), June 2001. [Rec97] Christine Reck. Poster on transparent access to a network of information sources and service providers via a universal relation interface. CoopIS, 1997. 89 [RH96] Christine Reck and Gerd Hillebrand. Implementing a universal relation interface using access scripts with binding patterns. Technical report, Universität Karlsruhe, 1996. [SW95] R. D. Semmel and R. P. Winkler. Integrating reengineered databases to support data fusion. J. Systems Software, 1995. [TA99] Riccardo Torlone and Paolo Atzeni. Efficient database updates with independent schemes. Siam Journal on Computing, 28(3):1112 – 1135, September 1999. [Ull82a] Jeffrey D. Ullman. Design of a universal relation database system. Annual report sept. 1981 - aug. 1982, Department of Computer Science, Stanford University, Stanford, CA, August 1982. [Ull82b] Jeffrey D. Ullman. Query processing in universal relation systems. Database Engineering, 5(3), September 1982. [Ull82c] Jeffrey D. Ullman. The U. R. strikes back. In Proceedings 1st ACM SIGACT SIGMOD Symposium on Principles of Database Systems, Los Angeles, California, March 1982. [Ull83] Jeffrey D. Ullman. Universal relation database systems. Annual report sept. 1982 - aug. 1983, Department of Computer Science, Stanford University, Stanford, CA, August 1983. [Var88] Moshe Y. Vardi. The universal-relation data model for logical independence. IEEE Software, 1988. [ZSC95] J. Leon Zhao, Arie Segev, and Abhirup Chatterjee. A universal relation approach to federated database management. In Proceedings of the Eleventh International Conference on Data Engineering, March 6-10, Taipei, Taiwan, 1995. 90 Danksagung Den Angehörigen des Instituts für Informatik, Fachgebiet Datenbanken und Informationssysteme (insbesondere meinem Betreuer Dr. Hans Hermann Brüggemann) danke ich für die fachliche und technische Betreuung meiner Arbeit. Ganz besonders meiner Lebensgefährtin Annette Jürgens möchte ich an dieser Stelle meinen tief empfundenen Dank für ihre moralische Unterstützung und Anteilnahme aussprechen. Dank geht auch an meine Eltern für ihre (nicht selbstverständliche) finanzielle Unterstützung, sowie meinem Bruder Thomas für Korrekturlesen und hilfreiche Diskussionen. 91 Erklärung Hiermit versichere ich, daß ich die vorliegende Arbeit und die zugehörige Implementierung selbstständig verfaßt und dabei nur die angegebenen Quellen und Hilfsmittel verwendet habe. Hannover, den 5. Oktober 2001 (Martin Boroske) 92