Indexe (Indizies)

Ein Index ist ein Verzeichnis der Gestalt Wert, Adresse, wobei die Werte Daten aus einer zugehörigen Tabelle? sind und Adresse entsprechende Zeiger (Pointer) auf den zugehörigen Datensatz in der Tabelle?. Ein Index wird immer für eine zugehörige Tabelle? erzeugt. Wird diese Tabelle gelöscht, dann werden auch alle zugehörigen Inizes gelöscht. Die Daten eines Index werden beim Erstellen automatisch vom DBS mit den bereits vorhandenen Daten der zugehörigen Tabelle gefüllt. Bei Manipulationen (DML) der Daten in der Tabelle werden die Informationen im Index automatisch vom DBS aktuell gehalten, was zur Folge hat, dass dass die Manipulationsanweisungen INSERT, UPDATE, DELETE? etwas länger dauern.

Es gibt drei Arten Indexe, zu erstellen:

Die Erstellung eines Index erfolgt in der Regel vor dem Hintergrund, dass Anfragen über gewissen Spalten zu langsam sind. Ein Index beschleunigt Anfragen aus verschiedenen Gründen:

  • Bei einem zeitaufwändigen Ladevorgang von Daten von der Platte (Leseoperation von der I/O-Einheit) werden aufgrund der geringen Datensatzgrößen beim Index eine ungemein größere Anzahl an Suchinformationen in den Hauptspeicher übertragen, als bei unter Umständen recht großen Datensätzen in der Tabelle.
  • Ein Index ist eigentlich sortiert und damit können entsprechend optimierte Suchalgorithmen verwendet werden.
  • Die Speicherung der Daten einer Tabelle können nur nach einem Attribut sortiert werden. Indexe ermöglichen somit auch für weitere Spalten eine Sortierung.
  • Werden in der Anfrage nur Spalten der Tabelle verwendet, die auch im Index vorkommen, dann kann vom DBS auf den Tabellenzugriff verzichtet werden, denn alle Infos sind somit viel schneller im Index zu finden.

Richtlinien zum Anlegen eines INDEX:

  • Die Spalte wird häufig als Suchbedingung in Abfragen verwendet.
  • Die Spalte wird häufig als Join-Bedingung zur Verbindung unterschiedlicher Tabellen verwendet.
  • Die Spalte enthält einen großen Bereich an unterschiedlichen Werten.
  • Die Tabelle hat viele Tupel.

In einem dichten Index sind alle Datensätze, in einem dünnen Index sind nur einige ausgewählte Datensätze eingetragen. Primärindizes (Primärschlüssel, SQL: PRIMRAY KEY) halten die physische Anordnung der indizierten Datei fest, Sekundärindizes (SQL: UNIQUE) beschleunigen den Zugriff über Nicht-Primärschlüsselspalten.

Man unterscheidet physische und logische Adressen: Bei den logischen Adressen ist nicht die direkte, physische Speicheradresse, sondern eine logische Blocknummer mit einzelnen Tupeln gespeichert.

Beispiele:

Es sei folgende Mitarbeiter-Relation gegeben und die Relation Abteilungen:

Mita_IDNameVornameOrtAbt_IDGehalt
4711MüllerAgatheGummersbach103000,00
4897SchmittErwinGummersbach202500,00
4713MeierHugoKöln203400,00
4944SchmitdElseGummersbach20 
4560BäckerErnaKöln103200,00
4567BauerErwinKöln103100,00
 CREATE TABLE Mitarbeiter (Mita_ID     NUMBER(16)  PRIMARY KEY,
                           Name        VARCHAR(50) NOT NULL, 
                           Vorname     VARCHAR(50) NOT NULL, 
                           Ort         VARCHAR(60) NOT NULL, 
                           Abt_ID      NUMBER(16)  REFERENCES Abteilungen (Abt_ID), 
                           Gehalt      NUMBER(10,2) 
                          );
 -- Hier ein vom DBS automatsch angelegter Index für das Constraint Primary Key Mita_ID: 
Mita_IDAdresse
4560AF45790CCBAA3484
4567AF45790BCCAA3478
4711AF45790CCABA3400
4713AF45790CCAA2B474
4897AF45790CCB339AAC
4944AF45790CCA45B83B
  -- Ein explizit angelegter Index über Name und Vorname.
  -- Es ist ein aus 2 Attributen zusammengesetzter Index.
  -- Bei zusammengesetzten Indizies macht die Attributreichenfolge einen grvierenden Unterschied. 
  -- Er ist nicht eindeutig, da grundsätzlich Vor- und Nachname nicht ausreichen, 
  -- eine Person eindeutig zu identifizieren.

  CREATE INDEX Mita_Name_idx ON Mitarbeiter(Name, Vorname)
NameVornameAdresse
BäckerErnaAF45790CCBAA3484
BauerErwinAF45790BCCAA3478
MeierHugoAF45790CCAA2B474
MüllerAgatheAF45790CCABA3400
SchmitdElseAF45790CCA45B83B
SchmittErwinAF45790CCB339AAC

Siehe auch: Bitmap-Index, Funktionsbasierter-Index

Quellen:

  • ANSI/ISO/IEC 9075-1:2003. Part 1 "SQL/Framework", ISO International Organization for Standardization / ANSI American National Standards Institute, September 2003
  • ANSI/ISO/IEC 9075-2:2003. Part 2 "SQL/Foundation", ISO International Organization for Standardization / ANSI American National Standards Institute, Dezember 2003
  • Elmasri, Ramez/Navathe, Shamkant B.: "Grundlagen von Datenbanksystemen" , Pearson Studium, München, 2002, ISBN 3-8273-7021-3
  • Faeskorn-Woyke, Heide/Bertelsmeier, Birgit/Riemer, Petra/Bauer, Elena: "Datenbanksysteme - Theorie und Praxis mit SQL2003, Oracle und MySQL", Pearson Education, München, 2007, ISBN 978-3-8273-7266-6
  • Kemper, Alfons/Eickler, André: "Datenbanksysteme", Oldenbourg, München, 2009, 978-3-486-59018-0
  • Melton, Jim/Simon, Alan R.: "SQL: 1999 - Understanding Relational Language Components", Morgan Kaufmann, San Francisco, 2001, ISBN 1558604561
  • Oracle® Database SQL Language Reference 11g Release 2 (11.2), E17118-03, August 2010, http://download.oracle.com/docs/cd/E11882_01/server.112/e17118.pdf
  • Saake, Gunter/Sattler, Kai-Uwe/Heuer, Andreas: "Datenbanken - Konzepte und Sprachen", mitp-Verlag, Redline GmbH, Heidelberg, 2007, ISBN 3-8266-1664-2
  • Vossen, Gottfried: "Datenmodelle, Datenbanksprachen und Datenbankmanagementsysteme", Oldenbourg, München, 2008, ISBN 978-3-486-27574-2

Kategorie: Speicherstrukturen, SQL, I