Speicher - Universität Basel | Informatik

Werbung
Frühjahrsemester 2014
CS243 Datenbanken
Kapitel 4: Speicher- und Zugriffssystem
H. Schuldt
Physische Datenorganisation
•
Im Zentrum des konzeptuellen Datenbankentwurfs steht die Frage,
welche Daten benötigt werden und wie diese zusammen hängen
•
Im logischen Entwurf wird ein geeignetes Datenmodell ausgewählt.
Der konzeptuelle Entwurf wird in dieses Datenmodell überführt und
gegebenenfalls noch optimiert (normiert).
•
Bei beiden Entwurfsaktivitäten stellt sich (noch) nicht die Frage,
wie Daten gespeichert werden.
Diese Frage ist Gegenstand des physischen Entwurfs:
– Wie werden Daten auf dem Hintergrundspeicher organisiert?
– Wie kann man effizient auf diese Daten zugreifen?
FS 2014
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-2
1
Technologischer Hintergrund: Speicherhierarchie
Kapazität
Geschwindigkeit
Preis
~ 1 MB – 8 MB
CPU
Cache
(SRAM)
<1 ns
~ 1 GB – 8 GB
Hauptspeicher
(DRAM)
3-8 ns
< 20 CHF/GB
Sekundärspeicher
(Magnetplatten)
10 ms
~ 0.05 CHF/GB
100 ms
Tertiärspeicher
n/a*
(optische Platten, Magnetbänder)
0.10 CHF/GB
0.30 - 2 CHF/GB
~160 - 4000 GB
pro Platte
~0.7 - 4.7 GB
pro opt. Platte
~20 - 400 GB
pro Band
* Aktuelle Übertragungsraten 80 MB/s
T Zugriffslücke (Access Gap) zwischen Hauptspeicher und Sekundärspeicher!
FS 2014
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-3
Aufbau des Sekundärspeichers
Organisation eines Plattenspeichers
• Mehrere Platten
(Speicherung an
deren Oberfläche)
Drehrichtung der
Platten
Bewegung der SchreibLeseköpfe
• Pro Platte gibt es
mehrere Spuren
(kreisförmige Anordnung von Bits)
• Pro Spur gibt es
mehrere Sektoren
(Blöcke), die aus
Präambel, Datenbytes
und Fehlerkorrektur
bestehen
• Alle Arme werden zugleich
bewegt. Der Spurensatz,
der über mehrere Platten
hinweg parallel gelesen
werden kann, heisst Zylinder.
FS 2014
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-4
2
Hintergrundspeicher (Festplatte)
Charakteristik aktueller Festplatten (Laptop / Server / Desktop), Beispiele:
Laptop
Desktop
Server
Durchmesser
2,5‘‘
3,5‘‘
3,5‘‘
Speicherkapazität
1000 GB
2000 GB
600 GB
Preis
70 CHF
Grösse (H x B x T)
9.5 x 70
Gewicht
105 g
450 g
690 g
Zuverlässigkeit (MTTF)
330.000 h
1.000.000 h
1.600.000 h
#Oberflächen
2
3-4
6
#Zylinder
16383
16383
50864 - 90774
Rotationsgeschwindigkeit
5400 rpm
7200 rpm
15.000 rpm
~ 90 CHF
x
100
26 x 102
x
~ 200 CHF
147
26 x 102
Mittlere Armpositionierungszeit
12 ms
9,5 ms
3,9 ms
Cache
8 MB
64 MB
16 MB
Geräuschpegel
24 dB
24 dB
34 dB
FS 2014
x
147
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-5
4.1 RAID-Systeme (Speicherarrays) …
•
Trotz technischer Entwicklungen lässt sich die Zugriffslücke nicht schliessen
(im Gegenteil, sie nimmt mit neueren Generationen von Platten eher noch zu)
•
RAID-Systeme (Redundant Array of Independent Disks) versuchen –anstelle eines
grossen Laufwerks– mehrere kleinere (und damit preiswertere) Laufwerke parallel
einzusetzen. Der RAID-Controller sorgt dafür, dass diese kleinen Laufwerke nach
aussen wie ein einziges grosses Laufwerk aussehen.
•
Es existieren insgesamt acht unterschiedliche RAID-Stufen (levels).
Diese unterscheiden sich hauptsächlich im Redundanzgrad (und damit
in der Ausfallsicherheit) und in der Effizienz des Zugriffs
FS 2014
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-6
3
… RAID-Systeme (Speicherarrays) …
•
RAID-0 (Striping): Daten werden blockweise auf die physischen Laufwerke
verteilt. Die Anzahl der Platten wird als Striping-Breite bezeichnet, die Grösse der
Blöcke als Striping-Granularität.
Dieses RAID-Level unterstützt vor allem das sequentielle Lesen. Die Skalierung
ist (nahezu) linear mit der Anzahl der verfügbaren Platten. Bei zufälligem Lesen
einzelner Blöcke gibt es (fast) keine Unterstützung.
Durch die Verteilung auf viele Platten ist der RAID-0-Ansatz in der Regel auch
sehr fehleranfällig.
Beispiel:
Datei X mit vier
Datenblöcken A, B, C, D
A
B
C
D
FS 2014
A
C
B
D
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-7
… RAID-Systeme (Speicherarrays) …
•
RAID-1 (Mirroring): Jedes Laufwerk besitzt eine Spiegelkopie (Mirror) des
kompletten Datenbestands. Während also RAID-0 auf den effizienten Zugriff
abzielt hat RAID-1 primär eine hohe Ausfallsicherheit zum Ziel. Falls auf einer
Platte defekte Blöcke festgestellt werden, so kann das Lesen ohne Datenverlust
auf einer der Spiegelplatten fortgesetzt werden.
Beispiel:
FS 2014
A
B
A
B
A
B
C
D
C
D
C
D
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-8
4
… RAID-Systeme (Speicherarrays) …
•
RAID-0+1: Kombiniert RAID-0 und RAID-1. Die Zahl der zur Verfügung stehenden
Platten wird halbiert. Auf der Hälfte dieser Platten erfolgt ein Striping, auf der
zweiten Hälfte sind die Mirrors der anderen Platen untergebracht. Der
Speicherplatzbedarf ist daher doppelt so hoch wie bei RAID-0
Beispiel:
A
B
C
D
FS 2014
A
C
B
D
A
C
B
D
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-9
… RAID-Systeme (Speicherarrays) …
•
•
RAID-2: Die Ausfallsicherheit wird hier durch Paritätsinformation realisiert –
also effizienter als bei RAID-1. In RAID-2 erfolgt ein Striping auf Bitebene
(auf n-1 Platten). Auf der n-ten Platte findet sich dann zugehörige
Paritätsinformation (ähnlich wie bei Bandlaufwerken). Dieses RAID-Level wird
in der Praxis eher selten eingesetzt, da die Plattencontroller bereits eine
Fehlererkennung eingebaut haben.
RAID-3: Wie RAID-2, allerdings erfolgt hier ein Striping auf Byte-Ebene. Bei n
Platten wird also Byte A[m] auf Platte m mod (n-1) gespeichert. Auf der n-ten
Platte wird die Paritätsinformation abgelegt. Der erhöhte Speicherbedarf in
diesem RAID-Level beträgt 1/n. Beim Lesen kann man auf die ersten n-1 Platten
zugreifen, beim Schreiben auf alle n.
Beispiel:
FS 2014
A
B
A1 A4
C
D
B1
…
…
A2 A5
B2
…
…
A3
B3
Datenbanken (CS243) – Speicher- und Zugriffssystem
…
…
Ap
Bp
…
…
4-10
5
… RAID-Systeme (Speicherarrays) …
•
•
RAID-4: Die Funktionsweise ist dieselbe wie bei RAID-3. Allerdings erfolgt das
Striping auf den ersten n-1 Platten auf Blockebene. Analog befindet sich auf
Platte n ein Paritätsblock.
RAID-5: Auch hier erfolgt ein Striping auf Blockebene. Allerdings wird nicht nur
eine Platte für die Paritätsblöcke verwendet. Vielmehr werden die Paritätsblöcke
gleichmässig auf alle Platten verteilt. Daher werden in der Regel auch alle n
Platten bei einem Lesezugriff benötigt.
A1 B1 C1 Dp
A2 B2 Cp D1
A3 Bp C2 D2
Ap B3 C3 D3
E1 F1
E2 F2
E3 Fp
Ep F3
FS 2014
…
…
…
…
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-11
… RAID-Systeme (Speicherarrays)
•
RAID-6 ist ein weiteres RAID-Level, das im Vergleich zu RAID-3 bis RAID-5
aufwändigere Paritätsinformationen verwendet (bei RAID-3 bis RAID-5 kann
nur ein Fehler auf einer der beteiligten Datenplatten korrigiert werden).
•
Die Möglichkeit des Stripings von Datensätzen auf mehrere Platten zur
Effizienzsteigerung des Zugriffs wird von vielen Datenbanksystemen
(auch ohne RAID-System) eingesetzt.
FS 2014
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-12
6
4.2 Abbildung von DB-Objekten auf Speicherbereiche …
Eine oder mehrere Relationen und/oder Indexe werden normalerweise in einem
Tablespace gespeichert. Ein Tablespace ist ein logisch zusammenhängender
Seitenadressraum. Eine Seite umfasst in der Regel mehrere auf einer Spur liegende
Blöcke und ist die kleinste Einheit der Daten, die vom DBMS geladen werden.
Mehrere Seiten werden zu so genannten Extents zusammen gefasst. Logische
Seitennummern werden mit Hilfe einer Seitenadressierungstabelle
(Extent-Tabelle) in physische Blocknummern auf der Platte übersetzt. Extents sind
typischerweise gegenüber dem Betriebssystem als reguläre Files alloziert.
Oracle verwendet zusätzlich zu den Extents noch Segmente (ein Segment beinhaltet
mehrere Extents). Dies erlaubt innerhalb eines Tablespaces die Unterscheidung in
Datensegmente, Indexsegmente, Rollbacksegmente, etc.
FS 2014
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-13
… Abbildung von DB-Objekten auf Speicherbereiche
Extent Table
Extent No
0
1
2
Extent Size
2
5
4
#Pages
0–1 2–6
7 – 10
Extent Address
FS 2014
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-14
7
Verwaltung von Tablespaces
Allokation von Tablespaces:
CREATE TABLESPACE tablespacename
DATAFILE filename SIZE size {"," filename SIZE size}
Erweiterung von Tablespaces:
ALTER TABLESPACE tablespacename
ADD DATAFILE filename SIZE size {"," filename SIZE size}
Zuordnung von Relationen (und Indexe) zu Tablespaces:
CREATE tablename ( ...
[ TABLESPACE tablespacename ]
[ STORAGE INITIAL size NEXT size ] [ PCTFREE percent ] )
•
Die Parameter der Tablespace-/Table-Spezifikation erlauben eine Einflussnahme
auf die Allokation von Daten auf den zugrundeliegenden Speichermedien, z.B.:
– Allokation bestimmter Daten auf derselben oder verschiedenen Platten,
– Festlegung eines Füllgrades von Seiten beim Laden.
FS 2014
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-15
Zuordnung von Schemaelementen zu Tablespaces
Beispiel :
• Tablespace TS1 bestehe aus Extents, die alle auf Platte /dev/rsd0a liegen;
• Tablespace TS2 bestehe aus Extents, die alle auf Platte /dev/rsd1b liegen.
Es gebe viele Zugriffe der Form
SELECT * FROM Produkte WHERE PNr = :pnr ;
die vom DBS wie folgt ausgeführt werden:
1. Zugriff auf den Index "ProduktPNrIndex" über PNr
2. Zugriff auf das entsprechende Ergebnistupel.
Eine gute Zuordnung ist dann:
Produkte
T
Tablespace TS1
ProduktePNrIndex
T
Tablespace TS2
damit der Zugriffsarm auf der „Indexplatte“ nur wenig bewegt werden muss
und insbesondere nicht nach den Zugriffen auf die Ergebnistupel immer
wieder neu positioniert werden muss.
FS 2014
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-16
8
DB-System-Modell und Komponenten …
•
Der TM leitet eingehende
Operationen an den Scheduler
weiter. Im Falle von verteilten
DBMSen beinhaltet dies die
Kommunikation sowie die
Koordination verteilter
Transaktionen.
•
Der Scheduler entscheidet, ob
Operationen ausgeführt, zurückgewiesen oder verzögert werden.
•
Aufgabe des RM ist, die DB vor
Systemfehlern zu schützen (z.B.
wenn der transiente Speicher
verloren geht) und zu garantieren,
dass die Effekte abgeschlossener
Transaktionen dauer-haft sind
bzw. dass abgebrochene TA keine
Effekte hinterlassen.
•
Der CM (Pufferverwaltung) sorgt
für einen effizienten Zugriff auf
Daten.
FS 2014
Transaktionen
read / write / commit / abort
DBMS
TransaktionsManager (TM)
read / write / commit / abort
Scheduler
read / write / commit / abort
DataManager
Recovery-Manager (RM)
read /
write
fetch / flush
Cache-Manager (CM)
Cache
transienter Speicher
read /
write
flush
Datenbank
fetch
Log
persistenter Speicher
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-17
… DB-System-Modell und Komponenten
•
Module
– In der Praxis sind die einzelnen Module stark voneinander abhängig, deren
Implementierung also zumeist ineinander verzahnt (speziell um PerformanceGewinne zu erzielen)
– Trennung ist also eher konzeptioneller (didaktischer) Natur
– Weitergehende Aspekte sind in diesem abstrakten Modell komplett
ausgeblendet (wie z.B. die Anfrageoptimierung, die Abbildung einer SQLSchnittstelle auf read/write-Operationen, etc.)
FS 2014
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-18
9
4.3 Pufferverwaltung
•
Puffer = Hauptspeicherbereich, über den alle DBS-Daten aus den
Sekundärspeichern den Prozessen des Datenbanksystems bereitgestellt werden.
•
Alle DBS puffern häufig referenzierte Seiten (z.B. einen Teil der Indexseiten) im
Hauptspeicher. Die Grösse des Datenbankpuffers ist durch den
Datenbankadministrator spezifizierbar.
•
Um zu garantieren, dass auch wirklich relevante Daten im Puffer enthalten sind
braucht es spezielle Pufferersetzungsstrategien:
– Wenn der Puffer voll belegt ist und es wird eine Seite benötigt,
die nicht im Puffer vorhanden ist, muss eine gepufferte Seite ersetzt werden
(wie auch beim Caching im Betriebssystem).
– Falls die ersetzte Seite seit ihrer letzten Einlagerung in den Puffer geändert
wurde, muss sie vor ihrer Ersetzung erst noch auf Platte zurück geschrieben
werden (auch dies wie bei jedem Puffer, allerdings erfordert hier das etwaige
Rücksetzen der die Änderung verursachenden Transaktion weitere
datenbankspezifische Massnahmen (siehe späteres Kapitel)
FS 2014
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-19
Behandlung von Seitenfehlern
Bei Auftreten eines Seitenfehlers (Zugriff auf eine Seite, die nicht im Puffer enthalten
ist) geschieht folgendes:
1. Eine Seitensetzungsstrategie wählt aus den im Puffer vorhandenen Seiten die zu
ersetzende Seite aus.
2. Wenn die zu ersetzende Seite seit dem Einlesen geändert wurde, wird sie
auf den Hintergrundspeicher zurück geschrieben (dies ist mit Vorsicht zu
geniessen, vor allem dann wenn die zugehörige Transaktion, die die Änderung
verursacht hat, noch nicht beendet ist T später mehr dazu)
3. Die neue Seite wird vom Hintergrundspeicher in den freigewordenen
Seitenrahmen eingelesen. Die Seitentabelle wird aktualisiert.
Die Behandlung von Seitenfehlern muss möglichst effizient durchgeführt werden,
da Seitenwechsel sonst leicht zum Engpass des gesamten Systems werden.
Insbesondere sollten bei der Auswahl der zu ersetzenden Seite(n) immer solche
ausgewählt werden, auf die möglichst nicht gleich wieder zugegriffen wird. Denn
ansonsten müssten diese, auf Kosten anderer Seiten, gleich wieder eingelagert
werden.
FS 2014
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-20
10
Seitenersetzungsstrategien
Für die Auswahl einer zu ersetzenden Seite gibt es verschiedene Varianten:
1. OPT: Ersetzt die Seite, die in der Zukunft am längsten nicht benötigt wird.
Diese optimale Strategie ist aber leider nicht realisierbar (die Zukunft ist auf
für Seitenzugriffe nicht vorhersehbar).
2. Random: Es wird zufällig eine Seite im Puffer ausgewählt.
Vorteil: schnell und einfach zu realisieren.
Nachteil: Nimmt keinerlei Rücksicht auf das Seitenreferenzverhalten der
Anwendung (vor allem dann wenn auch auf Indexdaten
zugegriffen wird)
3. FIFO (First In, First Out): Diese Strategie ersetzt die älteste Seite im Puffer,
ohne Rücksicht darauf, ob sie zwischendurch benutzt wurde.
Vorteil: einfach zu realisieren (Zeitstempel wird beim Einlagern vergeben)
Nachteil: häufig verwendete Seiten werden genauso behandelt wie Seiten,
auf die nur einmal zugegriffen wird.
4. LRU (Least Recently Used): Jeder Seitenzugriff erzeugt einen Zeitstempel.
Die Seite mit dem ältesten Zeitstempel wird ersetzt.
Die beiden letzten Strategien benutzen das Zugriffsverhalten aus der Vergangenheit
zur Vorhersage des zukünftigen Zugriffsverhaltens. In der Praxis hat sich
insbesondere LRU bewährt.
FS 2014
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-21
Puffer – Optimale Ersetzungsstrategie
•
Ersetze diejenige Seite, die am weitesten in der Zukunft erst wieder benötigt
wird.
FS 2014
Zeit
Referenzierte Seite
1
1
2
2
3
3
4
2
5
4
6
3
7
5
8
1
Pufferinhalt
(Annahme: Puffer hat 3 Seitenrahmen)
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-22
11
Realistische (und typische) Ersetzungsstrategie
LRU (Least Recently Used):
• Ersetze diejenige Seite, auf die am längsten nicht mehr zugegriffen worden ist.
•
Zeit
Referenzierte Seite
1
1
2
2
3
3
4
2
5
4
6
3
7
5
8
1
Pufferinhalt
(Zugriff alt …… Zugriff neu)
Eine zusätzliche I/O-Optimierung ist möglich durch das Prefetching von Seiten,
von denen das DBS weiss, dass sie in naher Zukunft benötigt werden (z.B.
Relationen-Scan: sequentielles Lesen aller Seiten einer Relation).
FS 2014
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-23
Implementierung der LRU-Strategie
Zur Umsetzung der LRU-Strategie werden alle Seiten des Puffers in einer verketteten
Liste gespeichert, wobei die Seiten nach ihrem letzten Zugriff geordnet sind (die
Seite, auf die zuletzt zugegriffen wurde steht ganz vorne, die Seite, auf die am
längsten nicht mehr zugegriffen wurde, steht ganz hinten).
Beispiel zu LRU:
Zum Zeitpunkt T erfolgt ein Zugriff auf Seite 3. Diese Seite ist im Puffer, der Zugriff
ist also möglich. Zum Zeitpunkt T+1 wird daher die Seitenzugriffsliste entsprechend
angepasst. Zum Zeitpunkt T+1 soll auf eine Seite (9) zugegriffen werden, die nicht
im Puffer ist. Daher wird
Zugriff auf Seite 3
Zugriff auf Seite 9
die letzte Seite der Liste (2)
ausgewählt und verdrängt.
Zeit: T
Zeit: T+1
Zeit: T+2
Die neue Seite (9) wird dann
9
1
3
in den Seitenrahmen von 2
3
5
1
eingelagert und entsprechend
4
5
1
in der Seitenzugriffsliste
7
4
5
platziert.
0
7
4
6
3
2
0
6
2
7
0
6
Seitenzugriffsliste
Seitenzugriffsliste
Seitenzugriffsliste
FS 2014
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-24
12
Probleme mit reinem LRU …
Falls häufig Anfragen vom Typ
SELECT * FROM Produkte WHERE PNr = :pnr
mit Indexzugriff an das DBS gestellt werden (Annahme: Es gibt 2 Indexseiten und 20
Datenseiten für Produkte), dann kann es mit LRU zu folgenden Problemen kommen:
Zeit
Referenzierte
Seite
Pufferinhalt LRU
(Zugriff alt …. Zugriff neu)
Optimaler Pufferinhalt
1
I1
I1
I1
2
D1
I1
D1
3
I2
I1
D1
4
D11
D1
I2
5
I1
I2
D11 I1
6
D2
D11 I1
D2
7
I2
I1
D2
8
D12
D2
I2
9
…
FS 2014
I1
D1
I2
I1
D1
D11
I1
D11 I2
I1
D11 I2
I1
D2
I2
I2
I1
D2
I2
D12
I1
D12 I2
I2
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-25
… Probleme mit reinem LRU
Beispiel 2: Es werden gleichzeitig Anfragen a) und b) an ein DBS gestellt:
a) SELECT * FROM Kunden WHERE KNr = :knr – mit Indexunterstützung
b) SELECT SUM(summe) FROM Bestellungen – ohne Indexunterstützung.
Annahme: Es gibt 1 Indexseite für Kunden, 2 Datenseiten für Kunden und 20
Datenseiten für Bestellungen.
• Kommerzielle DBS eliminieren diese zweite Art von Problemen, indem sie
Seitenreferenzen von Relationen-Scans (sequentielles Lesen aller Seiten einer
Relation) speziell behandeln.
• Solche Seiten werden an das "wertlose" Ende der (modifizierten) LRU-Kette
gehängt.
FS 2014
Zeit
Referenzierte Seite
1
I1
2
K1
3
B1
4
I1
5
K2
6
B2
Pufferinhalt (4 Seitenrahmen)
Zugriff alt („wertlos“) … Zugriff neu („wertvoll“)
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-26
13
4.4 Speicherung & Adressierung von Datensätzen …
•
Tablespaces sind in Seiten (Speicherbereiche fester Grösse) eingeteilt. In einer
Seite werden ein oder mehrere Datensätze (Records) gespeichert.
•
Eine Seite ist die kleinste Einheit für den Transport zwischen Sekundärspeicher
und Hauptspeicher sowie für die Pufferung im Hauptspeicher.
•
Im Header werden
allgemeine Informationen zur Seite
veraltet …
•
•
Header
… danach folgt ein
Bereich, in dem die
eigentlichen Datensätze
gespeichert werden …
Datensatz1
Datensatz2
Datensatz3
Datensatz4
...
Datensatz5
… und schliesslich ein
so genanntes Slot Array
mit Verweisen auf die
einzelnen Records
... Slot5 Slot4 Slot3 Slot2 Slot1
FS 2014
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-27
… Speicherung & Adressierung von Datensätzen
•
Der durch Datensätze belegte Bereich in einer Seite wächst von vorne nach
hinten, das Slot-Array wächst von hinten nach vorne.
•
Der Header einer Seite enthält u.a. Angaben zu
– Grösse des gesamten freien Platzes in der
– Grösse des zusammenhängenden freien Platzes zwischen Datensätzen
und Slot-Array,
– Grösse des Slot-Arrays, usw.
Mögliches Speicherungsformat eines Datensatzes:
Record
Length AttrNo1 AttrLength1 AttrValue1
…
…
AttrNon AttrLengthn AttrValuen
Bei diesem Format werden Nullwerte überhaupt nicht gespeichert!
FS 2014
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-28
14
Stabilität der Satzadressierung
•
•
Sätze werden indirekt über die Slots einer Seite adressiert.
Vorteil dieser Adressierung: Sätze sind so innerhalb einer Seite verschiebbar,
ohne dass Zeiger in anderen Seiten geändert werden müssen.
PageNo: 1234
5 CDs
0.5
20
Basel
5000
... Slot5 Slot4 Slot3 Slot2 Slot1
Index
über
Lagerort
Index
über PNr
5
FS 2014
Basel
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-29
Stabilität der Tupeladressen durch Auslagerung
•
Beim Auslagern eines Satzes auf eine andere Seite wird in der ursprünglichen
Seite ein Overflow-TID hinterlassen.
– Die meisten Sätze sind mit einem Seitenzugriff adressierbar; eine Minderheit
ist mit zwei Seitenzugriffen adressierbar.
•
Bei einer Häufung von Overflow-TIDs ist eine Reorganisation nötig
(z.B. Unload & Load)
PageNo: 1234
PageNo: 4711
Overflow-TID
5 CDs
... Slot5 Slot4 Slot3 Slot2 Slot1
Index
über PNr
5
FS 2014
0.5
20
Basel
5000
... Slot5 Slot4 Slot3 Slot2 Slot1
Index
über
Lagerort
Basel
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-30
15
4.5 Indexstrukturen
•
Bei den meisten Anfragen werden nicht alle Tupel einer Relation (oder von
mehreren Relationen, im Falle von Joins) benötigt, sondern nur eine [kleine]
Teilmenge davon
•
Die Speicherung von Datensätzen ohne weitere Datenstrukturen würde jedoch
erzwingen, dass man bei jeder Anfrage die komplette Relation liest (table scan)
um die gesuchten Tupel zu identifizieren
•
Besser wäre es daher, wenn man direkt auf einzelne Tupel zugreifen könnte.
Dies ist die Aufgabe von Indexstrukturen.
•
Die Verwendung eines Index bedeutet jedoch, dass zusätzlicher Speicher
benötigt wird und dass Einfüge- bzw. Änderungsoperationen aufwändiger
werden, da nicht nur die eigentlichen Daten sondern auch die zugehörigen
Indexstrukturen angepasst werden müssen.
•
In den meisten Fällen werden B- bzw. B*-Bäume für die Realisierung von
Indexen verwendet (in einzelnen Fällen jedoch auch andere Technologien)
•
Im Kontext von Indexstrukturen spricht man von Schlüsseln –
damit sind jedoch nicht die Schlüssel aus dem relationalen Modell gemeint
sondern die Suchschlüssel der B- bzw. B*-Bäume, also die Attribute,
über die ein direkter Zugriff via Index zu den jeweiligen Tupeln möglich ist.
FS 2014
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-31
B-Bäume
Bei B-Bäumen handelt es sich um eine Variante einer ausgeglichenen (balancierten)
Baumstruktur (1977 von R. Bayer und E. McCreight vorgeschlagen).
B steht dabei nicht für binär, sondern für balanced.
Insbesondere sind B-Bäume Mehrwegbäume, die mehr als einen Eintrag pro Knoten
verwalten. Grundidee des B-Baumes ist, dass der Verzweigungsgrad variiert (also
nicht unbedingt = 2 ist sondern durchaus grösser sein darf), während die Höhe
balanciert bleibt.
B-Baume eigen sich durch den hohen Verzweigungsgrad sehr gut als Suchbäume
für Datenbanken, da der Verzweigungsgrad (und damit auch die Anzahl der Einträge
pro Knoten) so gewählt werden kann, dass ein Knoten des Baumes in genau eine
Datenbankseite passt. Da ein Knoten (bzw. eine Seite) mehrere Elemente umfassen
kann, lassen sich mit einem Speicherzugriff auch mehrere Elemente gleichzeitig
einlesen.
FS 2014
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-32
16
B-Baum: Vorüberlegung
•
In einem B-Baum kann jeder Knoten mehrere Einträge beinhalten und auch
mehr als 2 Kindknoten besitzen.
• Es müssen nicht alle Positionen in einem Knoten besetzt sein
Ø Dadurch gewinnt man Freiheitsgrade, die den Aufwand der Restrukturierung
begrenzen
• Ein Eintrag Ei in einem B-Baum besteht aus dem Suchschlüssel Si und dem
Datensatz Di, der diesen Suchschlüssel enthält
E1
...
FS 2014
E2
...
E3
X
...
X: Eintrag ist leer
...
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-33
B-Baum: Definition
Die minimale und maximale Anzahl von Einträgen, die in einem Knoten gespeichert
werden, wird durch die Ordnung m des B-Baums definiert:
Für einen B-Baum der Ordnung m gilt:
– Jeder Knoten enthält höchstens 2·m Einträge
– Die Wurzel enthält mindestens einen Eintrag, alle anderen Knoten enthalten
mindestens m Einträge
– Innere Knoten mit (aktuell) j Einträgen haben genau (j +1) Kindknoten
– Alle Blattknoten sind gleich weit von der Wurzel entfernt („gleiche Ebene“).
In den Blattknoten sind die Verweise nicht definiert.
Zusätzlich besitzt ein B-Baum auch die Suchbaum-Eigenschaft (Voraussetzung: es
muss also eine totale Ordnung auf den Suchschlüssel definiert sein).
Seinen S1, …, Sn die Schlüssel eines Knotens mit n+1 Kindern. V0, V1, …, Vn seien
die Verweise auf diese Kinder. Dann gilt:
– V0 weist auf einen Teilbaum mit Schlüsseln kleiner als S1
– Vi (i = 1, ..., n-1) verweist auf den Teilbaum, dessen Schlüssel zwischen
Si und Si+1 liegen
– Vn verweist auf den Teilbaum mit Schlüsseln grösser als Sn
FS 2014
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-34
17
Beispiel: B-Baum mit Ordnung m=2
Die Wurzel hat mindestens ein,
maximal 2·m=4 Elemente
minimal gefüllter
Knoten mit j=m=2
Elementen und j+1 =3
Kindknoten
• 14 • X • X • X •
• 9 • 11 • X • X •
...
...
...
• 15 • 17 •
...
...
maximal gefüllter Knoten
mit j = 2·m=4 Elementen
und j+1=5
25 • 31 • Kindknoten
...
...
...
alle Blattknoten
sind auf gleicher
Ebene
Der Einfachheit halber sind in jedem Knoten nur die Suchschlüssel dargestellt.
Gespeichert werden jedoch Suchschlüssel und Datensätze.
FS 2014
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-35
Beispiel: B-Baum
•
Beispiel: B-Baum über Attribut Bez der Relation Produkte
FS 2014
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-36
18
Suchen in B-Bäumen
•
Aufgrund der Struktur eines B-Baumes basiert das Suchen auf einer Kombination
des Verfolgens von Verweisen (wie im binären Suchbaum) zum Auffinden von
Knoten und der Suche in einer sortierten Folge (zum Auffinden eines Eintrags
innerhalb eines Knotens)
•
Beginnend mit der Wurzel wird der Knoten gesucht, der den gesuchten
Schlüsselwert k überdeckt. Das bedeutet, es muss der erste Eintrag gefunden
werden, der grösser oder gleich k ist
– Bei Gleichheit ist das gesuchte Element gefunden
– Ansonsten muss der Verweis vor diesem Element verfolgt werden
– Falls kein Element grösser oder gleich k gefunden wurde, dann muss der
letzte Verweis auf der Seite verfolgt werden
•
Erreicht man eine Blattseite, die den gesuchten Eintrag nicht enthält, dann
existiert dieser Eintrag im B-Baum nicht
FS 2014
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-37
Beispiel: Suche im B-Baum
Suchen nach dem Wert 25
• 14 • X • X • X •
• 9 • 11 • X • X •
...
...
...
• 15 • 17 • 25 • 31 •
...
...
...
...
...
Der Einfachheit halber sind in jedem Knoten nur die Suchschlüssel dargestellt.
Gespeichert werden jedoch Suchschlüssel und Datensätze.
FS 2014
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-38
19
Einfügen in B-Baum
Zunächst wird der Blattknoten lokalisiert, in dem das Element gemäss der totalen
Ordnung gehört (so dass die B-Baum-Eigenschaft erfüllt ist)
Ist dieser Knoten noch nicht voll (d.h. Anzahl Elementeneu § 2·m), kann das neue
Element dort gespeichert werden (unter Beibehaltung der Sortierung der Elemente
im Blattknoten)
Einfügen von 10:
• 14 • X • X • X •
• 9 • 11 • X • X •
• 15 • 17 • 25 • 31 •
• 14 • X • X • X •
• 9 • 10 • 11 • X •
• 15 • 17 • 25 • 31 •
Der Einfachheit halber sind in jedem Knoten nur die Suchschlüssel dargestellt.
Gespeichert werden jedoch Suchschlüssel und Datensätze.
FS 2014
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-39
Einfügen in B-Baum: Überlauf
Ist der Knoten voll (Anzahl Elementeneu = 2·m+1), dann beginnt eine so genannte
Überlauf-Behandlung, durch die der Knoten wird in zwei Teile aufgespaltet wird:
– es wird zunächst ein neuer Knoten erzeugt
– die ersten m Elemente bleiben im alten Knoten
– die letzten m Elemente werden in den neuen Knoten umgespeichert
– das Element in der Mitte wird in den Elternknoten aufgenommen
– der Verweis auf den neuen Knoten wird ebenfalls dort aufgenommen
FS 2014
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-40
20
Einfügen in B-Baum (mit Überlauf): Beispiel
Einfügen von 16:
• 14 • X • X • X •
• 9 • 10 • 11 • X •
• 15 • 17 • 25 • 31 •
• 14 • 17 • X • X •
• 9 • 10 • 11 • X •
• 15 • 16 • X • X • • 25 • 31 • X • X •
Der Einfachheit halber sind in jedem Knoten nur die Suchschlüssel dargestellt.
Gespeichert werden jedoch Suchschlüssel und Datensätze.
FS 2014
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-41
Einfügen in B-Baum: Überlauf der Wurzel
Das Einfügen des Mittelelements in den Elternknoten kann dort ebenfalls zu einem
Überlauf führen. Dies führt zu einer Überlaufbehandlung, die analog abläuft. Das
Propagieren von neuen Elementen nach oben kann sich bis zur Wurzel fortsetzen.
Für die Wurzel gibt es eine spezielle Überlaufbehandlung:
– Sie wird wie die anderen Knoten in zwei Teile gespalten
– Diese werden nun innere Knoten
– Es wird ein neuer Wurzelknoten erzeugt
– Das Mittelelement und die beiden Verweise werden dort gespeichert
Die Baumhöhe wächst also bei Wurzel-Überlauf um eins (und nur dann).
Alle Blätter sind nach wie vor gleich weit von der Wurzel entfernt
(1 mehr als vorher); die B-Baum-Eigenschaft bleibt also erhalten.
Das Einfügen erfordert also im ungünstigsten Fall, dass der Baum einmal ganz
hinunter gestiegen und dann bei der Überlaufbehandlung wieder ganz hinauf
traversiert werden muss. Dies geschieht also linear in der Baumhöhe.
FS 2014
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-42
21
Beispiel: Überlauf der Wurzel
Einfügen unterhalb der Wurzel führt zu Überlauf,
29 wird nach oben weiter gereicht:
• 11 • 14 • 20 • 38 •
...
...
...
...
29
...
...
• 20 •
• 11 • 14 • X • X •
...
...
...
...
• 29 • 38 • X • X •
...
...
Der Einfachheit halber sind in jedem Knoten nur die Suchschlüssel dargestellt.
Gespeichert werden jedoch Suchschlüssel und Datensätze.
FS 2014
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-43
Löschen aus B-Bäumen …
•
•
Beim Löschen aus einem B-Baum muss zunächst unterschieden werden, ob der zu
löschende Eintrag E in einem Blattknoten oder in einem inneren Knoten (bzw. der
Wurzel) gefunden wurde.
Löschen eines Eintrags aus einem Blattknoten
– Suche Blattknoten, der den zu löschenden Eintrag enthält
– Lösche den Eintrag aus dem Blattknoten
– Falls der Blattknoten Bi danach weniger als m Einträge hat, dann wird mit er
mit einem Nachbarknoten Bk verschmolzen (wenn der Nachbarknoten genau
m Einträge besitzt) oder er wird mit einem Eintrag des Nachbarknotens
ausgeglichen (k = i-1 oder i+1)
• Verschmelzen bedeutet, dass der entsprechende Eintrag des
Vaterknotens, die m-1 Einträge des Blatts Bi, und die m Einträge des
Nachbarknotens Bk ein neues Blatt bilden (mit der Maximalbelegung 2·m).
Es wird dann aus dem Vaterknoten ein Eintrag gelöscht
• Ausgleich bedeutet, dass der Eintrag des Vaterknotens zwischen Bi und Bk
in den untervollen Knoten Bi aufgenommen wird und das erste Element
von Bk in den Vaterknoten wandert (falls Bk rechter Nachbar), ansonsten
(Bk linker Nachbar) das letzte Element aus Bk
[Alternative: Ausgleich so, dass Bi und Bk danach gleich stark gefüllt sind]
FS 2014
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-44
22
… Löschen aus B-Bäumen
•
Löschen eines Eintrags aus einem Nicht-Blattknoten. Hier darf der Eintrag nicht
einfach entfernt werden. Vielmehr muss, um den Verzweigungsgrad des Baumes
aufrecht zu erhalten, ein Eintrag eines der beiden benachbarten Teilbäume nach
oben kopiert werden
– Suche Knoten, der den zu löschenden Eintrag E enthält
– Ersetze E durch E*. E* ist dabei entweder der grösste Eintrag des linken
Teilbaums oder der kleinste Eintrag des rechten Teilbaums
– Lösche E* aus dem entsprechenden Teilbaum (Unterscheidung, je nachdem
ob E* aus Blattknoten oder Nicht-Blattknoten stammt).
FS 2014
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-45
Beispiel: Löschen aus B-Baum …
Löschen von 9:
• 14 • X • X • X •
• 9 • 11 • X • X •
• 15 • 17 • 25 • 31 •
Der Einfachheit halber sind in jedem Knoten nur die Suchschlüssel dargestellt.
Gespeichert werden jedoch Suchschlüssel und Datensätze.
FS 2014
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-46
23
… Beispiel: Löschen aus B-Baum …
Löschen von 9:
• 14 • X • X • X •
• 9 • 11 • X • X •
• 17 • 25 • X • X •
Der Einfachheit halber sind in jedem Knoten nur die Suchschlüssel dargestellt.
Gespeichert werden jedoch Suchschlüssel und Datensätze.
FS 2014
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-47
… Beispiel: Löschen aus B-Baum
Löschen von 9:
• 19 • X • X • X •
• 9 • 16 • X • X •
•11•13•14•X•
• 17 • 25 • X • X •
...
...
...
...
•2•5•X•X•
Der Einfachheit halber sind in jedem Knoten nur die Suchschlüssel dargestellt.
Gespeichert werden jedoch Suchschlüssel und Datensätze.
FS 2014
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-48
24
Komplexität von B-Bäumen
•
Das Suchen, Einfügen und Löschen beschränken sich jeweils auf einen Pfad von
der Wurzel zu einem Blatt, sind also linear in der Baumhöhe
•
Insgesamt besitzt ein B-Baum der Ordnung m die Höhe logm n (ohne Beweis)
– Der Aufwand für Einfügen, Löschen und Suchen ist daher
logarithmisch in der Anzahl der Elemente
•
Wichtigste Eigenschaft eines B-Baums ist der hohe Verzweigungsgrad (dieser ist
natürlich abhängig von der Seitengrösse und der Grösse einzelner Tupel), um ein
effizientes Zugriffsverhalten zu garantieren
FS 2014
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-49
B*-Bäume
•
•
•
•
•
•
Wenn einzelne Tupel gross sind, dann reduziert sich der Verzweigungsgrad in
einem B-Baum. Damit erhöht sich jedoch die Höhe des Baumes und dadurch
auch der Aufwand für die Suche
Eine Variante von B-Bäumen, die einen hohen Verzweigungsgrad und damit
potentiell eine geringere Baumhöhe ermöglicht, sind B*-Bäume (in der
englischsprachigen Literatur oftmals auch als B+-Bäume zu finden).
In einem B*-Baum werden Datensätze nur in den Blättern gespeichert; innere
Knoten (und auch die Wurzel) enthalten lediglich „Wegweiser“ (also Suchschlüssel
und Verweise auf die Teilbäume jedoch OHNE die kompletten Datensätze).
Man bezeichnet B*-Bäume auch als „hohle Bäume“.
Einfügen in und Löschen aus B*-Bäumen verlaufen analog zu B-Bäumen
Um zusätzlich eine sequentielle Verarbeitung de Datensätze zu ermöglichen sind
die Blattknoten mit dem vorangehenden (P) und dem nachfolgenden (N)
Blattknoten verlinkt. Dies erlaubt, dass bei einem Scan der Relation in
Sortierreihenfolge des B*-Baums kein innerer Knoten gelesen werden muss.
Der Verzweigungsgrad (engl.: fan-out) eines B*-Baums liegt typischerweise
zwischen 50 und 400.
FS 2014
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-50
25
B*-Bäum: schematischer Aufbau
Index-Suche
•Sc• Sf • Sj • …• Sv •X•
Sequentielle
Suche
…
FS 2014
S S
S
P Dr Ds … Du N
r
s
u
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-51
B*-Baum – Beispiel
•
Index für Produktbezeichnung
Drucker
. . . | Band | . . .
FS 2014
Platte
. . . |Drucker | . . .
. . . | Papier | . . .
Datenbanken (CS243) – Speicher- und Zugriffssystem
. . . | Platte | . . .
4-52
26
Varianten von (B*-Baum-)Indexen
Unmittelbarer Index (direkter Index):
• die Blätter enthalten direkt die Datensätze
Mittelbarer Index (indirekter Index):
• die Blätter enthalten Suchschlüssel und Zeiger (TIDs) auf die Datensätze.
Bei Suchschlüsseln mit Duplikaten wird im Blattknoten beim Suchschlüssel eine
TID-Liste gespeichert.
T Für eine Relation kann es maximal einen unmittelbaren Index, aber beliebig viele
mittelbare Indexe geben.
Clustered Index:
• Die Datensätze sind –nach dem Laden– nach dem Suchschlüssel des Index
sortiert gespeichert
Unclustered Index:
• Es gibt keinen Zusammenhang zwischen dem Suchschlüssel des Index und der
Speicherungsreihenfolge der Datensätze.
Bemerkung:
T Für eine Relation kann es maximal einen clustered Index geben
FS 2014
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-53
Beispiel eines mittelbaren, clustered Index
B*-Baum-Index über Produktbezeichnung
B*-Baum
Drucker
Maus
Papier
Platte
Blattknoten
Indexseiten
Datenseiten
. . . | Band | . . .
. . . |Drucker
| ...
. . . | Maus | . . .
. . . | Papier | . . .
. . . | Platte | . . .
FS 2014
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-54
27
Beispiel eines mittelbaren, unclustered Index
•
B*-Baum-Index über Produktbezeichnung
B*-Baum
Drucker
Maus
Papier
Platte
Blattknoten
Indexseiten
Datenseiten
. . . | Maus | . . .
. . . |Platte
| ...
. . . | Band | . . .
. . . | Drucker | . . .
. . . | Papier | . . .
FS 2014
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-55
Speicher- & Zugriffskosten eines mittelbaren B*-Baum-Index
Beispiel: Index über Bestellungen.KNr.
Annahmen:
• Seitengröße: 4 KBytes (mit 96 Bytes Header)
• Füllgrad einer Seite: 70%
• Anzahl der Tupel in Bestellungen: 10‘000‘000
• Anzahl verschiedener KNr-Werte in Bestellungen: 100‘000
• Für jeden KNr-Wert gibt es gleich viele Tupel in Bestellungen
• Länge eines KNr-Werts: 24 Bytes
• Länge eines TIDs: 6 Bytes
• Länge eines Zeigers auf einen Teilbaum: 6 Bytes
Folgerungen:
FS 2014
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-56
28
4.6 Hashing
•
Oftmals werden auch Hash-Verfahren eingesetzt, um Anfragen effizient
auszuführen.
– Die Speicherung erfolgt in Behältern (buckets) mit Indexwerten von 0 bis
N-1.
– Für ein beliebiges Element e bestimmt die Hashfunktion h die Position h(e)
den Bucket, in dem das Element gespeichert wird. Dabei gilt für die
Hashfunktion h: E # [0, N-1] wobei E die Menge aller zu speichernder
Elemente ist.
– Die Funktion h sorgt dabei für eine „gute“ Verteilung der zu speichernden
Elemente. „Gut“ ist hier im Sinne von kollisionsfrei oder zumindest
kollisionsarm zu verstehen, wobei eine Kollision dann auftritt, wenn zwei
unterschiedliche Elemente auf denselben Bucket abgebildet werden, also
h(e1) = h(e2) mit e1 ∫ e2
Da sich Kollisionen im allgemeinen nicht vermeiden lassen (wenn z.B. mehr
als N Elemente gespeichert werden sollen) und da normalerweise die zu
speichernden Daten bei der Definition von h nicht bekannt sind kommt der
Behandlung von Kollisionen beim Hashing ein großer Stellenwert zu.
FS 2014
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-57
Behandlung von Kollisionen
Zur Behandlung/Behebung von Kollisionen beim Einfügen von Daten in eine Folge
mittels Hashing stehen zwei Grundprinzipien zur Verfügung
– Verkettung der Überläufer: Bei einem Überlauf wird eine verkettete Liste
aller derjenigen Elemente angelegt, die auf die gleiche Indexposition
abgebildet werden. Das erste Element belegt dabei den eigentlichen Platz
im Bucket, alle weiteren sind dann über Verwese zugreifbar
– Sondieren. Dies bezeichnet das Suchen nach einer alternativen Position
im Fall einer Kollision. Es gibt mehrere Verfahren für das Sondieren.
Die wichtigsten davon sind das lineare Sondieren und das quadratische
Sondieren.
FS 2014
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-58
29
Kollisionsbehandlung: Verkettung der Überläufer
•
Unter einem Überläufer versteht man ein Element, das eine bereits komplett
gefüllte Position zum Überlauf bringt. Da in einer normalen Hashtabelle pro
Bucket nur ein Element gespeichert werden kann, tritt dieser Überlauf bereits
mit dem zweiten Element mit gleichem Hashwert auf.
Beispiel:
0 20
Gegeben sei ein Feld mit 10 Buckets, h(e) = e mod 10
Einfügen von 20 40 70 90 10 30 60 50 80 100
mit verketteter Liste als Überlaufbehandlung
40
70
90
10
30
60
50
80
100
1
…
9
•
Die Verkettung als Kollisionsbehandlungsstrategie kann wiederum entarten und
zu einer linearen Liste werden.
FS 2014
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-59
Kollisionsbehandlung: Lineares Sondieren …
•
Die Verkettung von Überläufern benötigt zusätzlichen Speicher, auch wenn evtl.
noch freie Positionen im Feld vorhanden sind. Eine Alternative zur Verkettung
ist daher die Verwendung von anderen, noch unbesetzten Buckets in der
Hashtabelle. Den Prozess des Suchens nach solchen geeigneten Positionen
nennt man auch Sondieren.
•
Beim linearen Sondieren wird ausgehend von der bereits belegten Zielposition
h(e) in der Hashtabelle T, also T[h(e)] überprüft, ob die nachfolgenden Positionen
T[h(e)+1] , T[h(e)+2], …, T[h(e)+i], … für die Speicherung geeignet sind.
Die erste freie Position nach T[h(e)] wird dann für die Speicherung von e
verwendet.
Dabei wird implizit auch wieder die Hashfunktion angewandt, da die
nachfolgenden Elemente eigentlich auch wieder modulo der Feldgröße N
bestimmt werden (man setzt also beim Sondieren die Suche nach einem freien
Bucket vorne fort, wenn man am Ende der Hashtabelle angekommen ist).
T[(h(e) + 1) mod N] , T[(h(e) + 2) mod N], …, T([h(e) + i) mod N]
FS 2014
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-60
30
… Kollisionsbehandlung: Lineares Sondieren …
•
Das lineare Sondieren hat natürlich Auswirkungen auf die Suche. Bei einem
gegebenen Element e muss zunächst dessen Hashwert berechnet werden.
Ist die zugehörige Position durch ein Element e' ∫ e belegt, dann muss in der
Sondierreihenfolge weitergesucht werden, bis Element e gefunden wurde oder
bis eine unbesetzte Position gefunden ist. Um dies zu garantieren darf beim
Löschen der Wert nicht aus seiner Position entfernt werden sondern muss
lediglich als gelöscht gekennzeichnet werden.
Beispiel:
Gegeben sei ein Feld mit 10 Buckets, h(e) = e mod 10
Einfügen von 89 18 49 58 69 28
0
1
49
58
FS 2014
2
3
69
28
4
5
6
7
8
9
18
89
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-61
… Kollisionsbehandlung: Lineares Sondieren
Neben dem Sondieren der jeweils nachfolgenden Position sind die folgenden
Varianten des linearen Sondierens verbreitet:
– Anstelle des Inkrements 1 wird jeweils um den konstanten Wert c > 1
weiter gesprungen
T[(h(e)+c) mod N] , T[(h(e)+2·c) mod N], …, T([h(e)+i·c) mod N]
Dabei muss der Wert c in Abhängigkeit der Feldgröße N gewählt werden,
damit auch möglichst alle Positionen abgedeckt werden
(z.B. wenn c und N teilerfremd sind, also: ggT(c, N) = 1)
– Die Sondierung wird alternierend in beiden Richtungen durchgeführt
T[(h(e)+1) mod N], T[(h(e)-1) mod N], T[(h(e)+2) mod N],
T[(h(e)-2) mod N], …
FS 2014
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-62
31
Quadratisches Sondieren …
Das lineare Sondieren (insbesondere mit Inkrement 1 oder bei alternierendem
Sondieren) tendiert zur Bildung von „Klumpen“, in denen alle Positionen bereits
besetzt sind und durch die sich lange Sondierungsfolgen aufbauen.
Das quadratische Sondieren vermeidet dieses Problem, indem eine Folge von
Quadratzahlen für die Sondierabstände genommen werden (die Abstände erhöhen
sich also mit jeden Fehlversuch, eine freie Position zu finden)
Falls eine Position T[h(e)] bereits besetzt ist, dann werden der Reihe nach die
folgenden Positionen überprüft:
T[(h(e)+1) mod N] , T[(h(e)+4) mod N], T[(h(e)+9) mod N], …, T([h(e)+i2) mod N]
Auch hier kann man wieder die Variante des alternierenden Sondierens in beide
Richtungen anwenden:
T[(h(e)+1) mod N], T[(h(e)-1) mod N], T[(h(e)+4) mod N], T[(h(e)-4) mod N], …,
T([h(e)+i2) mod N], T([h(e)-i2) mod N], …
FS 2014
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-63
… Quadratisches Sondieren
Beispiel:
0
49
FS 2014
Gegeben sei ein Feld mit 10 Buckets, h(e) = e mod 10
Einfügen von 89 18 49 58 69 28
(ohne alternierendes Sondieren)
1
2
3
58
69
4
5
6
7
8
9
28
18
89
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-64
32
Komplexität des Hashens
•
Die Effizienz einer Hashspeicherung basiert sehr stark auf der Güte der
verwendeten Hashfunktion
•
Bei einer guten Hashfunktion ist die Wahrscheinlichkeit, dass ein Element e auf
Position j (0 § j § N-1) abgebildet wird gleich gross für alle j und damit 1/N.
Sind in einer Hashtabelle m Elemente abgespeichert, dann wird der Füllgrad
dieser Tabelle zu a = m/N bestimmt.
•
Im Fall ohne Kollision ist für das Einfügen von e lediglich h(e) zu berechnen und
es muss der Wert in die berechnete Position geschrieben werden. Beides
geschieht in konstanter Zeit O(1)
•
Analog muss für das Suchen die Position h(e) bestimmt werden und es erfolgt ein
Zugriff auf die berechnete Position, beides mit Aufwand O(1).
•
Analog ist auch die Komplexität des Löschens O(1) falls keine Kollision vorliegt.
Falls man Elemente tatsächlich löscht und nicht nur als gelöscht markiert, dann ist
beim Sondieren ein komplettes Re-hashen erforderlich (alle Elementpositionen
werden neu berechnet). Der Aufwand des Re-Hashens ist O(m).
FS 2014
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-65
Komplexität des Hashens mit Sondieren …
•
Die praktische Verwendung von Hashtabellen zeigt, dass sich bei einem
Füllgrad a > 0.8 (mehr als 80%) und der Verwendung von Sondierverfahren
das Verhalten beim Einfügen und Suchen drastisch verschlechtern kann.
•
a bestimmt nicht nur den Füllgrad der gesamten Hashtabelle sondern gibt auch
die Wahrscheinlichkeit an, mit der eine bestimmte Position h(e) der Tabelle
bereits belegt ist. Bei einer Kollision wird mittels Sondieren eine neue Position
bestimmt, die ebenfalls mit der Wahrscheinlichkeit a bereits belegt ist.
Daher lässt sich die Wahrscheinlichkeit, mit der die beiden ersten Versuche zur
Speicherung von e zu einer belegten Position führen mit a2 abschätzen.
•
Der Aufwand für die erfolglose Suche (das gesuchte Element befindet sich
nicht in der Hashtabelle) berechnet sich zunächst aus dem ersten Zugriff, mit
Wahrscheinlichkeit a einen zweiten, mit a2 einen dritten, mit ai einen i+1-ten,
usw. Insgesamt ergibt sich die Summenformel
1 + a + a2 + a3 + … = 1/ 1-a
Eine halb gefüllte Hashtabelle erfordert demnach im Mittel 2 Zugriffe, bei einem
Füllgrad von 90% sind es bereits 10.
FS 2014
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-66
33
… Komplexität des Hashens mit Sondieren
•
•
Der Aufwand für die erfolgreiche Suche ist etwas besser als die der erfolglosen
Suche, da bei die erfolgreiche Suche nach einem Treffer endet, die erfolglose
Suche jedoch bis zum ersten freien Platz fortgesetzt werden muss.
Der Aufwand für die erfolgreiche Suche (erwartete mittlere Anzahl von
Sondierungen) lässt sich zu
1/a · ln(1/ 1-a)
berechnen (ohne Beweis)
Für einen hohen Füllgrad (großes a) spielt der Faktor 1/a keine entscheidende
Rolle und kann vernachlässigt werden. Es dominiert daher ln(1/ 1-a), das aber
deutlich langsamer wächst als 1/ 1-a bei der erfolglosen Suche.
FS 2014
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-67
Dynamische Hashverfahren
Ein Problem der bisher betrachteten Hashverfahren ist ihre mangelnde Dynamik:
– der Wertebereich (die Bucket-Adressen) von 0 bis N-1 sind fest vorgegeben
– Falls die zu verwaltende Datenmenge steigt und sich der Füllgrad a erhöht,
wird auch das Antwortverhalten der Hashtabelle entsprechend schlechter.
– Die Erhöhung der Anzahl der Buckets erfordert ein komplettes Re-Hashen
aller bereits gespeicherter Daten, besitzt also den Aufwand O(m)
Das Ziel der dynamischen Hash-Verfahren ist es, dynamisch wachsende und
schrumpfende Wertebereiche zu unterstützen.
FS 2014
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-68
34
Dynamisch erweiterbarer Wertebereich …
•
•
Wenn der Füllgrad in einer Hashtabelle zu gross wird, dann sollte der
Wertebereich (also die Anzahl der Buckets) entsprechend erhöht werden.
Eine Variante des dynamischen Hashens verdoppelt jedes Mal den Wertebereich,
wenn der Füllgrad einen Schwellwert überschreitet
Dies lässt sich realisieren durch die Definition einer Familie von Hashfunktionen
hi: E # [0, …, (2i·N)-1] die über i indiziert werden.
Für i = 0 ist h0 die bereits bekannte Abbildung h0: E # [0, …, N-1]
Der Wert von i wird auch als Level der Hashfunktion bezeichnet.
•
Wenn der Wertebereich erhöht werden soll, dann wird einfach das Level der
Hashfunktion um eins erhöht, die Anzahl der Buckets wird dadurch verdoppelt.
FS 2014
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-69
… Dynamisch erweiterbarer Wertebereich
Um beim Übergang von einem Level zum nächsten die gespeicherten Elemente nicht
komplett umverteilen bzw. neu auf die doppelte Anzahl Buckets verteilen zu müssen,
fordert man für die Hashfunktion folgende Bedingung:
– hi+1(w) = hi(w) für etwa die Hälfte aller w œ E
– hi+1(w) = hi(w) + 2i·N für die andere Hälfte
Die Elemente, die einem Bucket durch hi zugeordnet wurden, lassen sich daher durch
hi+1 auf zwei Buckets verteilen:
– entweder auf j (d.h. sie bleiben an Ort und Stelle) oder
– auf j+(2i·N)
Diese Eigenschaft ist beispielsweise dann gegeben, wenn anstelle von einer Familie
von Hashfunktionen genau eine Hashfunktion h* gewählt wird, die einen Wert w auf
einen Bitstring abbildet. Von diesem Bitstring wird zunächst nur das erste Bit
verwendet. Bei jeder nötigen Verdopplung der Buckets wird einfach ein weiteres Bit
der bereits errechneten Hash-Werte betrachtet.
FS 2014
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-70
35
4.7 Indexe in SQL
Das Anlegen von Indexen ist in SQL nicht standardisiert. Es hat sich aber in den
meisten kommerziellen Datenbanksystemen folgende Syntax eingebürgert:
CREATE [UNIQUE] INDEX index-name ON table
( column {"," column} ) ...
DROP INDEX index-name;
Ein Index über den Attributen A1, A2, ..., Ak erlaubt die effiziente Bestimmung aller
Treffer für Prädikate der Form
– A1 = wert1 AND A2 = wert2 AND ... Aj = wertj (für 0 < j < k+1)
– sowie (in der „Standardimplementierung“) einen Relationen-Scan, bei dem
die Tupel sortiert nach A1 || A2 || ... || Aj zurückgeliefert werden.
FS 2014
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-71
Vergleich B*-Bäume und Hash-Tabellen
Welche Anfragen werden häufig gestellt ?
• Exact Match Queries
SELECT A1, …, An
FROM R
WHERE Ai = const
•
Range Queries
SELECT A1, …, An
FROM R
WHERE Ai > consti1 AND Ai < consti2
SELECT A1, …, An
FROM R
WHERE Ai < consti AND Aj < constj
FS 2014
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-72
36
Problem des Physischen Datenbankentwurfs
•
Gegeben:
– Datenbankschema (als Resultat des "logischen" Datenbankentwurfs)
– Lastprofil:
• Anfragetypen und deren Häufigkeiten
• Änderungsoperationen und deren Häufigkeiten
– Kosten-basierte Restriktionen (z.B. bzgl. Speicherplatz)
•
Gesucht:
– Festlegung von Speicherungsstrukturen und Zugriffspfaden (das physische
Datenbankschema), so dass die mittlere Antwortzeit bzw. die mittleren
Zugriffskosten minimiert werden.
T Aufgabe des DBA bzw. Performance-Spezialisten
T mathematische Optimierungsmodelle, "Tuning-Werkzeuge"
FS 2014
Datenbanken (CS243) – Speicher- und Zugriffssystem
4-73
37
Herunterladen