Richtlinien für den Entwurf gruppierter Indizes

Gruppierte Indizes sortieren und speichern die Datenzeilen in den Tabellen basierend auf ihren Schlüsselwerten. Pro Tabelle kann nur ein gruppierter Index vorhanden sein, da die Datenzeilen nur in einer Reihenfolge sortiert werden können. Weitere Informationen zur Architektur gruppierter Indizes finden Sie unter Gruppierte Indexstrukturen.

Mit wenigen Ausnahmen sollte für jede Tabelle ein gruppierter Index für die Spalte(n) definiert werden, auf die Folgendes zutrifft:

  • Sie kann für häufig verwendete Abfragen verwendet werden.

  • Sie stellt einen hohen Grad an Eindeutigkeit bereit.

    HinweisHinweis

    Wenn Sie eine PRIMARY KEY-Einschränkung erstellen, wird automatisch ein eindeutiger Index für die Spalte(n) erstellt. Standardmäßig ist dieser Index gruppiert; Sie können jedoch auch einen nicht gruppierten Index angeben, wenn Sie die Einschränkung erstellen.

  • Sie kann in Bereichsabfragen verwendet werden.

Wenn der gruppierte Index nicht mit der UNIQUE-Eigenschaft erstellt wird, fügt Database Engine (Datenbankmodul) der Tabelle automatisch eine 4 Byte große uniqueifier-Spalte hinzu. Wenn erforderlich, fügt Database Engine (Datenbankmodul) einer Zeile automatisch einen uniqueifier-Wert hinzu, um jeden Schlüssel eindeutig zu machen. Diese Spalte und ihre Werte werden intern verwendet und können durch Benutzer nicht angezeigt werden. Der Zugriff durch Benutzer auf diese ist ebenfalls nicht möglich.

Überlegungen zu Abfragen

Bevor Sie gruppierte Indizes erstellen, sollten Sie sich überlegen, wie der Zugriff auf die Daten erfolgt. Einen gruppierten Index können Sie für Abfragen verwenden, die die folgenden Aktionen durchführen:

  • Zurückgeben eines Wertebereichs, indem z. B. folgende Operatoren verwendet werden: BETWEEN, >, >=, < und <=.

    Sobald mithilfe des gruppierten Indexes die Zeile mit dem ersten Wert gefunden wird, ist sichergestellt, dass Zeilen mit nachfolgenden Indexwerten physisch benachbart sind. Wenn eine Abfrage z. B. häufig Datensätze aus einem Bereich von Bestellnummern abruft, kann ein gruppierter Index für die SalesOrderNumber-Spalte schnell die Zeile finden, die die Startbestellnummer enthält, und dann alle nachfolgenden Zeilen in der Tabelle abrufen, bis die letzte Verkaufsauftragsnummer erreicht ist.

  • Zurückgeben umfangreicher Resultsets.

  • Verwenden von JOIN-Klauseln; in der Regel handelt es sich dabei um Fremdschlüsselspalten.

  • Verwenden von ORDER BY- oder GROUP BY-Klauseln.

    Durch einen Index für Spalten, die in der ORDER BY- oder GROUP BY-Klausel angegeben werden, entfällt ggf. die Notwendigkeit für Database Engine (Datenbankmodul), die Daten zu sortieren, da die Zeilen bereits sortiert sind. Die Abfrageleistung wird somit verbessert.

Überlegungen zu Spalten

Die Definition des gruppierten Indexschlüssels sollte im Allgemeinen so wenig Spalten wie möglich umfassen. Ziehen Sie Spalten in Betracht, auf die ein oder mehrere der folgenden Merkmale zutreffen:

  • Sie sind eindeutig oder enthalten zahlreiche unterschiedliche Werte.

    Eine Mitarbeiter-ID identifiziert einen Mitarbeiter z. B. eindeutig. Ein gruppierter Index oder eine PRIMARY KEY-Einschränkung für die EmployeeID-Spalte verbessert die Leistung von Abfragen, die basierend auf der Mitarbeiter-ID nach Mitarbeiterinformationen suchen. Alternativ kann ein gruppierter Index für LastName, FirstName, MiddleName erstellt werden, weil Mitarbeiterdatensätze häufig auf diese Weise gruppiert und abgefragt werden; die Kombination dieser Spalten stellt trotzdem zahlreiche unterschiedliche Werte bereit.

  • Der Zugriff auf sie erfolgt sequenziell.

    Eine Produkt-ID identifiziert z. B. Produkte in der Production.Product-Tabelle in der AdventureWorks2008R2-Datenbank eindeutig. Abfragen, in denen eine sequenzielle Suche angegeben wird, z. B. WHERE ProductID BETWEEN 980 and 999, profitieren von einem gruppierten Index für ProductID. Die Ursache liegt darin, dass die Zeilen für diese Schlüsselspalte in sortierter Reihenfolge gespeichert werden.

  • Sie wird als IDENTITY definiert, weil Eindeutigkeit der Spalte in der Tabelle garantiert ist.

  • Sie wird häufig verwendet, um die aus einer Tabelle abgerufenen Daten zu sortieren.

    Es kann sinnvoll sein, die Tabelle für die betreffende Spalte zu gruppieren (d. h., physisch zu sortieren), damit nicht bei jeder Abfrage der Spalte Kosten für einen Sortiervorgang entstehen.

Die Verwendung eines gruppierten Indexes ist nicht empfehlenswert, wenn die Spalten die folgenden Merkmale aufweisen:

  • Spalten, die häufig geändert werden.

    In diesem Fall würde die gesamte Zeile verschoben, weil Database Engine (Datenbankmodul) die physische Reihenfolge der Datenwerte der Zeile aufrechterhalten muss. Dieser Aspekt sollte insbesondere bei Systemen berücksichtigt werden, in denen Transaktionsverarbeitung in großem Umfang erfolgt und Daten nur selten von Dauer sind.

  • Ausführliche Schlüssel.

    Ausführliche Schlüssel sind aus mehreren Spalten oder mehreren großen Spalten zusammengesetzt. Die Schlüsselwerte aus dem gruppierten Index werden von allen nicht gruppierten Indizes als Suchschlüssel verwendet. Alle nicht gruppierten Indizes, die für dieselbe Tabelle definiert werden, sind erheblich größer, da die Einträge des nicht gruppierten Indexes den Gruppierungsschlüssel sowie die Schlüsselspalten enthalten, die für diesen nicht gruppierten Index definiert wurden.

Indexoptionen

Beim Erstellen eines gruppierten Indexes können verschiedene Indexoptionen angegeben werden. Da gruppierte Indizes in der Regel recht groß sind, sollten Sie die folgenden Optionen sorgfältig prüfen:

  • SORT_IN_TEMPDB

  • DROP_EXISTING

  • FILLFACTOR

  • ONLINE

Weitere Informationen finden Sie unter Festlegen von Indexoptionen.