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.
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.
Es wird im Wesentlichen zwischen Nonclustered Index und Clustered Index unterschieden.
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!
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.
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.
Des Weiteren gibt es einige spezielle Indizes deren Bedeutung in der MSDN nachgelesen werden kann:
Index mit eingeschlossenen SpaltenVolltextRäumlich (für den Geography-Datentyp)Filtered (für fest definierte Teilmengen)XML (für den Datentyp XML)