6-Anfrageoptimierung - Universität Basel | Informatik

Werbung
Frühjahrsemester 2013
CS243 Datenbanken
Kapitel 6: Anfrageoptimierung
H. Schuldt
Anfrageoptimierung – Ausgangslage
•
Deklarative Anfragesprachen wie z.B. SQL beschreiben das gewünschte Resultat,
aber nicht, wie dieses erhalten werden soll („what, not how“)
•
Physische Datenunabhängigkeit erlaubt es einem Datenbanksystem,
konzeptuelle/logische Datenstrukturen physisch unterschiedlich zu implementieren
•
Das DBMS hat daher die Freiheit, zu einer Anfrage und physischen Datenstruktur
einen entsprechenden, möglichst optimalen Ausführungsalgorithmus zu finden
•
Allgemeine Formulierung des Anfrageverarbeitungsproblems (NP vollständig)
– gegeben:
• Anfrage Q
• Ausführungsraum E (Menge der möglichen Ausführungspläne)
• Kostenfunktion C: E # cost
– gesucht
• Ausführung e œ E(Q)
so dass C(e) = mine’ œ E(Q) C(e’)
FS 2013
Datenbanken (CS243) – Anfrageoptimierung
6-2
1
Anfrageoptimierung und –ausführung: Übersicht
•
•
•
Eine gegebene Benutzeranfrage (nach
Übersetzung der Anfrage in einen Ausdruck
der Relationenalgebra) wird zunächst
algebraisch optimiert
– z.B. Umordnung / Austausch von
Operatoren)
– Input: Äquivalenzregeln, unabhängig
vom Datenbankzustand
Danach erfolgt die nicht-algebraische
Optimierung
– Auswahl geeigneter
Ausführungsprimitive
– Input: Statistiken und Kostenfunktionen
(abhängig vom DB-Zustand)
Der vom Optimierer schliesslich erzeugte
Ausführungsplan ist ein Operatorbaum,
dessen Knoten den Ausführungsprimitiven
des DBS-Laufzeitsystems entsprechen.
FS 2013
SQL-Anfrage
Syntaxanalyse
und Zerlegung
Algebraischer Operatorbaum
Algebraische Transformation / Optimierung
Verbesserter algebraischer
Operatorbaum
Generierung von
Ausführungsplänen;
Kostenschätzung & Auswahl
Ausführungsplan
(“physischer” Operatorbaum)
Datenbanken (CS243) – Anfrageoptimierung
6-3
Anfrageoptimierung und –ausführung
•
Man kann in den meisten DBS die generierten Ausführungspläne mit dem
EXPLAIN-Kommando anschauen und analysieren.
•
Bei ad hoc-Anfragen findet die Optimierung zum Anfragezeitpunkt statt.
Im Fall von ESQL-Programmen erfolgt die Optimierung in fast allen Produkten
zur Compile-Zeit statt. Dadurch müssen wiederholt ausgeführte parametrisierte
Queries werden nur einmal optimiert werden.
FS 2013
Datenbanken (CS243) – Anfrageoptimierung
6-4
2
Beispielanfrage – Algebraischer Operatorbaum
SELECT DISTINCT Bez
FROM Produkte P, Bestellungen B
WHERE B.PNr = P.PNr
AND Lagerort = :ort
AND Gewicht > :gew
AND Menge > :m
Algebraischer Operatorbaum
FS 2013
Datenbanken (CS243) – Anfrageoptimierung
6-5
Wichtige Ausführungsprimitive …
Grundlage für die Erstellung des physischen Operatorbaums sind die grundlegenden
Ausführungsprimitive des Datenbanksystems.
Das physische Datenbankschema ist zum Zeitpunkt der Query-Optimierung fest,
so dass nicht immer alle Ausführungsprimitive anwendbar sind.
Relationen-Scan (TABLE SCAN, TABLE ACCESS FULL):
– Sequentielles Lesen aller Tupel einer Relation, wobei auf jedem Tupel ein
„Single-Scan“-Filterprädikat überprüft und eine Attributprojektion (ohne
Duplikateliminierung) vorgenommen werden kann.
TID-Zugriff (TABLE ACCESS BY ROWID):
– Direkter Zugriff auf alle Tupel einer Liste von TIDs, wobei auf jedem Tupel
ein „Single-Scan“-Filterprädikat überprüft und eine Attributprojektion
(ohne Duplikateliminierung) vorgenommen werden kann.
Die TID-Liste sollte nach Seitennummern sortiert sein; Seiten mit kleinem
„Abstand“ auf derselben Platte (z.B. im selben Zylinder) sollten mit einem
einzigen Plattenzugriff gelesen werden (multi-block I/O, list prefetch).
FS 2013
Datenbanken (CS243) – Anfrageoptimierung
6-6
3
… Wichtige Ausführungsprimitive …
Index-Scan (INDEX RANGE SCAN oder INDEX UNIQUE SCAN):
– Zugriff auf alle TIDs von Tupeln, die ein Index-Suchprädikat der Form
wert1 § KEY § wert2 erfüllen, wobei KEY der Suchschlüssel des Index ist
(dies kann evtl. auch eine Attributkombination sein).
Realisiert ist dies durch eine Indexsuche nach wert1 mit einem nachfolgenden
„Blatt-Scan“ bis zum Erreichen des ersten Schlüssels, der grösser als wert2 ist.
Sortieren (SORT):
– Sortieren einer Tupelmenge nach einem Attribut bzw. einer Attributkombination.
Dabei werden Sortieralgorithmen für Externspeicher verwendet
(z.B. Mehrwegemischen).
FS 2013
Datenbanken (CS243) – Anfrageoptimierung
6-7
… Wichtige Ausführungsprimitive
Nested-Loop-Join (NESTED LOOPS):
– Berechnung eines Joins zwischen zwei Tupelmengen (mit Angabe einer
expliziten Join-Bedingung) mittels einer Doppelschleife
Merge-Join (MERGE JOIN):
– Berechnung eines Equi-Joins zwischen zwei nach dem Join-Attribut sortierten
Tupellisten mittels Mischen der Listen. Dieses Join-Berechnungs-Verfahren
heisst häufig auch Sort-Merge-Join, weil unter Umständen vor dem Mischen
noch Sortierschritte stattfinden müssen.
Hash-Join:
– Berechnung eines Equi-Joins zwischen zwei Tupelmengen durch Abbilden beider
Mengen auf eine Hash-Tabelle (mit einer für beide Tupelmengen identischen
Hash-Funktion über dem Join-Attribut), so dass Tupel mit gleichem Attributwert
auf denselben Eintrag (bzw. Bucket) der Hash-Tabelle abgebildet werden.
Durchschnitt, Vereinigung, Differenz (INTERSECTION, UNION, MINUS):
– Anwenden von Mengenoperationen auf Tupelmengen oder TID-Listen.
Dies wird in der Regel erst nach vorhergehendem Sortieren angewandt.
FS 2013
Datenbanken (CS243) – Anfrageoptimierung
6-8
4
Beispielanfrage – physischer Operatorbaum
Ausführungsplan nach Kostenschätzung und Wahl der Ausführungsprimitiven
physischer Operatorbaum
SELECT DISTINCT Bez
FROM Produkte P, Bestellungen B
WHERE B.PNr = P.PNr
AND Lagerort = :ort
AND Gewicht > :gew
AND Menge > :m
FS 2013
Datenbanken (CS243) – Anfrageoptimierung
6-9
6.1 Algebraische Optimierung …
Ziele der algebraischen Optimierung
• Vereinfachung der Anfrage (logische Anfrageoptimierung) durch syntaktische
Anfragetransformation
– Manipulation der Anfrage unter Erhaltung der Semantik
– englische Bezeichnung: Query Rewrite
• Elimination unnötiger Operationen
• Anwendung einfacher Heuristiken zur Effizienzverbesserung
Problemstellung
• Unter allen äquivalenten Formulierungen einer gegebenen Anfrage soll die
günstigste Methode ausgewählt werden
Methode
• Anwendung der Äquivalenzregeln der Relationenalgebra
(siehe Kapitel DB-3 aus cs261 bzw. ausführlich später)
• Dadurch kann die Unabhängigkeit vom aktuellen Datenbankzustand
gewährleistet werden
FS 2013
Datenbanken (CS243) – Anfrageoptimierung
6-10
5
… Algebraische Optimierung
Ergebnis: ein Operatorbaum mit
• Blattknoten: beteiligte Basisrelationen
• Innere Knoten: logische Operatoren (der Relationenalgebra), z.B. Selektion,
Projektion, kartesisches Produkt, …
• Kanten: Ausführungsreihenfolge
Heuristik
• Operatoren-Output soll so klein wie möglich sein
• Reduktion der Grösse von Zwischenresultaten
• Sammlung von syntaktischen Transformationsregeln, die i. A. eine Verbesserung
der Effizienz bewirken, z.B.
– Möglichst frühe Berechnung von Selektionen
– Kombination von Selektionen und kartesischem Produkt zu Joins
– Möglichst frühe Berechnung von Projektionen
– Bestimmung der Join-Reihenfolge so, dass möglichst kleine
Zwischenergebnisse entstehen
– Kombination von unären Operationen (select, project) zu Kaskaden
– Erkennung gemeinsamer Teilausdrücke
– Entfernung redundanter Teilausdrücke
FS 2013
Datenbanken (CS243) – Anfrageoptimierung
6-11
Übersetzung SQL-Anfrage in Operatorbaum
Zu SQL-Anfragen des Typs
SELECT …
FROM …
WHERE …
ist eine kanonische Übersetzung in einen Operatorbaum realisiert, die aus jeder
Basisrelation in der FROM-Klausel einen Blattknoten macht (falls eine View verwendet
wird, dann wird die View-Definition anstelle des Blattknotens eingesetzt).
Die Prädikate der WHERE-Klausel (u.a. auch die Join-Prädikate) werden in
Selektionsknoten übersetzt. Zuletzt werden die Attribute in der SELECT-Klausel in
einen Projektionsknoten überführt.
p
SELECT A1, ..., An
FROM R1, ..., Rk
WHERE P
A1, … An
sP
ä
ä
R1
FS 2013
Rk
R2
Datenbanken (CS243) – Anfrageoptimierung
6-12
6
Wiederholung: Äquivalenzregeln der Relationenalgebra …
Seien R, S, T Relationen, P, P1, P2 Prädikate, R1, R2, S1 Teilmengen der Attribute
von R bzw. S. Es gelten die folgenden Äquivalenzregeln
(z.T. bekannt aus Kapitel DB-3 von cs261):
Kommutativitätsregeln:
1.
RS=SR
2.
RS=SR
3.
RS=SR
4.
RäS=SäR
Vertauschung von Selektionen:
5.
s[P] (s[Q] (R)) = s[Q] (s[P] (R))
Assoziativitätsregeln:
6.
R(ST)=(RS)T
7.
R(ST)=(RS)T
8.
R(ST)=(RS)T
9.
Rä(SäT)=(RäS)äT
FS 2013
…
Datenbanken (CS243) – Anfrageoptimierung
6-13
Wiederholung: Äquivalenzregeln der Relationenalgebra …
Zusammenführen von Selektionen:
10.
s[P1  P2  …  Pn] (R) = s[P1] (s[P2] (… (s[Pn] (R))…))
Eliminieren geschachtelter Projektionen:
11.
p[Q1] (p[Q2](…(p[Qn](R))…)) = p[Q1](R) falls Q1 Œ Q2 Œ … Œ Qn Œ sch(R)
12.
p[Q1] (p[Q2](…(p[Qn](R))…)) = p[att(Q1)  att(Q2)  …  att(Qn)] (R) allg.
Vertauschen von Projektion und Selektion:
13.
p[Q] s[P] (R) = s[P] p[Q] (R) falls P nur Q-Attribute enthält
Vertauschen von Selektion und Join/Kartesisches Produkt:
14.
s[P] (R  S) = s[P] (R)  S
falls P nur Attribute aus R enthält
15.
s[P] (R ä S) = s[P] (R) ä S
falls P nur Attribute aus R enthält
Vertauschen von Projektion und Join:
16.
p[Q] (R [P] S) = p[Q] (p[Q1] (R) [P] p[Q2] (S))
Join-Attribute müssen bis zum Join erhalten bleiben, also
Q1 = {A | A œ sch(R)  Q}  {A | A œ sch(R)  att(P)}
Q2 = {A | A œ sch(S)  Q}  {A | A œ sch(S)  att(P)}
wobei att(P) die Attribute des Join-Prädikats P sind
FS 2013
Datenbanken (CS243) – Anfrageoptimierung
6-14
7
…
Wiederholung: Äquivalenzregeln der Relationenalgebra …
Vertauschung von Selektion und Mengenoperationen:
17.
s[P] (R  S) = s[P](R)  s[P](S)
18.
s[P] (R  S) = s[P](R)  s[P](S)
19.
s[P] (R – S) = s[P](R) – s[P](S)
Vertauschung von Projektion und Vereinigung:
20.
p[P] (R  S) = p[P](R)  p[P](S)
Zusammenfassung von Selektion und kartesischem Produkt:
21.
s[R.A = S.A] (R ä S) = R  S
falls sch(R)  sch(S) = A
22.
s[R.A = S.B] (R ä S) = R [R.A = S.B] S
Kombination aus Join und Vereinigung
23.
R  (S  T) = (R  S)  (R  T)
Konjunktionen und Disjunkitonen in Selektionsprädikaten
24.
s[P1  P2] (R) = s[P1] (R)  s[P2] (R)
25.
s[P1 ¤ P2] (R) = s[P1] (R)  s[P2] (R)
FS 2013
Datenbanken (CS243) – Anfrageoptimierung
6-15
… Wiederholung: Äquivalenzregeln der Relationenalgebra
Idempotenzen:
26.
RR=R
27.
RR=R
28.
RR=R
29.
R–R=«
Verknüpfungen mit leeren Relationen:
30.
R«=R
31.
R«=«
32.
R«=«
33.
R–«=R
34.
«–R=«
Zudem: Umwandlung von Bedingungen gemäss den Äquivalenzen der
Boole‘schen Algebra
FS 2013
Datenbanken (CS243) – Anfrageoptimierung
6-16
8
Algebraische Optimierung: Beispiel …
1. Gegebene Anfrage:
SELECT *
FROM Produkte P, Bestellungen B
WHERE P.Lagerort = 'Basel' AND B.Menge > 100 AND P.PNr = B.PNr;
2. Umwandlung in Relationenalgebra
3. Optimierung:
FS 2013
Datenbanken (CS243) – Anfrageoptimierung
6-17
… Algebraische Optimierung: Beispiel
•
Optimierter vs. nicht-optimierter algebraischer Operatorbaum
Annahme:
FS 2013
100‘000
1‘000‘000
100
50
Produkte
Bestellungen
Lagerorte
Ergebnistupel
Datenbanken (CS243) – Anfrageoptimierung
6-18
9
Verwendung funktionaler & mehrwertiger Abhängigkeiten
Gegeben sei die Relation R mit Schema sch(R) und A, B, C Œ sch(R). Ferne gelte in R
die funktionale Abhängigkeit B  C. Dann gilt auch:
[AB](R)  [BC](R) = [ABC](R)
Satz: verlustfreier Join
Sei R eine Relation mit sch(R) = X  Y und X  Y ∫ « . .
Falls gilt X  Y T X oder X  Y T Y, dann gilt auch: [X](R)  [Y] (R)  R
Falls gilt X  Y Tz X oder X  Y Tz Y , dann gilt auch [X](R)  [Y] R  R
Dieser Satz kann verwendet werden, um redundante Joins (teuer!) zu entfernen
Woher kommen überhaupt redundante Operationen, insbesondere Joins, in
Anfragen?
FS 2013
Datenbanken (CS243) – Anfrageoptimierung
6-19
Verwendung von Integritätsbedingungen
Beispiel:
• In einer Relation Angestellte sei folgende Integritätsbedingung I definiert:
I = „kein Angestellter verdient mehr als 100 kFr“
• Es sei die Anfrage Q gegeben mit
Q= „wer verdient mehr als 120 kFr / weniger als 80 kFr?“
•
•
Schema: Angestellte (Name, Adresse, Abteilung, Gehalt)
Integrität: … check Gehalt < 100000
•
Anfrage:
s[Gehalt > 120‘000 ¤ Gehalt < 80‘000] (Angestellte)
= s[Gehalt > 120‘000 ¤ Gehalt < 80‘000] (s[Gehalt < 100‘000 (Angestellte))
(Wegen Integritätsbedingung in Anfrage Q)
= s[Gehalt > 120‘000] (s[Gehalt < 100‘000] (Angestellte)) »
s[Gehalt < 80‘000] (s[Gehalt < 100‘000] (Angestellte))
= s[Gehalt > 120‘000 ⁄ Gehalt < 100‘000](Angestellte) »
s[ Gehalt < 80‘000 ⁄ Gehalt < 100‘000](Angestellte)
=  » s[ Gehalt < 80‘000](Angestellte) = s[ Gehalt < 80‘000](Angestellte)
FS 2013
Datenbanken (CS243) – Anfrageoptimierung
6-20
10
Algebraische Transformation bei View-Ersetzung
Beispiel:
• Es seien die folgenden Views gegeben:
Preise (PNr, Preis) := p[PNr, Preis] (Produkte)
Lager (PNr, Lagerort, Vorrat) := p[PNr, Lagerort, Vorrat] (Produkte)
Query-Transformation:
s[Lagerort = 'Basel'  Preis > 100] (Preise  Lager)
= s[Lagerort = 'Basel'  Preis > 100]
(p[PNr, Preis] (Produkte)  p[PNr, Lagerort, Vorrat] (Produkte))
(aufgrund der Viewdefinition)
= s[Lagerort = 'Basel'  Preis > 100]
(p[PNr, Preis, Lagerort, Vorrat] (Produkte  Produkte))
(nach Regeln 12 und 16 und weil PNr Primärschlüssel von Produkte ist)
= s[Lagerort = 'Basel'  Preis > 100] (p[PNr, Preis, Lagerort, Vorrat] (Produkte))
(nach Regel 28)
FS 2013
Datenbanken (CS243) – Anfrageoptimierung
6-21
6.2 Nicht-Algebraische Optimierung
Ziele der nicht-algebraischen Optimierung
• Auswahl der Ausführungsstrategie (physische Anfrageoptimierung)
• Suche eines guten Ausführungsplans unter Berücksichtigung von
Kostenparametern, physischer Datenorganisation, Zugriffspfaden, etc.
– englische Bezeichnung: Query Planning
– abhängig vom aktuellen DB-Zustand
Ergebnis der nicht-algebraischen Optimierung
• ist ein Ausführungsplan (Operatorenbaum) mit
– Knoten: ausführbare Operationen (Algorithmen), z.B. IndexScan, Nested
Loop-Join, …
– Kanten: Eingabe-Ausgabe-Beziehung zwischen Operationen
•
Teilaufgaben
– Optimierung einfacher Anfragen (ohne Joins)
– Bestimmung von Join-Reihenfolgen
– Query Compilation
FS 2013
Datenbanken (CS243) – Anfrageoptimierung
6-22
11
Bestimmung von Join-Reihenfolgen
•
Bei Anfragen mit mehreren Joins hat die Reihenfolge (d.h. Klammerung) unter
Umständen grösseren Einfluss als die konkreten Implementierungsstrategien
– Daher: Entscheidung über die Reihenfolge der Join-Berechnungen ist wichtig
– Grundlage ist Kommutativität und Assoziativität von Joins
•
Vorgehen
– Bestimmung (aller ?) möglichen Join-Reihenfolgen und Darstellung als
Join-Trees
– Bestimmung für jeden Join-Tree die Kosten der gewählten Implementierung
und Auswahl der kostengünstigsten Alternative
•
Exponentiell grosser Suchraum
– Daher: Einschränkung über die Form der betrachteten Join-Trees
•
Bemerkung
– Typische SQL-Anfragen haben eher wenige Joins
– Das kann sich allerdings ändern, wenn massiv Views benutzt werden oder bei
automatisch erzeugten Anfragen (z.B. von Frontends oder in Decision Support
bzw. Data Mining-Anwendungen)
FS 2013
Datenbanken (CS243) – Anfrageoptimierung
6-23
Kostenbasierte Optimierung …
Grundlage der kostenbasierten Optimierung sind Kostenfaktoren, also eine
Abschätzung der bei der Anfragebearbeitung entstehenden Kosten auf der Grundlage
von physischen Operationen:
I/O-Kosten:
– Diese werden als proportional zur Anzahl der benötigten Seiten angenommen
(aus Komplexitätsgründen ohne Berücksichtigung der Pufferung)
CPU-Kosten:
– Diese sind proportional zur Anzahl der Tupel im (Zwischen-) Ergebnis
Speicherkosten:
– Zeit-Platz-Produkt für den benutzten Hauptspeicher (wird aber typischerweise
vernachlässigt)
Kommunikationskosten:
– Diese sind nur in verteilten Datenbanksystemen relevant
FS 2013
Datenbanken (CS243) – Anfrageoptimierung
6-24
12
… Kostenbasierte Optimierung
Ziel der Optimierung ist das Auffinden denjenigen Ausführungsplans, für den die
Schätzung der gewichteten Kosten
w1 * I/O-Kosten + w2 * CPU-Kosten + w3 * Speicherkosten
minimal ist, wobei w1, w2, w3 vom Hersteller technologieabhängig gewählte
Gewichte sind (die unter Umständen vom Datenbank-Administrator verändert werden
können).
Das Gewicht w3 ist oftmals Null und auch w2 wird häufig vernachlässigt.
FS 2013
Datenbanken (CS243) – Anfrageoptimierung
6-25
Optimierungsmethode
•
Falls möglich werden
– alle überhaupt möglichen Ausführungspläne erzeugt,
– die jeweiligen Kosten geschätzt und
– der insgesamt beste Ausführungsplan ausgewählt (erschöpfende Suche
mit der so genannten “Generate-and-Test”-Strategie)
•
Wenn es sehr viele mögliche Ausführungspläne gibt (etwa bei Anfragen mit sehr
vielen Joins), dann wird der Suchraum durch geeignete Heuristiken für
kombinatorische Optimierungsprobleme eingeschränkt.
– In diesem Fall ist allerdings die Optimalität des ausgewählten
Ausführungsplans nicht mehr garantiert.
– Trotzdem führen solche Heuristiken in aller Regel zu einem guten
Ausführungsplan.
FS 2013
Datenbanken (CS243) – Anfrageoptimierung
6-26
13
Kostenschätzungen
•
Die Basis für die nicht-algebraische Optimierung stellen Kostenschätzungen dar.
•
Kostenschätzungen basieren auf Statistiken über den Daten.
•
Damit die Aktualisierung der Statistiken den laufenden Betrieb nicht behindert,
werden die Statistiken typischerweise nur auf expliziten Wunsch des DatenbankAdministrators aktualisiert (in Oracle mit dem Kommando ANALYZE).
FS 2013
Datenbanken (CS243) – Anfrageoptimierung
6-27
Kostenschätzung: relevante statistische Information
Für jede Relation R:
– Card(R)
– NPages(R)
die Anzahl der Tupel von R
die Anzahl der Seiten, in denen R gespeichert ist
Für jedes Attribut A einer Relation:
– ColCard(A)
die Anzahl der verschiedenen vorkommenden Attributwerte
– Low(A)
der kleinste vorkommende Attributwert
– High(A)
der grösste vorkommende Attributwert
– ColLen(A)
die (durchschnittliche) Länge eines Attributwerts
Für jeden Index I:
– NLevels(I)
– NLeaves(I)
FS 2013
die “Höhe” des Index
die Anzahl der Blattknoten des Index
Datenbanken (CS243) – Anfrageoptimierung
6-28
14
I/O-Kosten-Schätzung für einige Ausführungsprimitive
Beispiel: Table-Scan über Relation R
– I/O-Kosten: NPages(R) · Kosten_sequentieller_Seitenzugriff
bzw.:
NPages(R) da nicht die eigentlichen abgeschätzten Kosten,
sondern nur die Anzahl Zugriffe berücksichtigt wird
Index-Scan über mittelbaren Index IA für Attribut A der Relation R mit Filterformel f
– I/O-Kosten: (NLevels(IA) – 1) · Kosten_wahlfreier_Seitenzugriff +
FF (f) · NLeaves(IA) · Kosten_wahlfreier_Seitenzugriff
bzw.:
(NLevels(IA) – 1) + FF (f) · NLeaves(IA)
– Dabei schätzt der Ausdruck FF(f) die Selektivität (bzw. den Filterfaktor) des
Filterprädikats f ab. Der Filterfaktor für ein Prädikat f auf den Attributen einer
einzigen Relation R ist wie folgt definiert:
FF(f) :
FS 2013
| {r  R | f(r)} |
|R |
Datenbanken (CS243) – Anfrageoptimierung
6-29
Beispiel (Fortsetzung)
TID-Zugriff nach Index-Scan mit Filterprädikat f
•
Fall 1: Der vorhergehende Index-Scan bezieht sich auf einen Clustered Index
– I/O-Kosten: NPages(R) · FF(f)
•
Fall 2: Der vorhergehende Index-Scan bezieht sich auf einen Unclustered Index
– I/O-Kosten: Card(R) · FF(f)
Dies ist eine pessimistische Schätzung der I/O-Kosten:
Es wird angenommen, dass alle Tupel der TID-Liste auf verschiedenen
Seiten liegen.
FS 2013
Datenbanken (CS243) – Anfrageoptimierung
6-30
15
Schätzung von Filterprädikaten
•
Typische Formeln für die Schätzung von (einfachen) Filterprädikaten sind die
folgenden (unter Annahme einer Gleichverteilung):
FF(A = v)
=
1 / ColCard(A)
FF(A < v) = (A § v)
=
( v-Low(A) / (High(A) - Low(A) )
falls High(A) ∫ Low(A)
FF(v1 § A § v2)
•
=
(v2 - v1 ) / (High(A) - Low(A))
falls High(A) ∫ Low(A)
Kostenschätzung für komplexe Selektionen: Hier wird der Filterfaktor mit Hilfe von
wahrscheinlichkeitstheoretischen Formeln geschätzt, wobei unabhängige
Verteilungen angenommen werden:
FS 2013
FF(f ⁄ g)
=
FF(f) * FF(g)
FF(f ¤g)
=
FF(f) + FF(g) – FF (f) * FF(g)
FF(¬ f)
=
1 – FF(f)
Datenbanken (CS243) – Anfrageoptimierung
6-31
Konjunktive Filterprädikate
Bei Filterprädikaten der Form f1 ⁄ ... ⁄  fn bestehen folgende Möglichkeiten:
•
Falls alle Bedingungen fi (1 § i § n) der Form Ai = vi sind und falls für eine
Permutation von A1, ... , An ein zusammengesetzter Index existiert, dann
kann ein Index-Scan auf dem zusammengesetzten Index verwendet werden.
•
Falls für jede Bedingung fi (1 § i § n) ein separater (indirekter, unclustered) Index
über Ai verwendet werden kann, dann können die beim Index-Scan
zurückgelieferten TID-Listen miteinander geschnitten werden. (Im allgemeinen
wird dabei angenommen, dass alle TID-Listen im Hauptspeicher Platz haben.)
Die I/O-Kosten sind dann:
•
•
S(NLevels(IAi)-1+ FF(A=vi) · NLeaves(IAi)) + P FF(Ai=vi) · Card(R)
Falls nur für einige der Bedingungen ein Index verwendet werden kann, dann
können die aus der Index-gestützten Suche resultierenden TID-Listen verwendet
werden, um die entsprechenden Tupel zu holen und die restlichen Bedingungen
auf diesen Tupeln explizit zu überprüfen.
Der Optimierer sollte die Benutzung von Indizes in absteigender Reihenfolge ihrer
Selektivität erwägen (kleinste Selektivität zuerst!) und einen Index dann nicht
benutzen, wenn er nur noch einen marginalen Nutzen bringen würde.
FS 2013
Datenbanken (CS243) – Anfrageoptimierung
6-32
16
Beispiele für die Kostenschätzung …
Annahme: alle Indizes indirekt und unclustered:
• Statistiken des DB-Systems:
Tabelle
Card
NPages
Bestellungen
10‘000‘000
250‘000
Spalte
ColCard
KNr
100‘000
PNr
Monat
Tag
MonatTag
•
Low
High
ColLen
NLevels NLeaves
1 100‘000
24
3
25‘000
10‘000
1
10‘000
24
3
20‘000
12
1
12
12
3
21‘600
31
1
31
12
300
101
1231
24
Zusammengesetzter Index
I/O-Kosten der Anfrage s[KNr = :c ](Bestellungen)
FS 2013
Datenbanken (CS243) – Anfrageoptimierung
6-33
… Beispiele für Kostenschätzung
•
I/O-Kosten der Anfrage s[Monat=11 ⁄ Tag=11] (Bestellungen)
•
I/O-Kosten der Anfrage
s[KNr = :k ⁄ PNr = :p ⁄ Monat = :d ⁄ Tag=:t] (Bestellungen)
FS 2013
Datenbanken (CS243) – Anfrageoptimierung
6-34
17
Verfahren für Equi-Joins: Nested-Loop …
Zu den wichtigsten Ausführungsprimitiven in Datenbanksystemen gehören
Algorithmen zur Berechnung von Joins zwischen zwei oder mehr Relationen.
Der einfachste Algorithmus ist der Nested-Loop-Join
Nested-Loop-Join: In einer geschachtelten Schleife wird über beide Relationen
iteriert. Zunächst muss also festgelegt werden, welche Relation die äussere
(outer) und welche die innere (inner) ist
for each Tupel r in outer do {
/* Finde alle Tupel s in inner mit s.Joinattribut =
r.Joinattribut */
for each Tupel s in inner do {
if r.Joinattribut = s.Joinattribut
then Füge kombiniertes Tupel (r,s) in Resultatmenge ein
} /* for */
} /* for */
FS 2013
Datenbanken (CS243) – Anfrageoptimierung
6-35
… Verfahren für Equi-Joins: Nested-Loop …
•
Beobachtungen
– Es wird ein Tupel nach dem anderen gelesen („one-tuple-at-a-time“)
– die Reihenfolge der ri und sj ist beliebig
– die Form der Join-Bedingung F ist im Prinzip beliebig; es können auch andere
als Equi-Joins unterstützt werden
– Zugriffspfade auf outer und inner S wären hilfreich
– Der Nested-Loop-Join lässt sich leicht auf > 2 Relationen erweitern
(mehrfache Schachtelung)
•
Prinzipielle Verbesserungsmöglichkeiten
– Zugriffspfade ausnutzen: Nested Loop mit Index (Join Index)
– Pufferung („set-at-a-time“ Modus): Nested Block Methode
– Sortierung ausnutzen bzw. zuvor sortieren: Merge Join (Sort-Merge-Join)
– Bessere Ausnutzung der Form der Join-Bedingung (EquiJoin): Hash-Joins
FS 2013
Datenbanken (CS243) – Anfrageoptimierung
6-36
18
… Verfahren für Equi-Joins: Nested-Loop
Nested-Loop-Join mit Indexzugriff auf die innere Relation:
• Zunächst: wiederum Festlegung der äusseren (outer) und der inneren (inner)
Relation
for each Tupel r in outer do {
Finde mittels Indexzugriff die TIDs aller Tupel s mit
s.Joinattribut = r.Joinattribut
for each TID do {
Hole Tupel s und füge kombiniertes Tupel (r,s) in
Resultatmenge ein
} /* for */
} /* for */
FS 2013
Datenbanken (CS243) – Anfrageoptimierung
6-37
Verfahren für Equi-Joins: Nested Block Join
Der Nested Block Join stellt eine verbesserte Variante für Nested Loops
(ohne Indexunterstützung) dar:
• Zunächst: wiederum Festlegung der äusseren (outer) und der inneren (inner)
Relation
for each Seite (bzw. Menge benachbarter Seiten) von outer do {
for each Seite (bzw. Menge benachbarter Seiten) von inner do {
/* berechne den Join der Tupel, die in diesen Seiten
liegen*/
for each Tupel r in der outer-Seite do {
for each Tupel s in der inner-Seite do {
if r.Joinattribut = s.Joinattribut then Füge
kombiniertes Tupel (r,s) in Resultatmenge ein
} /* do (Iteration inner) */
} /* do (Iteration outer) */
} /* do (inner block) */
} /* do (outer block) */
FS 2013
Datenbanken (CS243) – Anfrageoptimierung
6-38
19
Verfahren für Equi-Joins: Merge Join …
Merge-Join: (wiederum Festlegung von outer und inner benötigt)
r := erstes Tupel von outer (sortiert bzgl. Joinattribut)
s := erstes Tupel von inner (sortiert bzgl. Joinattribut)
while (nicht alle Tupel von outer bearbeitet) or
(nicht alle Tupel von inner bearbeitet) do {
if r.Joinattribut = s.Joinattribut then {
s1 := s
while r.Joinattribut = s.Joinattribut do {
Füge kombiniertes Tupel (r,s) in Resultatmenge ein
s := nächstes Tupel von inner
} /* while */
s := s1 /* Gehe zurück zum ersten inner-Tupel mit
diesem Joinattributwert */
r := nächstes Tupel von outer
} /* then */
else {
if r.Joinattribut < s.Joinattribut
then r := nächstes Tupel von outer
else s := nächstes Tupel von inner
} /* else */
} /* while */
FS 2013
Datenbanken (CS243) – Anfrageoptimierung
6-39
… Verfahren für Equi-Joins: Merge Join
•
Bemerkung: Die Schleife über die beiden Relationen ist häufig als Index-Scan
über dem Joinattribut der jeweiligen Relation realisiert.
•
Der Merge Join wird zum Teil auch als Merge-Scan-Join bezeichnet
•
Eine Variante des Merge Joins, der Sort-Merge-Join, sortiert zunächst die beiden
am Join beteiligten Relationen, bevor der Join durchgeführt wird
FS 2013
Datenbanken (CS243) – Anfrageoptimierung
6-40
20
Zusammenfassung Kapitel 6
Anfrageoptimierung besteht aus folgenden Schritten
1. Algebraische Optimierung: Anwendung von Äquivalenzregeln der
Relationenalgebra
2. Auswahl der geeigneten Operatoren basierend auf den verfügbaren
Zugriffspfaden
FS 2013
Datenbanken (CS243) – Anfrageoptimierung
6-41
21
Herunterladen