SQL-Montag: Was sind Datenbank-Indizes und welche Arten gibt es?

Tuesday, April 05, 2011 12:11:09 AM (Mitteleuropäische Sommerzeit, UTC+02:00)

Wie schon letzte Woche, stellt Thomas Mentzel wieder einige Fragen in seinem Blog, die es zu beantworten gilt.
Am heutigen SQL-Montag steht die Frage im Raum, was Datenbank-Indizes sind und welche Arten es gibt.
Da ich mir beim letzten Mal schon die SQL Frage geschnappt habe, werde ich heute wieder versuchen diese Frage zu beantworten.

Hinweis: Indizes können nicht komplett in einem kleinen Blogeintrag abgehandelt werden, deshalb ist es ratsam, das Thema in der MSDN zu vertiefen. Hier ist ein guter Einstiegspunkt.

Was sind Indizes?

Ein Index (Singular von Indizes) wird in einer Datenbank genutzt, um Abfragen und Sortiervorgänge zu beschleunigen. Mit Hilfe von Indizes kann die Menge an Daten reduziert werden, die von der Festplatte gelesen werden müssen, um das Abfrageergebnis zu ermitteln. Weiterhin können Indizes die Eindeutigkeit von Daten in einer Tabelle erzwingen.

database-indizes

Es wird im Wesentlichen zwischen Nonclustered Index und Clustered Index unterschieden.

Clustered Index (gruppierter Index)

Ein Clustered Index speichert die Zeilen der zugrunde liegenden Tabelle in sortierter Reihenfolge des Clustered Index Schlüssels. Dieser Schlüssel ist die Spalte die zur Indizierung ausgewählt wurde, wobei auch mehrere Spalten ausgewählt werden können. Pro Tabelle kann nur ein gruppierter Index gesetzt werden, da die Datenzeilen nur in einer Reihenfolge sortiert werden können.
Ein Beispiel: Wir haben eine Tabelle Kunde mit den Spalten ID und Kundenname. Es wurde ein Clustered Index auf die Spalte ID gesetzt.
Fragen wir den Kunden mit der ID 77 ab, geht dies extrem schnell. Suchen wir jedoch nach einem Kunden mit dem Namen ‚Meyer‘ dauert dies viel länger, da der SQL Server jeden Eintrag im Clustered Index durchgehen muss.
Wird in einer Tabelle eine Identity Spalte definiert, wird automatisch ein Clustered Index für diese Spalte erstellt!

Nonclustered Index (nicht gruppierter Index)

Ein Nonclustered Index enthält den Wert des indizierten Schlüssels und den Zeiger auf den Speicherort der restlichen Daten. Der Nonclustered Index ist mit dem Inhaltsverzeichnis eines Buches vergleichbar. Im Inhaltsverzeichnis steht der Wert (z.B. das Schlagwort) nach dem gesucht wird und die Seitennummer (der Zeiger) auf der die restlichen Informationen zu finden sind.
Nonclustered Indizes sind aus diesem Grund sehr gut für Abfragen geeignet, die nach genauen Übereinstimmungen suchen. Wenn in unserer Kundentabelle also ständig nach Kundennamen gesucht wird, wird ein Nonclustered Index auf die Spalte Kundenname von Vorteil sein.
Nonclustered Indizes können auf Tabellen mit Clustered Index angewendet werden, sowie auch auf Heap-Tabellen. Eine Heap-Tabelle ist eine Tabelle die nicht über einen Clustered Index verfügt. Pro Tabelle können mehrere (bis zu 999) Nonclustered Index erstellt werden.

Unique

Sowohl Clustered Indizes als auch Nonclustered Indizes können Unique (eindeutig) sein.
Ein Beispiel hierzu: Wir haben wieder unsere Kundentabelle mit der Spalte ID und der Spalte Kundenname. Auf diese Tabelle wird ein Nonclustered Index gesetzt der für die Spalte Name eindeutig sein soll.
Wenn versucht wird, zwei gleiche Namen einzufügen, gibt es folgende Fehlermeldung:

Cannot insert duplicate key row in object 'dbo.Kunden with unique index 'Index1'

Mit dieser Möglichkeit kann die Datenintegrität der Tabellendaten sichergestellt werden.

Weitere Indizes

Des Weiteren gibt es einige spezielle Indizes deren Bedeutung in der MSDN nachgelesen werden kann:

Index mit eingeschlossenen Spalten
Volltext
Räumlich (für den Geography-Datentyp)
Filtered (für fest definierte Teilmengen)
XML (für den Datentyp XML)

Wenn ihnen der Artikel gefallen hat oder er für sie hilfreich war,
bitte "kicken" sie ihn.

Kick it on dotnet-kicks.de


Thursday, April 14, 2011 11:59:30 AM (Mitteleuropäische Sommerzeit, UTC+02:00)
Schöner Artikel! Noch eine kleine Anmerkung, wie man sich anhand eines Beispiels aus der Sachbücherwelt (Buch = DB-Tabelle) den Unterschied zwischen gruppiertem und nicht gruppierten Index klar machen kann:
Der gruppierte Index entspricht einem Lexikon. Um einen Eintrag zu finden, blättere ich direkt in den (meist alphabetisch) sortierten Seiten. Es kann in einem Buch nur eine solche "physische" Einteilung (nach einem "Attribut", z.B. Thema) geben.
Dagegen kommt der nicht gruppierte Index eher einem Register nahe. Hier schaue ich zuerst im Register nach, auf welcher Seite ein Eintrag zu finden ist und muss dann, um auf den Eintrag zuzugreifen, erst noch zur ausgewiesenen Seite blättern. Mehrere Einträge im Register können auf einunddenselben Eintrag verweisen. In einem Buch kann es mehrere Register (z.B. nach Themen, Autoren, Orten) geben.
Dorrit Riemenschneider
Comments are closed.