Theme 1 Theme 3 Theme 4 Theme 5 Theme 7
Home Impressum Print  
 
Relationale Sprachen

Kapitel 5 - Codd Vollständige relationale Sprachen

  • Allgemeines zur Relationenalgebra
  • Unterschiede zum Relationenkalkül
  • SQL als relationale Sprache
  • Details zu SQL und Implementierungen
  • Wie kann intern die Anfrage optimiert werden?
  • Was wird bei Ausführung einer Anfrage alles getan?
  • Wie können Datenbanken optimiert werden?

Welche zwei Schnittstellen zu Datenbanken gibt es?

Prozedurale Sprachen
  • Sie erlauben leichte Abbildung der DML-Befehle auf interne Satzoperationen des DBMS
  • Verantwortung für die Zugriffspfadauswahl liegt beim Programmierer
  • er bestimmt die Art und Reihenfolge der Zugriffe durch Navigation
  • Bei der Übersetzung sind lediglich Namensauflösung und Formatkonversionen erforderlich
Deskriptive Sprachen erfordern:
  • Überprüfung auf syntaktische Korrektheit durch einen Parser(komplexere Syntax)
  • Überprüfung von Zugriffsberechtigung und Integritätsbedingungen
  • Anfrageoptimierung zur Erzeugung einer effizient ausführbaren Folge interner DBMS-Operationen

Somit ist bei deskriptiven Anfragesystemem im wesentlichen der Anfrageübersetzer und Optimierer des DBMS für eine effiziente Abarbeitung verantwortlich und nicht der Programmierer, wie bei prozeduraler Anfrage.

Hohe Komplexität der Übersetzung, da die Auswahlmächtigkeit
  • an der Prädikatenlogik erster Stufe orientiert ist
  • durch zusätzliche Prädikate wie EXISTS, MATCHES, NULL, LIKE u. a. wird diese sogar deutlich übertroffen
  • nicht auf einen Satztyp beschränkt ist
  • unabhängige oder korrelierte Teilanfragen zur Bestimmung von Suchargumenten in beliebiger Schachtelungstiefe zuläßt
  • zusätzlich den Einsatz von Built-in- und Sortier-Funktionen auf Partitionen der Satzmenge gestattet

Beispiel für prozeduralen Anfragen

Ein typische Beispiel für prozedurale Anfragen beschreibt das Netzwerkmodell:
  • FIND ANY PERS bezieht sich auf die (vorausgesetzte) Klausel LOCATION MODE IS CALC des Satztyps PERS
  • FIND NEXT PERS WITHIN BESCHÄFTIGT SET bezieht sich auf eine relative Position (Currency) in einer Setstruktur
  • FIND OWNER WITHIN BESCHÄFTIGT SET stellt den OWNERSatz der ‘current’ Set-Ausprägung zur Verfügung.

Erklären sie das Prinzip der Relationenalgebra!

Es wird unterschieden zwischen prozeduraler Algebra und deskriptiven Kalkülen. Ein Ausdruck einer prozeduralen Sprache gibt indirekt immer mit an, wie d.h. durch Ausführung welcher Operationen das Ergebnis berechnet werden kann.

Mengenorientiert

Aus einer oder mehreren Tupelmengen werden neue erzeugt. Anfragen werden in Form formaler Ausdrücke (der Relationenalgebra bzw. des Relationenkalküls) übermittelt.

Relationenalgebra ist niedrig polynomiell.

Optimieren kann man die Relationenalgebra indem man die Anfragebäume optimiert. Selektion und Projektion werden in Richtung Blätter verschoben, um schon anfangs kleine Zwischenergebnisse zu erhalten.

Relationenalgebra ist stets in Maßstab für die Ausdrucksstärke einer Sprache. Falls eine Sprache so Ausdrucksstark ( d.h. es gibt zu jedem Ausdruck in der einen Sprache einen äquivalenten in der anderen) wie die Relationenalgebra ist, so ist diese Codd-Vollständig. SQL ist bspw. nicht-prozedural, d.h. der Fragesteller stellt eine Frage, gibt aber keinen Algorithmus zur Lösung vor. Dieser ist in der Sprache selbst enthalten.

Erklären sie das Prinzip der Relationenkalküle!

Geben im Gegensatz zu prozeduralen Sprachen keine Berechnungsprozedur mit auf dem Weg, sondern nur eine Beschreibung der betroffenen Tupel der Ergebnisrelation.

Sie sind unter bestimmten Umständen Codd-Vollständig!

Wozo SQL - Structured Query Language?

SQL ist eine nicht-prozedurale, mengenorientierte Sprache für Relationale Datenbanksysteme. SQL kann Relationen als Einheiten verarbeiten, verfügt aber z.Z. noch nicht über Steuerstrukturen wie Schleifen oder Case-Anweisungen. SQL kann interaktiv eingesetzt werden oder in einer Programmiersprache eingebettet sein. (embedded SQL)

SQL-Anweisungen teilen sich in zwei Sprachen:

Datendefinitionsprache, zum Vereinbaren von Datenstrukturen, wie Relationen, Zugriffspfade etc..

Datenmanipulationssprache, zum Verarbeiten der Daten durch Einfügen, Löschen oder Updates.

Wichtige SQL-Anweisungen

Select-Anweisung

SELECT * FROM relation [WHERE Bedingung];
Bedinung ist durch Vergleichsoperatoren und den Anweisungen BETWEEN, IN, ANY und ALL definierbar.

Join

SELECT name.attribut {,...} 
FROM relation [Korrelation], relation [Korrelation]
WHERE bedingung
Durch die Korrelation ist es möglich Joins mit ein und der selben Tabelle durchzuführen. Korrelation heißt nix anderes als zwei Variablen einzuführen, um die Tabellen unterscheiden zu können. Um doppelte Tabellenzeilen zu Vermeiden verwende man SELECT DISTINCT!

Gruppenverarbeitung

Um Tupel herauszufiltern, welche auf gemeinsamen Eigenschaften basieren, bietet SQL einige Möglichkeiten:
SELECT attribut, {...} FROM relation GROUP BY gruppenattribut {,...} 
[HAVING bedingung]

Gruppenauswertungsfunktionen:
AVG(A), COUNG(A),COUNT(*),MAX(A),MIN(A),SUM(A)


Sortieren
ORDER BY [ASC|DESC]

Wie stellt man den Join in SQL dar?

Seien R(A1,.....,An) und S(B1,....,Bm) Relationen.

In Relationenalgebra:
R[Ai=Bj]S
In SQL:
SELECT A1,.....,An,B1,....,Bm FROM R, S WHERE Ai=Bj

Wie kann man den Natural Join in SQL und in Relationenalgebra darstellen?

Seien S(s1,..,sn,a1,..,am) und R(r1,..,rk,a1..am) Relationen mit gleichen Attributennamen a1..am die sowohl in S als auch in R vorkommen. SQL:
Select S.s1,...,S.sn,S.a1..S.am,R.r1,..,R.rk
Where S.a1=R.a1,..,A.am=R.am
Relationenalgebra:
R NATJOIN S:=(RxS)[S.a1=R.a1,..,A.am=R.am]
[S.s1,...,S.sn,S.a1..S.am,R.r1,..,R.rk]

Wie stellt man einen Join zwischen einer Relation mit sich selbst dar?

Diese Auto-Join genannte Operation gelingt mit Hilfe der Verwendung von Tupelvariablen: Relationenkalkül:

RANGE ANGEST X

RANGE ANGEST Y

{Y.Name| (X.Gehalt > Y.Gehalt)   (X.Name = Y.Vorgesetzter)} 

Relationenalgebra:

Y[Y.Gehalt > X.Gehalt][X.Name = Y.Vorgesetzter]X [Y.Name] 

SQL:
SELECT Y.Name FROM Angest X, Angest Y WHERE X.Name
= Y.Vorgesetzter AND Y.Gehalt > X.Gehalt

Wozu benötigt man Tupelvariablen?

Tupelvariablen sind immer dann nötig , wenn der Verbund einer Relation mit sich selbst gebildet werden soll oder dann, wenn bei einem Join von zwei verschiedenen Tabellen Attribute mit gleichen Namen auftreten.
Anders ausgedrückt: Immer dann wenn innerhalb einer Abfrage verschiedene Tupel derselben Relation betrachtet werden, braucht man Tupelvariable.

Wohin wird SQL übersetzt?

SQL wird direkt vom Datenmanager interpretiert.

Was geschieht bei einer SQL-Query an ein DBMS?

  1. Prüfung der Syntax und Zugriffsrechte
  2. Wahl einer geeigneten Methode zur Ausführung der Operation
  3. Feststellen, wie die Operanden gespeichert sind und wie effektiv auf diese Datenstrukturen zugegriffen werden kann (Zugriffspfade)
  4. Generieren von Ausführbaren Code, welcher
  5. die beteiligten Daten aus der DB in den Datenbank-Puffer transferiert
  6. die oben gewählte Methode integriert
  7. das Ergebnis ausgibt
  8. Ausführen des Erstellten Codes
Um nun mehreren Benutzern ein gleichzeitiges Arbeiten zu garantieren, sind alle Schritte bis 5 reentrant. D.h. sie können parallel ablaufen. Jeder Auftrag bekommt einen Platz im Buffer und wird abgearbeitet, wenn es an der Reihe ist. Hier kann es zur Synchronisationsproblemen kommen. Man kann den Buffer als Cache sehen. Schreibt der Prozess geänderte Daten in die DB zurück, muss womöglich ein Update eines anderen Pufferbereiches ausgeführt werden, da dieser sonst noch das falsche Datum trägt. Dies wird meist, wie aus Rechnerarchitektur bekannt, über Dirty-Bits in den einzelnen Seiten des Buffers geregelt. Wird eine Seite benötigt, wird das Dirty-Bit interpretiert und gegebenenfalls die Seite neu von der Platte in den Puffer geladen.

Wie erfolgt die Optimierung von Abfragen? Was ist bei Projektionen zu beachten?

  1. Selektionen möglichst früh ausführen, um die Ergebnismenge klein zu halten
  2. Zusammenfassung von Selektionen zu komplexen Selektionen, da dies die Zahl der Zugriffe auf die Daten minimal hält.
  3. Bei Projektionen zuerst diejenigen Attribute nehmen, die keine Eliminierung von Duplikaten erfordern
    dann möglichst früh (also wenn mindestens ein Schlüssel des Relationenschemas erhalten bleibt), sonst möglichst spät.
  4. Suche nach gemeinsamen Teilbäumen im Operatorbaum und Vereinigung dieser Bäume (Blätter: Relationen, innere Knoten Operationen, Selektion, Join, Projektion)
  5. Joins möglichst spät
  6. Optimierung auf physischer Ebene: Ausnutzung von Sekundärindizes (Invertierung), Sortierung, Speicherstruktur der Datenbanktabellen

Wie wird ein Join ausgeführt?

Beispiel: R(A,D), S(B,C); Gesucht R[A=B]S 
  • einfach und ineffizient: für jedes Tupel in R mit A=a wird S durchsucht nach B=a
  • mit Sekundärindex: Index weist jedem a die Tupelmenge in S mit B=a zu
  • mit Sortierung: R und S werden sortiert (bezgl. A bzw. B), dann werden R und S parallel durchlaufen.

Was macht die Anfrage-Optimierung?

Durch algebraische Optimierung, kann vor Ausführung des Codes schon optimiert werden, in dem Umformungen auf Basis der Relationenalgebra vorgenommen werden. Join-Operationen sind in der Regel sehr teuer. Dagegen sind Selektion und Projektion relativ billige Operationen.

Man unterscheidet das naive Vorgehen (einfach laut Klammerung auflösen) und das optimierte Vorgehen, indem die Anfrage so umformuliert wird, dass wenig aufwendige Operationen bevorzugt werden, um teuere Operationen mit kleinen Relationen ausführen zu können.
Anfrage > Parsen > Validierung > View-Resolution
> Optimierung > QEP > Code > Ausführung > Ausgabe
High Level Optimierung: Auf Grund von Rechenregeln wird die Anfrage optimiert. Ist somit unabhängig vom DBMS.
  • Ausnutzen von Kommutativität von Selektion, Projektion und natural Join.
  • Ausnutzen von Distributivität der Selektion bzgl. Des Verbundes
  • Ausnutzen von Distributivität der Projektion bzgl. Des Verbundes
  • Assoziativität des Verbundes, Vereinigung und Durchschnitt...
Folgende Optimierungskriterien sind zu beachten:
  1. optimierte Anfrage muss äquivalent zu Originalanfrage sein
  2. statische Daten, wie die Anzahl von Tupeln pro Relation einbeziehen
  3. eventuelle Sortierung der Tupel innerhalb einer Relation beachten
  4. eventuell existierende Zugriffspfade, wie Sekundärindexe o.ä. nutzen
Low Level Optimierung: QEP Erstellung und Optimierung der Datenorganisation und Implementierung.
  • Suche einer suboptimalen QEP mit Hilfe von Heuristiken oder Greedy Verfahren
  • Vollständige Strategien zu aufwendig
  • Falls Unterschiedliche QEPs für eine Anfrage möglich wird eine Kostenfunktion einbezogen (z.B. Anzahl notwendiger Plattenzugriffe)
  • Verbundimplementierung

Wie werden Anfragen dargestellt und intern weitergegeben?

Anfragen werden in Form von Operatorbäumen dargestellt. Er zeigt die zu bearbeitenden Relationen, die auszuführenden Operationen und die Präzedenzen (Aufrufreihenfolge) zwischen den Operatoren an.

Schedule-Prinzip

Was ist der Nested-Loop-Join?

sucht nach gleichen Werten der gemeinsamen Attribute in den zu verbindenden Relationen. Dabei muss für jedes Tupel der Relation A jedes Tupel der Relation B verglichen werden. Optimiert wird hier durch blockweißes Lesen der Daten. Somit entsteht quadratischer Aufwand.

Wie arbeitet Sort-Merge-Join?

Sortiert erst die Operanden anhand der Verbund-Attribute aufsteigend und mischt anschliessend die gleichwertigen Attribute zur Ergebnisrelation.
Falls die Operanden-Relation schon sortiert ist, weil z.B. für Attribut A ein Index existiert, ist das Verfahren dem Nested-Loop Join in jedem Fall vorzuziehen, da dann der Aufwand nur noch linear ist...

Wie arbeitet der Hash-Join?

Ist eine Einteilung der Relationen in Partitionen über eine Hashfunktion. Danach kann jede Partition einzeln betrachtet werden.

Was muß man bei der Ausführung von SQL-Anfragen tun?

  • Optimierung der Anfrage
  • Transformation in konzeptuelles und internes Schema
  • Beschaffen der benötigten Sätze und Transformation in externes Schema;
    Realisierung durch Datenmanager (Mengenschnittstelle)
    Zugriffsmanager (Ein-Tupel-Schnittstelle)
    Systempuffer(Cache)Manager (Seitenschnittstelle)

Wie kann man Datenbanken Tunen?

Es gibt vier grundlegende Prinzipien.
  1. Lokale Optimierung zur Erreichung globaler Effekte (Hardwareausnutzung überwachen)
  2. Partitionierung zur Vermeidung von Bottlenecks ( Transaktionen in Lange und Kurze)
  3. Intitiale Kosten > Laufende kosten (Leseoperationen sind beim Starten teurer - dann billig)
  4. Angemessene Aufgabenverteilung zwischen Systemkomponenten
Systemkomponenten
  • Concurrency Controll
  • Recovery- und Logging-System
  • Umgebendes OS (Puffer, Disk-Scheduling etc.)
  • Zugrunde liegende Hardware (RAM, Anzahl Prozessoren)
Tuning kann auch durch Denormalisierung vorgenommen werden, wenn z.B. extrem viele Verbund-Operationen auf die normalisierte Relation angewendet werden müssen.
Printansicht Inhalt Anfang zurück vor
DBMS Konzept
DB Entwurf
Normalformen
Relationalität
Sprachen
Datenorganisation
Transaktionskonzept
Concurrency Control
Scheduler & Recovery
PDF download:
Kleine ÜbersichtNormalformen
DMBSDMBS Bestandteile
Concurrency ControlConcurrency Control
All In OneKomplett (115 KByte)
Quellen:
Gottfried Vossen
Datenbankmanagementsysteme
Heuer und Saake
Konzepte und Sprachen
Prof. Benn
Skript und Vorlesung
Relationale Datenbanken
Andreas Kelz
Word Wide Web
Verschiedenste Seiten
Links:
Relationale Datenbanken
Andreas Kelz
ER Modell
Universität Wien