4101 Aufgabe 2 (35 Punkte) Was ist die Aufgabe des Optimizers in einem DBMS? Beschreiben Sie verschiedene Ansätze für die Arbeitsweise eines Optimizers. Wie vermeiden verschiedene DBMSe, dass diese Komponente unnötig oft aufgerufen wird? 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 versuche 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. Unnötige Aufrufe des Optimizers können verhindert werden, indem man dynamische SQLAnweisungen mit einer Prepare nur einmal den Zugriffspfad vom Precompiler ermittelen lässt und sie danach mit execute ausführt. Der Zugriffspfad wird gespeichert. Aufgabe 4 (25Punkte) In einem relationalen DBMS soll jede Änderung an einer Tabelle demo protokolliert werden. Dabei soll der ändernde Benutzer, Datum und Zeit sowie die Art der Änderung (als INSERT, UPDATE, DELETE) in eine entsprechend strukturierte Tabelle demo_protokoll eingetragen werden. Wie müsste die Struktur der Tabelle demo_protokoll aussehen, wie könnten die Einträge bewirkt werden? Die Einträge können durch einen Trigger bewirkt 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. CREATE TABLE demo_protokoll ( user CHARACTER (10), datum date, aenderung CHARACTER (6)) CREATE TRIGGER protokoll 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 Seite 1 von 6 BEGIN INSERT INTO demo_protokoll VALUES (USER, CURRENT TIMESTAMP,"delete") END Ich glaub nicht das man insert,update und Delete in einem Trigger zusammen benutzen kann. CREATE TRIGGER protokoll_update AFTER UPDATE ON demo FOR EACH ROW BEGIN INSERT INTO demo_protokoll VALUES (USER, CURRENT TIMESTAMP,"update") END und das gleiche dann für insert und delete Aufgabe 5 (15 Punkte) Aus einer Tabelle tab mit den Spalten nr, fach, regal (Integer) und ware (Character) sollen in einer JavaApplikation mittels JDBC alle Zeilen mit nr 10 ausgelesen werden. Skizzieren Sie diesen Aspekt der Java-Applikation. Bevor eine Verbindung aufgebaut werden kann, muss der gewünschte Treiber geladen werden. Dies erfolgt z.B. über den Aufruf Class.forName("jdbc.TreiberName"); Die Methode forName sucht, lädt und bindet die über den Namen angegebene Klasse jdbc.TreiberName ein. Connection verbindung = DriverManager(url, "userid", "passwort"); Statement anweisung = verbindung.createStatement(); ResultSet ergebnisse = anweisung.executeQuery ("SELECT * FROM tab WHERE nr = 10") Aufgabe 6 (20 Punkte) Was sind aus Ihrer Sicht die wesentlichen Unterschiede zwischen Embedded SQL und JDBC? JDBC ist eine Java-basierte Schnittstelle, die mit Hilfe der CLI –Schnittstelle eine Übersetzung der SQL- Anweisungen während der Laufzeit durch die DBMS ermöglicht. Inkonsistenzen zwischen der Hostsprach und SQL treten im Gegensatz zu Embedded SQL nicht mehr auf. JDBC ist portabel und kann auf unterschiedliche DB-Systeme angewendet werden. Der gleichzeitige Zugriff auf mehrere DBMS ist mit DRDA möglich. Während bei Embedded SQL eine DB Verbindung mkit einem Einfachen CONNECT erfolgt, muss bei JDBC zunächst ein Treiber geladen um eine Verbindung zum DBMS herzustellen. Über die URL der Datenbank findet der DriverManager den passenden JDBCTreiber. Der DriverManager ist eine Fabrikklasse die alle geladenen Treiber verwaltet. Er erzeugt ein Connection-Objekt, das die Datenbankverbindung repräsentiert. Alle SQLBefehle werden über dieses Objekt dynamisch gegen die Datenbank abgesetzt. Es wird ein Statement-Objekt erzeugt, das die Versendung übernimmt. Für Anfragen und Änderungen Seite 2 von 6 stellt das Statement-Interface die Methoden executeQuery und executeUpdate zur Verfügung Embedded SQL verwendet einen Precompiler, die SQL-Anweisungen sind im Quelltext eingebettet. Der Precompiler generiert aus diesem Text den entsprechenden Code, der anschließend vom Compiler verarbeitet werden kann. Die Einleitung ist EXEC SQL und das Endekennzeichen ";". Aufgabe 7 (15 Punkte) Welche Aufgabe hat die LOCK-Anweisung in einem DBMS? Warum fordert der SQL-Standard diese Anweisung nicht? Will der Benutzer selbst Sperren anfordern, so muss er sich der Lock-Anweisung bedienen. Soll z.B. die Tabelle lager zum Schreiben gesperrt werden – weil viele Einfügen und Änderungen vorzunehmen sind - , so lautet die Anweisung LOCK TABLE lager IN EXCLUSIVE MODE und lager ist bis zur nächsten Commit- bzw. Rollback-Anweisung für alle anderer Benutzer gesperrt. Soll die Tabelle hingegen nur zum Lesen gesperrt werden, so wird das bewirkt durch LOCK TABLE lager IN SHARE MODE Da SQL automatisch Sperren anfordert, liegt der Vorteil einer expliziten Anforderung von Sperren darin, dass in besonders gelagerten Fällen der Aufwand des Datenbanksystems, viele Sperren aufzubauen, durch eine übergreifende Sperren-Anforderung verringert werden kann. In einer Einbettung von SQL-Anweisungen in ein Programm kann der Programmierer damit sicherstellen, dass die Transaktion immer beendet werden kann (Zwei-PhasenProtokoll mit Preclaiming und Sperren bis EOT), indem er rechtzeitig explizit Sperren setzt. Diese Vorgehensweise behindert andererseits alle anderen Benutzer und Programme, da der Parallelisierung durch die Sperren reduziert wird. Sperrmechanismen sind nicht notwendig, da das DBMS für den Benutzer transparent die notwendigen Sperren setzen und freigeben muss, um die Integrität von Transaktionen zu garantieren. Dennoch gibt es gute Gründe dafür, dem Benutzer zu ermöglichen, Sperren zu setzen. Diese treten in der Regel nur bei umfangreichen Transaktionen zutage: durch das Anfordern der nötigen Sperren kann ein Deadlock vermieden werden; es kann garantiert werden, dass Batch-Arbeiten ungestört zum Abschluss kommen, je nach Implementation des Sperr-Managers kann eine Sperr-Eskalation vermieden werden, d.h. es werden zunächst viele Objekte feiner Granularität gesperrt, bis der Sperr-Manager "erkennt", dass wenige Sperren größerer Granularität effektiver sind. Granularität bedeutet, dass von atomaren Werten bis hin zu gesamten Klassenhierarchie unterschiedlich viele und unterschiedlich große Daten und Objekte gesperrt werden können [Heuer, Objektorientierte Datenbanken] je nach Implementation kann dadurch die Anzahl der Aufrufe des Sperr-Managers reduziert werden. [Achilles, SQL, 232] Aufgabe 8 (25 Punkte) Was ist Replikation? Wie wird Replikation in gängigen RDBMS eingesetzt? Replikation bedeutet, dass ein Datenobjekt mehrfach gespeichert wird. Dies steht im Widerspruch zur Redundanzfreiheit der Datenbasis: jeder Fakt wird genau einmal gespeichert. Der Grund für Replikation liegt in dem Ziel der besseren Erreichbarkeit von Daten. Replikation - oder das Verlassen des Grundsatzes der Redundanzfreiheit - kann Seite 3 von 6 auch bei einem zentralen DBMS benutzt werden, um die Performance zu steigern: Daten, auf die von vielen Anwendungen "parallel" üblicherweise nur lesend zugegriffen wird, können z.B. mehrfach gespeichert werden. Eine besondere Rolle spielt Replikation aber in verteilten DBMS. Wird in einem verteilten DBMS in einer Transaktion auf Datenobjekte zugegriffen, die auf einem entfernten Rechner liegen, so treten folgende Probleme auf: In der Regel hat man mit einer - im Vergleich zu den übrigen Operationen langsamen Verbindung zu tun, es muss eine Kommunikation zwischen den Rechnern aufgebaut werden, die Transaktion dauert lange: die Daten sind "schwer" erreichbar. Zusätzlich kann noch der entfernte Rechner stark belastet sein, was ebenfalls die Daten schlecht erreichbar macht. Ist die Verbindung zusammengebrochen, so kann die Transaktion nicht durchgeführt werden: die Daten sind nicht erreichbar. Als Vorteil ist jedoch anzusehen, dass die Transaktion immer aktuelle Daten erhält. Will man nur lesend auf die entfernten Daten zugreifen, so wäre häufig schon damit gedient, eine (ggf. nicht ganz aktuelle) Kopie der Daten lokal zu besitzen. Dann könnte direkt in dieser Kopie gelesen werden, die obigen Probleme entfallen: die Zugriffsgeschwindigkeit wird (in der Regel) wesentlich verbessert, die Zuverlässigkeit ebenfalls. Die entstehenden Probleme sind einerseits beanspruchter Plattenplatz (in der Regel ein unwichtiges Argument) sowie die Verletzung der Redundanzfreiheit. Dies ist ein Grund, weswegen das Verteilungsschema sorgfältig durchdacht und geplant werden muss. Ein weiterer Grund wird in der folgenden Überlegung deutlich. Wird auf einem Knoten ein Replikat einer Tabelle angelegt, so nimmt die Verfügbarkeit der Daten bei lesenden Transaktionen offensichtlich zu, das gesamte System wird gegenüber Ausfällen stabiler. Ganz anders wirken sich hier Änderungstransaktionen aus: da jede weitere Komponente die Ausfallwahrscheinlichkeit für das Gesamtsystem erhöht, eine Änderung bei allen Replikationen im Prinzip "gleichzeitig" durchgeführt werden muss, treten offensichtlich mit einer Erhöhung der Anzahl an Replikaten in diesem Falle Probleme auf, die Aktualität der Daten sinkt. Oracle: Basic Replication: Änderung auf Primärtabelle, Datenverteilung asynchron auf Replikate Replikate als Snapshot der Primärtabelle Änderungs-LOG der Primärtabelle wird benutzt, um die Änderungen zu propagieren entspricht dem Primary Copy Als Basic Replication wird in Oracle die letzte Version bezeichnet. Die Änderungen erfolgen ausschließlich auf einer Primärtabelle, die Daten werden asynchron auf mehrere Kopien repliziert. Eine Kopie wird zunächst als ein Snapshot der Primärtabelle angelegt, die folgenden Änderungen können entweder als Snapshot durchgeführt werden, was in der Regel aufgrund des zu übermittelnden Datenvolumens sehr kritisch ist, oder als "Fast-Refresh". Bei diesem Verfahren wird aus dem Seite 4 von 6 Änderungs-LOG der Primärtabelle abgeleitet, welche Änderungen an die Kopien zu übermitteln sind. [Achilles, SQL] Advanced Replication Symmetrische Replikation mit asynchroner Aktualisierung alle Replikate sind gleichberechtigt, Änderungen werden an alle übrigen Replikate asynchron weitergereicht keine Behandlung des DELETE-Konfliktes Symmetrische Replikation von Tabellen wird in Oracle "Advanced Replication" genannt. Dieses Vorgehen entspricht der asynchronen symmetrischen Aktualisierung: alle Kopien sind gleichberechtigt, die Änderungen werden an alle Kopien weitergereicht. eine Behandlung des DELETE-Konflikts ist nicht vorgesehen. [Achilles, SQL] Änderbare Snapshots Variante der Beiden vorhergehenden Arten: Primärtabelle verteilt weiterhin die Änderungen asynchron an alle Replikate, Replikate richten die Änderungsmitteilung mit Hilfe des INSTEAD OF-Triggers an die Primärtabelle Änderbare Snapshots einer Primärtabelle. Hier handelst es sich um eine Variante beider vorhergehenden Arten: die Primärtabelle verteilt weiterhin die Änderungen an alle Kopien, die Kopien richten mit Hilfe des INSTEAD OF-Triggers die Änderungsmitteilungen an die Primärtabelle. [Achilles, SQL] Symmetrische synchrone Aktualisierung: (ROWA) ist nicht vorgesehen DB2: Replikationen werden durch den DataPropagatorRelational ermöglicht. Dieses Produkt überwacht die Änderungen an Quelltabellen und schreibt diese Änderungen in eine eigene Datenstruktur, von der aus sie nach bestimmten Zeiten oder auf Anforderung an die Kopien weiter verteilt werden. Real-Time Data Replication zur synchronen Aktualisierung innerhalb der Transaktionsgrenzen muss durch Trigger und gespeicherte Prozeduren implementiert werden. [Achilles, SQL] Asynchrone Aktualisierung unter Einsatz einer Primärtabelle: es werden nur transaktions-konsistente, aber nicht transaktions-basierte Änderungen verteilt Verringerung der Netzbelastung, indem zwischen zwei Replikationszeiten Änderungen zusammengefasst werden Seite 5 von 6 Bei dieser Form werden nur transaktionskonsistente, aber nicht transaktionsbasierte Änderungen verteilt. Der Unterschied liegt darin, dass Änderungen hinsichtlich eines Records, die sich zwischen zwei Replikationszeiten befinden, zu einer Änderung zusammengefasst werden, um so die Netzbelastung zu verringern. [Achilles, SQL] Transaktions-basierte asynchrone Aktualisierung unter Einsatz einer Primärtabelle Primary Copy Asynchrone Aktualisierung unter Einsatz einer Primärtabelle mit änderbaren Kopien sowohl Replikate als auch Primärtabelle erzeugen Änderungsmitteilungen, Änderungsmitteilungen der Replikate gehen an Primärtabelle, die auf Konsistenz überprüft, Primärtabelle übernimmt Verteilung Hier erzeugen sowohl die Kopien als auch die Primärtabelle Änderungsmitteilungen, die transaktionsbasiert sind. Die Änderungsmitteilungen der Kopien richten sich an die Primärtabelle, von der aus sie allen anderen Kopien zur Verfügung stehen. Bei der Übernahme der Änderungsmeldungen von Kopien wird auf Dateninkonsistenz überprüft. [Achilles, SQL] Symmetrische synchrone Aktualisierung: (ROWA) ist nicht vorgesehen Seite 6 von 6