4104 Aufgabe 1 (25 Punkte) Ein relationales DBMS soll automatisch Änderungen an der Tabelle pruefungsergebnisse mit den Schlüsselspalten matrikelnr, datum, fachnr und der einzigen weiteren Spalte zensur protokollieren. Es soll festgehalten werden, wer wann welchen Datensatz wie ändert bzw. einfügt bzw. löscht. Beschreiben Sie das verwendete Konzept, wählen Sie die für das Protokoll notwendige Tabellenstruktur, die Rechte, die alle Benutzer an dieser Tabelle besitzen sollten und versuchen Sie, das Konzept auch als SQL-Anweisung weitgehend angemessen umzusetzen. Die Einträge können durch einen Trigger gespeichert werden. Trigger können dazu benutzt werden, zusammen mit Einschränkungen Integritätsregeln zu unterstützen, automatisch Datenkonvertierungen vorzunehmen, Warnungen zu erzeugen, Daten zugleich in andere Tabellen (z.B. aggregierte Werte) einzutragen usw. Veränderungen sind INSERT, UPDATE, DELETE. Die Rechtevergabe erfolgt durch die Anweisung GRANT: GRANT INSERT, UPDATE, DELETE ON pruefungsergebnisse TO benutzer1 Sollen die Rechte an alle Benutzer vergeben werden, so werden sie an public statt benutzer1 vergeben. CREATE TABLE demo_protokoll ( user CHARACTER (10), datum date, aenderung CHARACTER (6)) CREATE TRIGGER pruefungsergebnisse AFTER UPDATE, INSERT, DELETE ON demo oder or FOR EACH ROW WHEN INSERTED BEGIN INSERT INTO demo_protokoll VALUES (USER, CURRENT TIMESTAMP,"insert") END WHEN UPDATED BEGIN INSERT INTO demo_protokoll VALUES (USER, CURRENT TIMESTAMP,"update") END WHEN DELETED BEGIN INSERT INTO demo_protokoll VALUES (USER, CURRENT TIMESTAMP,"delete") END evtl. Achilles schicken, fragen, ob update, insert und delete-Trigger in einem geht. Aufgabe 2 (15 Punkte) Welche Vorteile bietet Hash als Zugriffsunterstützung, welche Nachteile sind mit dieser Methode verbunden? Hashing ist eine gut bekannte Technik für Direkt-Zugriffs–Dateien. Die Methode ist sehr einfach und die Zeit zum Wiederauffinden eines Datensatzes ist sehr gering. Grundoperationen, wie Einfügen und Löschen, sind keine aufwendigen und komplizierten Verfahren und können zur Laufzeit im Normalfall auch sehr schnell durchgeführt werden. Einer der großen Nachteile der statischen Hashverfahren ist die statische Speicherplatzverwaltung. Die Größe der Datei muss im Voraus bekannt sein oder beurteilt werden können, um einen physikalischen Speicher für die Datei zu reservieren. Die Größe 1 des bereitgestellten Speichers ist von einer festen Länge und kann nicht ohne Reorganisation des gesamten schon bestehenden Files verändert werden. Wenn die Speichernachfrage eines Files bei der Erstellung zu gering eingeschätzt wurde, dann gibt es zwangsläufig eine hohe Zahl von Overflow–Einträgen, was die Suche nach einem Record oder das Einfügen eines Records verlangsamt. Bei zu geringer Ausnutzung des Speichers wird andererseits Speicherplatz verschwendet. So kommen wir zu dem Schluß, dass es sehr schwer ist, eine angemessene Größe für ein File zu bestimmen, wenn die Größe dieses Files großen Schwankungen in der Anzahl der Records unterlegen ist, d.h. die Größe sehr dynamisch ist. Der schnelle Zugriff ist möglich dadurch, dass durch eine einfache Berechnung des Schlüssels (z.B. i mod 10) sofort zum Speicherplatz geführt wird. [http://www.informatik.uni-ulm.de/dbis/f&l/lehre/SS99/ProseminarSS99/dynamicHashing.pdf] Aufgabe 3 (15 Punkte) Sie sollen eine Anwendung erstellen, die große Datenmengen in einer relationalen DB verändert. Diese Anwendung kann nachts ohne weitere manuelle Eingriffe gefahren werden zu einer Zeit, wenn nur wenige weitere DB-Zugriffe erfolgen. Wie können Sie diese Anwendung gegen Deadlock schützen? Diskutieren Sie zunächst den Begriff "Deadlock". Wie kann ein Deadlock entstehen? Was bieten die DBMSe zum Schutz gegen Deadlock an? Wie müssen Sie diese Vorkehrungen einsetzen? Mit der Benutzung von Sperren ist ein Problem verbunden: wird in einer Transaktion ein Objekt verändert und damit gesperrt, so kann eine andere Transaktion auf dieses Objekt erst nach dem Ende der ersten Transaktion zugreifen. Was passiert aber, wenn eine andere Transaktion auch ein Objekt ändert und somit sperrt und wenn die Transaktionen wechselseitig auf die gesperrten Objekte der jeweils anderen Transaktion zugreifen wollen? Dies ist die typische Verklemmung, auch Deadlock genannt. Erst das Abbrechen einer der beteiligten Transaktionen mit der ROLLBACK-Anweisung gibt die vormals gesperrten Objekte wieder frei, die verbleibenden Transaktionen können nun weiterarbeiten. Die abgebrochene Transaktion muss zu einem späteren Zeitpunkt wiederholt werden. Normalerweise sind Sperrmechanismen nicht notwendig, da SQL die Sperren automatisch anfordert. Der Benutzer kann aber auch manuell Sperren setzen. Dies ist gerade bei umfangreichen Transaktionen sehr nützlich. Eine Sperre kann vom Benutzer durch die Anweisung LOCK TABLE table_name [IN EXCLUSIVE MODE | IN SHARE MODE] anfordern. Mit dem Zusatz IN EXCLUSIVE MODE ist Tabelle bis zur COMMIT- bzw. ROLLBACK-Anweisung für alle anderen Benutzer gesperrt. Soll die Tabelle hingegen nur zum Lesen gesperrt werden, so wird das bewirkt durch IN SHARE MODE. Gerade bei eingebetteten SQL-Anweisungen in Programmen, in denen lange Transaktionen aufgebaut werden, ist eine sorgfältige Prüfung des Zeitpunktes, zu dem die Sperren gesetzt werde, und eine Analyse, welche Sperren aufgebaut werden müssen, zwingend erforderlich. Zur schnelleren Ausführung der Abarbeitungen empfiehlen sich Batches. Zum Schutz gegen Deadlocks bieten die DBMS'e weiterhin das optimistische Synchronisationsverfahren an. Diese Systeme gehen von der Annahme aus, dass Konflikte zwischen Transaktionen seltene Ereignisse darstellen und somit das präventive Sperren der Objekte unnötigen Aufwand verursacht. Daher greifen diese Verfahren zunächst nicht in den Ablauf einer Transaktion ein, sondern erlauben ein nahezu beliebig paralleles Arbeiten auf der Datenbank. Erst bei Transaktionende wird überprüft, ob Konflikte mit anderen Transaktionen aufgetreten sind. Gemäß dieser Vorgehensweise unterteilt man die Ausführung einer Transaktion in drei Phasen: - Lesephase - Validierungsphase 2 - Schreibphase In der Lesephase wird die eigentliche Transaktionsverarbeitung vorgenommen, d.h. es werden Objekte der Datenbank gelesen und modifiziert. Jede Transaktion führt dabei ihre Änderungen auf private Kopien in einem ihr zugeordneten Transaktionspuffer durch, der für keine andere Transaktion zugänglich ist. Validierungsphase Im Gegensatz zu Sperrverfahren, bei denen Blockierungen das primäre Mittel zur Behandlung von Synchronisationskonflikten sind, werden hier Konflikte stets durch Zurücksetzen einer oder mehrerer beteiligter Transaktionen aufgelöst. Es ist so mit mehr Rücksetzungen als bei Sperrverfahren zu rechnen; andererseits können bei optimistischen Verfahren keine Deadlocks entstehen. Hat die Transaktion die Validierungsphase erfolgreich durchlaufen - und nur in diesem Falle - werden die gepufferten Änderungen zurückgeschrieben; Schreibphase! Dadurch werden die Änderungen für andere Transaktionen erst sichtbar. Aufgabe 4 (25Punkte) Eine kleine Firma betreibt eine verteilte Datenbank. Das Lager ist auf zwei Orte aufgeteilt, die Lagerverwaltung wird durch die Datenbank unterstützt. Die Arbeitsvorbereitung muss genau so wie die Abteilung Einkauf lesend auf diese Daten zugreifen können. Alle vier Stellen sind örtlich getrennt und betreiben auf vernetzten Rechnern Datenbankknoten. Während lesende und ändernde Zugriffe in den Lagern sehr hoch sind, ist in der Arbeitsvorbereitung zwar mit hohen lesenden, jedoch wenigen ändernden Zugriffen zu rechnen, im Einkauf nur mit seltenen lesenden Zugriffen. Schlagen Sie Maßnahmen zur Verteilung der Daten vor und begründen Sie Ihre Aussagen. Daten dort speichern, wo die meiste Bewegung ist. Lagerverwaltung als Server. 2 Tabellen, die zum Gesamt-Lager zusammengeführt werden. Punkt Verteilung Vordergründig kann als Entwicklungsziel angesehen werden, die Fragementation und Allokation so zu gestalten, dass bei der geplanten Applikation ein möglichst geringer Datenstrom das Netz belastet, da in der Regel das Netz der limitierende Faktor sein wird. Faktoren: Art und Häufigkeit der Transaktionen an den verschiedenen Datenbankknoten, die aufgrund der Transaktionen an den einzelnen Datenbankknoten benötigten Daten – insbesondere auch Tabellenteile limitierende Faktoren eines bestimmten Knotens: CPU-Leistung, Auslastung und Größe des Hauptspeichers und Plattenplatz, die Geschwindigkeit der Netzverbindungen, die Zuverlässigkeit der Netzverbindungen, Konsequenzen bei Ausfall eines bestimmten Knotens Unterstützung der Einhaltung von Integritätsregeln bei verteilten Daten Unterstützung verteilter Anfragen durch das VDBMS, insbesondere die Frage, ob das verwendete VDBMS es erlaubt, dass Transaktionen automatisch Subtransaktionen an entfernten Knoten starten können. Punkt Replikation Replikation verstößt gegen das Prinzip der Redundanzfreiheit. Man muss sich also fragen, welche Gründe für eine Replikation bei verteilten DB-Anwendungen sprechen, d. h. für eine redundante Datenhaltung, bei der Änderungen an die Knoten (transparent für den Benutzer durch die beteiligten DBMS) weitergegeben werden. Im wesentlichen sprechen folgende Gründe dafür: die Lokalität von Anwendungen kann gewahrt bleiben, wenn alle Daten, die die Anwendungen brauchen, vor Ort vorhanden sind; damit entfällt der langsame Zugriff übers Netz, 3 - - die Verfügbarkeit des Gesamtsystems wird erhöht; auch wenn ein Knoten ausfällt, können die Anwendungen auf den anderen Knoten weiterlaufen, da die benötigten Daten repliziert sind, die Performance des Gesamtsystems wird erhöht, da die Lese- und Schreibzugriffe entzerrt werden (können) Eine Aenderung dauert um ein Mehrfaches laenger als in einer lokalen Datenbank. Deshalb gilt die Regel, dass nur Daten mit geringer Aenderungshaeufigkeit fuer eine redundante Speicherung (Replikation) geeignet sind. Aufgabe 5 (25 Punkte) An einer Tabelle demo mit den Spalten regal, ebene, fach, material, anzahl sollen wiederholt innerhalb eines Programmlaufes bei vorgegebenen Werten für den Primärschlüssel regal, ebene, fach Änderungen an der Anzahl oder auch an den Werten material, anzahl vorgenommen werden sowie bei vorgegebenem Material die zugehörige Gesamtanzahl oder die Orte, an denen das Material vorkommt, bestimmt werden. Dazu soll eine Java-Anwendung erstellt werden. Ihre Aufgabe ist es, die wesentlichen Konzepte zu diskutieren sowie die Anwendung in ihren Grundzügen zu skizzieren. Schnittstelle JDBC: Da häufig dieselben Anfragen und Änderungen durchgeführt werden, empfiehlt sich die wiederkehrenden SQL-Befehle in PreparedStatements zu formulieren. Der SQL-String wird genau ein Mal vom Datenbanksystem geparst und auf seine Korrektheit geprüft. Bei jeder Anfrage oder Änderung wird der Befehl nur noch mit konkreten Werten gefüllt. Class.forName("jdbc.TreiberName"); Connection conn = DriverManager (url, "userid", "passwort"); PreparedStatement aendereDemo = conn.prepareStatement( "UPDATE demo " + "SET material = ? anzahl = ?" + WHERE regal = ? AND ebene = ? AND fach = ? //Parameter mit Werten belegen aendereDemo.setString (1, "Schrauben"); aendereDemo.setInt (2, 300); aendereDemo.setString (3, "Hochregal"); aendereDemo.setString (4, "5"); aendereDemo.setString (5, "07"); //update ausführen int n = aendereDemo.executeUpdate(); -------------------------------------------------------PreparedStatement bestimmeDemo = conn.prepareStatement( "SELECT SUM(anzahl) "+ "FROM demo" + "WHERE Material = ?"); //Parameter 1 bestimmen bestimmeDemo.setString(1, "Schrauben"); //SELECT ausführen ResultSet ergebnisse = bestimmeDemo.executeQuery(); -------------------------------------------------------PreparedStatement bestimmeDemo = conn.prepareStatement( 4 "SELECT * FROM demo" + "WHERE Material = ?"); //Parameter 1 bestimmen bestimmeDemo.setString(1, "Schrauben"); //SELECT ausführen ResultSet ergebnisse = bestimmeDemo.executeQuery(); -------------------------------------------------------//Auslesen der ergebnisse while(ergebnisse.next()) int gesamtanzahl = ergebnisse.getInt(1); ??? System.out.println(gesamtanzahl); -------------------------------------------------------while (ergebnisse.next()) String regal = ergebnisse.getString("regal"); String ebene = ergebnisse.getString("ebene"); String fach = ergebnisse.getString("fach"); System.out.println(regal +"; "+ ebene +"; "+fach); Aufgabe 6 (25 Punkte) Es gilt die gleiche Problematik wie in der vorherstehenden Aufgabe. Diesmal soll die Lösung jedoch mit Embedded SQL erfolgen. Ihre Aufgabe ist es, die wesentlichen Konzepte zu diskutieren sowie die Anwendung in ihren Grundzügen zu skizzieren. An einer Tabelle demo mit den Spalten regal, ebene, fach, material, anzahl sollen wiederholt innerhalb eines Programmlaufes bei vorgegebenen Werten für den Primärschlüssel regal, ebene, fach Änderungen an der Anzahl oder auch an den Werten material, anzahl vorgenommen werden sowie bei vorgegebenem Material die zugehörige Gesamtanzahl oder die Orte, an denen das Material vorkommt, bestimmt werden. Sollen SQL-Anweisungen im Quelltext eingebettet werden, so muss ein Precompiler verwendet werden, um daraus den entsprechenden Code zu generieren, der anschließend vom Compiler verarbeitet werden kann. Die Einleitung (EXEC SQL) sowie das Endekennzeichen (;) der SQL-Anweisung sind sprachabhängig. Um Datenübertragungen zwischen SQL und Hostsprache möglich zu machen, werden Hostvariablen angelegt. Der Precompiler erkennt sie durch denjenigen Programmabschnitt, der durch BEGIN DECLARE SECTION eingeleitet wird und durch END DECLARE SECTION beendet wird. Der Precompiler bearbeitet die Programmdatei mit den eingebetteten SQL-Anweisungen sequentiell. Trifft er auf eine SQL-Anweisung, die er aufgrund der Einleitung erkennt, so liest er zunächst die gesamte SQL-Anweisung bis zum Endekennzeichen ein und überprüft sie in Zusammenhang mit dem Datenbanksystem. Die Aufgaben des Precompiler sind: Syntaktische Prüfung der eingebetteten SQL-Anweisungen (durch Übermittlung an das DBMS, das die Prüfung soweit möglich vorab vollzieht) Logische Überprüfung der eingebetteten SQL-Anweisungen (ebenfalls durch das DBMS): sind alle verwendeten Objekte (Tabellen, Indexe, Views usw.) vorhanden? Rechteüberprüfung, soweit zur Übersetzungszeit möglich derjenige, der das Programm ausführt, ist in der Regel nicht derselbe, der das Programm erstellt und übersetzt. Ermittlung des optimalen Zugriffspfades und Speicherung in der DB dies ist stark abhängig vom jeweiligen DBMS; eine Optimierung zur Übersetzungszeit beschleunigt die Programmausführung solange die Objekte und die Verteilung der Daten einigermaßen stabil bleiben; treten hier jedoch stärkere Schwankungen auf, so sind Optimierungen zur Laufzeit trotz der anfallenden Kosten günstiger. 5 Übersetzung der eingebetteten SQL-Anweisungen in die entsprechenden Quellcode-Anweisungen. Da die Änderungen während des Programmlaufes erfolgen sollen, ist dynamisches SQL einzusetzen. Möglich wäre z.B. eine interaktive Oberfläche in der die Änderungen vom Benutzer eingegeben werden. Embedded SQL setzt aber normalerweise voraus, dass alle Variablen während der Programmierung festgelegt wurden. Es müssen daher Methoden bereitgestellt werden, Anweisungen, deren Quelltext erst während der Programmausführung ermittelt wird, an das DBMS zu übergeben und ausführen zu lassen. Die Ermittlung eines Zugriffspfades durch den Precompiler ist ausgeschlossen, da der Wert nicht vor der Übersetzungszeit bekannt ist. Die Überprüfung der Syntax sowie der Zugriffsrecht und Ermittlung des Zugriffspfades müssen vom DBMS während der Laufzeit ausgeführt werden. Zusätzlich sollen die Änderungen wiederholt möglich sein, d.h. dynamisch wird eine SQLAnweisung erzeugt, die ggf. Ein- oder Ausgabevariablen enthalten und mehrfach aufgerufen werden soll. In diesem Fall muss die Vorbereitung von der Ausführung getrennt werden. Hierzu sind die Anweisungen PREPARE zur Vorbereitung, EXECUTE zur Ausführung und DELLOCATE PREPARE zur Freigabe der Ressourcen vorgesehen. EXEC SQL BEGIN DECLARE SECTION; material char(10); anzahl Int; regal char(10); ebene char(10); fach char(10); sumanzahl Int; prep char(18); descriptorOut char(18); descriptorIn char(18); c1 char(18); satz char(512); EXEC SQL END DECLARE SECTION; … EXEC SQL UPDATE demo ' SET material = :material anzahl = :anzahl WHERE regal = :regal AND ebene = :ebene AND fach = :fach; satz = "SELECT material, anzahl, regal, ebene, fach FROM demo where material = ?"; EXEC SQL PREPARE prep FROM :satz; EXEC SQL DECLARE c1 CURSOR FOR prep; //Anlegen Descriptoren EXEC SQL ALLOCATE DESCRIPTOR :descriptorOut; EXEC SQL ALLOCATE DESCRIPTOR :descriptorIn //Initialisieren Descriptoren EXEC SQL DESCRIBE OUTPUT prep USING SQL DESCRIPTOR :descriptorOut; EXEC SQL DESCRIBE INPUT prep USING SQL DESCRIPTOR :descriptorIn; //die Eingabewerte in Descriptor Area füllen material = "Schrauben"; EXEC SQL SET DESCRIPTOR :descriptorIn COUNT = 1; EXEC SQL SET DESCRIPTOR :descriptorIn VALUE 1 TYPE 4??? 6 EXEC SQL SET DESCRIPTOR :descriptorIn VALUE 1 DATA = :material; //Cursor öffnen und einlesen EXEC SQL OPEN c1 USING SQL DESCRIPTOR descriptorIn /* Lese- und Verarbeitungsschleife mit: */ EXEC SQL FETCH c1 INTO SQL DESCRIPTOR descriptorOut; EXEC SQL GET DESCRIPTOR descriptorOut VALUE 1 :material = EXEC SQL GET DESCRIPTOR descriptorOut VALUE 2 :anzahl = EXEC SQL GET DESCRIPTOR descriptorOut VALUE 3 :regal = EXEC SQL GET DESCRIPTOR descriptorOut VALUE 4 :ebene = EXEC SQL GET DESCRIPTOR descriptorOut VALUE 5 :fach = ; ... ; /* Ende der Lese- und Verarbeitungsschleife */ EXEC SQL CLOSE c1; EXEC SQL DEALLOCATE PREPARE : prep; EXEC SQL DEALLOCATE DESCRIPTOR descriptorOut; EXEC SQL DEALLOCATE DESCRIPTOR descriptorIn; EXEC SQL DATA, DATA, DATA, DATA, DATA, Eine mit PREPARE aufbereitete Anweisung wird mit EXECUTE zur Ausführung gebracht. Dabei sind Ein- und Ausgabevariablen an die positionalen Parameter zu übergeben. Was muss geschehen, um z.B. eine mit einem Cursor verbundene dynamisch erzeugte SELECT-Anweisung auszuführen? Das Problem hierbei ist, dass die Struktur der Ergebnistabelle und damit die Struktur der FETCH-Anweisung erst zur Laufzeit bekannt ist. In diesem Fall muss die durch PREPARE vorbereitete SQL-Anweisung mittels DESCRIBE ausgewertet und ein "Descriptor" erstellt werden, der dann für die Umsetzung und Auswertung der Struktur verwendet werden kann. Mit ALLOCATE DESCRIPTOR wird im Programm ein Speicherbereich reserviert, der der Kommunikation zwischen Programm und DBMS dient. Dieser Speicherbereich besteht im wesentlichen aus einem Zähler, der die Anzahl der folgenden Datenstrukturen angibt, sowie einem Array von Datenstrukturen, wobei jede Datenstruktur einen Wert – z.B. eine Spalte einer Ergebniszeile oder einer Hostvariablen – übertragen kann. Jede Datenstruktur enthält zumindest folgende Information, wobei nicht alle Informationen in jedem Falle gültige Informationen tragen: NAME enthält als Zeichenkette den Spaltennamen UNNAMED ist 1, falls die Spalte unbenannt ist, 0 sonst TYPE spezifiziert den übertragenen Datentyp LENGTH gibt die Länge an DATA enthält die übertragenen Daten PRECISION gibt bei Zahlentypen die "Precision" an SCALE beschreibt bei Zahltypen die "Scale" INDICATOR ist negativ, falls der NULL-Wert übertragen wurde Um den Deskriptor zu initialisieren, wird die Anweisung DESCRIBE OUTPUT prep_name USING SQL DESCRIPTOR desc_name aufgerufen. Damit wird Anzahl der Spalten sowie die Datentypen ermittelt. Mit jedem FETCH ... INTO SQLDESCRIPTOR desc_name wird die entsprechende Zeile aus der Ergebnistabelle ausgelesen und die Werte in die Felder DATA und INDICATOR in den entsprechenden Datenstrukturen des Descriptors gefüllt. Dann können sie mit entsprechenden GET DESCRIPTOR-Anweisungen ausgelesen werden. 7 Aufgabe 7 (20 Punkte) Wozu dient die als Optimizer bezeichnete Komponente in einem DBMS? Zunächst waren die Optimizer regelbasiert aufgebaut, inzwischen arbeiten viele Optimizer kostenbasiert. Wie läßt sich das Ergebnis eines regelbasierten Optimizers beeinflussen? Diskutieren Sie, was typischerweise in die Entscheidungen mit einfließt. Die Aufgabe des Optimizers ist es, bei einer SQL-Anweisung den "besten" Zugriffspfad auf die in der Datenbank gespeicherten Daten zu ermitteln. Hierzu verwenden die Hersteller Informationen, die spezifisch für ihre jeweiligen DBMS sind. Die Qualität der Optimizer ist in den letzten Jahren wesentlich gestiegen. ermöglichen eine effiziente Ausführung der Anfragen durch das DBMS Beispiel: Finde einen Relationenalgebra-Ausdruck, der äquivalent ist ("das gleiche Ergebnis liefert") zu einem vorgegebenen, der aber effizienter auszuwerten ist. Eine Möglichkeit der Optimierung ist die sogenannte algebraische Optimierung. Hierbei werden Algebra-Ausdrücke nach "Rechenregeln" in äquivalente Ausdrücke umgeformt Es gibt regel- und kostenbasierte Optimizer. Regelbasierte Optimizer versuchen im wesentlichen aufgrund von Regeln einen guten Zugriffspfad zu ermitteln; kostenbasierte Optimizer versuchen hingegen, möglichst viele Strategien anhand der entstehenden I/O-, Speicher-, Transport- und CPU-"Kosten" zu bewerten und die kostengünstigste Strategie zu ermitteln. Um dem Optimizer zu helfen, können neben den oben erwähnten Überlegungen typischerweise noch Hilfen angegeben werden. So ermöglicht es Oracle, dem Optimizer einen HINT – einen Vorschlag – mitzugeben, gewisse Aspekte besonders zu beachten, IBM in dem Produkt DB2, durch die Anweisung SET CURRENT QUERY OPTIMIZATION nr den Optimizer mehr oder weniger Zugriffspfade bewerten zu lassen. Optimierungspunkte (manuell), Hinderungspunkte des Optimizers: Angaben von Spaltennamen in der Select-Anweisung statt select * Problematische SQL-Anfragen, Umformulierungen besser? Verwendung von LIKE, Suche nach Bruchstücken zu vermeiden (z.B. "%110") Unsinnige Verwendung des Index OR-Prädikat, evtl. OR durch UNION ersetzen Verneinung, möglichst vermeiden Falsche Datentypen, Index wird vom Optimizer nicht gesetzt, da Typ nicht klar ist Verwendung von Null, verhindert Einsatz Index Reihenfolge in der WHERE-Klausel, Tabellen mit den meisten Trefferzeilen vorn Benutzung von DISTINCT, Sortierung ist zu vermeiden Unteranfragen, möglichst Einsatz von JOIN Qualifizierung von Namen, keine zusätzliche Ermittlung der Tabelle zu den Spaltennamen Mehrspaltige Indexe, Index genau wie where-Bedingung(mehrere Bedingungen) formulieren Aufgabe 8 (15 Punkte) Warum ist der objekt-relationale Ansatz von Oracle nicht objekt-orientiert zu nennen? Oracle weist schon einige Merkmale des objektorientierten Ansatzes auf, ist aber immer noch kompatibel zu älteren SQL-Versionen. Die Erweiterung von Oracle hinsichtlich des objektorientierten Ansatzes sind: Konzept benutzerdefinierter Datentypen (ADT) 8 Funktionen der ADT werden analog zu Methoden durch das DBMS verwaltet Tupeltypen (row) auf ADT ist Subtypkonzept mit Vererbung realisiert Redefinition von Attributen und Funktionen ist erlaubt Typkonstruktoren list, set, multiset nicht-atomare Wertebereiche für Attribute, können zusammen mit row verwendet werden Identifikatoren können für Tupel vergeben werden und können als Referenzen verwendet werden Allerdings besitzt Oracle keine Möglichkeit Attribute zu vererben und ist auf einen Kollektionstyp (Tabelle) beschränkt. Das eigentliche Konstrukt ist trotz vieler objektorientierter Konzepte im Datenbankmodell (z.B. Tabellenhierarchie, Methoden, Vererbung von Strukturen und Methoden) immer noch die Relation oder Tabelle. ... "Unterstützt ein System komplexe Daten und Anfragen, so ist es objektrelational. Unterstützt ein System komplexe Daten, aber keine Anfragen, so ist es objektorientiert. " nach Stonebraker Muss-Kriterien für objektorientierte Datenbanksysteme sind: Typkonstruktoren Objektidentität Strukturvererbung generischer Operationenteil Methoden Vererbung Overriding 9