Begriffe

Zugriffsmethode

Bezeichnet die notwendigen Schritte zum Lesen / Speichern / Löschen eines Datensatzes

Heap Dateien

Unsortierte Dateien, Daten werden in Reihenfolge des Einfügens geschrieben

Lesen

Immer lineare Suche nötig
(Bei Scan / Punkt- und Bereichssuche)

Einfügen

Immer am Ende anfügen, sehr schnell

Löschen

Datensatz wird gefunden und gelöscht, in der Regel wird der Speicherplatz nicht wiederverwendet.

Bei häufigem Löschen muss in gewissen Zeitabständen reorganisiert werden.

Sortierte Dateien

Datensätze sind nach einem oder mehreren Attributen sortiert

Lesen

Scan: Sequentielles Lesen der ganzen Datei

Punktsuche: Binary Search möglich

Bereichssuche: Punktsuche nach erstem Element, danach sequenziell lesen

Einfügen

Suche Einfügestelle mit Binary Search
Seite reorganisieren um Platz für neuen Eintrag zu schaffen

Eventuell überlaufende Einträge auf nächster Seite erneut einfügen (Kann beliebig lange kaskadieren)

Ausweg

Durch separate Überlauf / Transaktionsdatei kann die wiederholte kaskadierung etwas gehemmt werden.

Löschen

Suche der Löschstelle
Entfernen des Eintrags

Hash-Dateien

Hash des Eintrags berechnet Seite auf der Eintrag gespeichert werden soll.

Weil Hash-Verteilung zufällig scheint wird dieses Verfahren auch als “random File” genannt

Einfügen

Berechnung des Hashs, einfügen auf dieser Seite.

Falls kein Platz frei ist, muss sondiert werden:

Lineares Sondieren

Es wird der erste freie Platz nach der berechneten Adresse gewählt

Besonders beim Löschen anderer Datensätze (Bsp. auf Seite 1) kann unübersichtlich werden, wo der auf Seite 3 geplante Eintrag hin-sondiert wurde.

Nichtverkettete Überläufer

Es wird ein spezieller Bereich für Überläufer zur Verfügung gestellt.


Es kann ein Verweis auf die Speicherstelle im Überlaufbereich notiert werden, um die Suche dort zu beschleunigen.

Dynamisches Hashing

Soll dynamische Dateigrößen ermöglichen.

Idee: Hashwert mit Bit Ergebnis wird berechnet.

Es wird versucht nur Buckets für alle Datensätze zu verwenden, Zuordnung über die letzten Bits des Hashwerts.

Ablauf:

  • Fall 1: Seite hat noch freien Platz: Füge Element ein
  • Fall 2: Seite ist voll:
    • Fall 2.A: Lokale Tiefe = Globale Tiefe:
      • Erhöhe globale und lokale Tiefe um 1
      • Erweitere Directory
      • Splitte übergelaufenen Bucket auf
      • Weise entsprechende Zeiger zu
    • Fall 2.B: Lokale Tiefe < Globale Tiefe:
      • Erhöhe lokale Tiefe um 1
      • Splitte übergelaufenen Bucket auf
      • Weise entsprechende Zeiger zu
    • In beiden Fällen: Re-Hashing der Elemente des übergelaufenen Bucket

Beispiel Dynamisches Hashing

Seien die folgenden Elemente und ihre Hashwerte gegeben:

ElementHash-Wert
Z101000
B100101
V001110
M100110
F110001
K010110
X010010

Die Einträge sollen in der Gegebenen Reihenfolge eingefügt werden, Buckets haben die Größe .
Für die ersten drei Einträge ist das Einfügen trivial.

Um Platz für den vierten Wert zu schaffen, muss die Seite aufgeteilt werden. Da die lokale und globale Tiefe beide bei liegen, wird sie auf erhöht, die Seite aufgeteilt und alle enthaltenen Elemente erneut zugeordnet.

Das Einfügen von ist in diesem Zustand problemlos, bei Eintrag muss erneut aufgeteilt werden.

Bemerkenswert ist, dass die Bitkombinationen und beide auf den selben Bucket mit lokaler Tiefe von verweisen. So wird nur dort Speicherplatz allokiert, wo er auch wirklich notwendig ist.

Der Effekt ist nach dem Einfügen von noch stärker sichtbar.

Klausuraufgabe

Einfügen von mehreren Elementen mit Aufsplittung überlaufender Buckets
Siehe Folie 1 — 45 bis 1 — 58

Lesen

Konstante Zugriffszeiten möglich

Einfügen

Schnell, eventuell muss gesplittet werden, jedoch ist der Aufwand hier lokal beschränkt

Löschen

Schnell, Hash-Wert berechnen und löschen.

Notiz

Theoretisch müsste das Splitting auch rückgängig gemacht werden, wird typischerweise nicht gemacht.
Reduktion des Datenbankvolumens eher manuell durch DB-Admin

Vergleich

Von Heap Dateien, Sortierte Dateien und Hash-Dateien

Begriffe

Index

Ist eine Sekundärorganisation mit der auch nach nicht-Schlüsselattributen gesucht werden kann.

Die Verwendung eines Index kann große Performance Verbesserungen bringen, erfordert aber zusätzlichen Speicherplatz und Aufwand um sie aktuell zu halten.

Anfragearten

Sequentieller Zugriff

(Sortiert)
“Alle Mitarbeiter, sortiert nach PersNummer”

Direkter Zugriff

Punktabfrage
“Mitarbeiter mit PersNummer 49”

Direkter Zugriff

Multi-Punktabfrage
“Alle Mitarbeiter der IT-Abteilung”

Bereichszugriff

“Alle Mitarbeiter mit Gehalt zwischen 2000 und 3000”

Existenztest

“Gibt es einen Mitarbeiter mit PersNummer 123”

Indexstrukturen

Primärindex

Der Primärindex ist eine sortierte Datei mit Indexeinträgen.
Jeder einzelne dieser Einträge besteht dabei aus einem Schlüssel und einem Zeiger auf den entsprechenden Datensatz / Block.

Dichter Index

Ein Eintrag pro Indexattributwert
Alle Sätze direkt lokalisierbar

Dünner Index

Jeweils erster Satz einer Seite wird indexiert
Setzt sortierte Datei voraus

Vergleich

Bei einem dünnen Index muss die Relation nach diesem Indexattribut sortiert sein. Entsprechend kann nur maximal ein einzelner dünner Index pro Relation verwendet werden.
Ein dichter Index benötigt mehr Speicherplatz, hier gibt es aber keine Beschränkung bezüglich der Anzahl gleichzeitig eingesetzter Indixe.

Clusterindex

Strategie ist das Speichern von logisch zusammenhängenden Datensätzen in physisch benachbarten Stellen. Dabei wird der Index (beinahe) gleich geordnet.
Für jeden Eintrag wird die Form <K(i), P(i)> verwendet, wobei Ein Eintrag pro Indexattributwert ist und auf die Position verweist, an der zum ersten Mal vorkommt.
Es wird dabei ein dünner Index verwendet.
Besonders ist hier, dass zu jedem möglichen Wert von ein Eintrag im Index gespeichert wird.

Sekundärindex

Hängt nicht mit der physischen Speicherung zusammen und kann über beliebige Attribute erstellt werden.

  • <Value>, TID (Eindeutige Werte)
    Für mehrdeutige Attribute wird dabei eine Liste mit allen Matches gespeichert (Invertierte Liste)
  • <Value>, ListOfTIDs

Um konstante Größen zu erreichen kann die Liste der TIDs auch indirekt gespeichert werden. So verweist jeder Indexeintrag auf exakt eine Liste, diese enthalten dann jeweils beliebig viele TIDs.

Mehrstufiger Index

Auch der Index einer entsprechend großen Datenmenge wird groß (= zu groß für den Hauptspeicher).
Um weiterhin schnell zu suchen, kann ein Index über diesen Index gebildet werden.
Mit mehreren Schichten kann so das Volumen des höchsten Levels reduziert werden, bis er vollständig im Hauptspeicher gehalten werden kann.