MS SQL-Server

Knowledge Base

MS SQL-Server > Datenbank-Funktionen > Indizierung

Was ist ein nicht-gruppierter (nonclustered) Index?

Bei einem nicht-gruppierten (nonclustered) Index handelt es sich um eine separat zu den Daten gespeicherte Suchstruktur (im Gegensatz zu einem gruppierten (clustered) Index bei dem die Daten geordnet in einer Suchstruktur physisch auf dem Datensträger gespeichert sind).

Der nicht-gruppierte (nonclustered) Index wird ebenfalls (wie ein gruppierter (clustered) Index) als B*-Baum-Struktur sortiert gemäß der Schlüsselspalten gespeichert. Auf Blattebene befindet sich aber ein sogenannter Zeilenlokator (row locator) der auf den eigentlichen Datensatz verweist (und evtl. die Daten sogenannter enthaltener Spalten).

Der Aufbau des Zeilenlokators hängt von der physischen Speicherung der Tabelle ab:

  • Heap: In diesem Fall ist der Zeilenlokator eine sogenannte Zeilen-ID (row ID), die aus Datei nummer (file id, 2 Byte) / Seitennummer (page id, 4 Byte) und position des Datensatzes auf der Seite (slot, 2 Byte) besteht
  • Gruppierter Index: In diesem Fall besteht der Zeilenlokator aus den Indexschlüsselspalten des gruppierten Index

 

 

 

 

Nicht-gruppierte (nonclustered) Indizes können mittlerweile wie gruppiertere (clustered) Indizes aufgebaut werden - da auch bei einem nicht-gruppierten (nonclustered) Index zusätzliche (enthaltene) Spalten definiert werden können, nach denen der Index nicht sortiert wird, die aber auf Blattebene des Index abgelegt werden - damit sind bei Erreichen der Blattebene diese Daten ebenfalls vorhanden (und müssen nicht separat über einen Zeilenlokator geladen werden). Dies ist also relevant für Abfragen, bei denen nur Spalten (inkl. enthaltener Spalten) des Index selektiert werden (die Abfrage also durch den Index vollständig "abgedeckt" wird).