Gruppierte und nicht gruppierte Indizes

Gilt für:SQL ServerAzure SQL-DatenbankAzure SQL Managed Instance

Ein Index ist eine Struktur auf dem Datenträger, die einer Tabelle oder einer Sicht zugeordnet ist und durch die das Abrufen von Zeilen aus der Tabelle oder Sicht beschleunigt wird. Ein Index enthält Schlüssel, die aus einer oder mehreren Spalten in der Tabelle oder Sicht erstellt werden. Diese Schlüssel werden in einer Struktur (B-Struktur) gespeichert, die es SQL Server ermöglicht, die den Schlüsselwerten zugeordneten Zeilen schnell und effizient zu finden.

Hinweis

In der SQL Server-Dokumentation wird der Begriff „B-Struktur“ im Allgemeinen in Bezug auf Indizes verwendet. In Zeilenspeicherindizes implementiert SQL Server eine B+-Struktur. Dies gilt nicht für Columnstore-Indizes oder In-Memory-Datenspeicher. Weitere Informationen finden Sie im Leitfaden zur Architektur und zum Entwerfen von SQL Server- und Azure SQL-Indizes.

Eine Tabelle oder Sicht kann die folgenden Indextypen enthalten:

  • Gruppiert

    • Gruppierte Indizes sortieren und speichern die Datenzeilen in der Tabelle oder Sicht basierend auf ihren Schlüsselwerten. Diese Schlüsselwerte sind die Spalten, die in der Indexdefinition enthalten sind. Pro Tabelle kann nur ein gruppierter Index vorhanden sein, da die Datenzeilen nur in einer Reihenfolge gespeichert werden können.  
    • Datenzeilen in einer Tabelle werden nur dann in sortierter Reihenfolge gespeichert, wenn die Tabelle einen gruppierten Index enthält. Wenn eine Tabelle einen gruppierten Index besitzt, wird die Tabelle als gruppierte Tabelle bezeichnet. Wenn eine Tabelle nicht über einen gruppierten Index verfügt, werden die Datenzeilen in einer nicht geordneten Struktur gespeichert, die als Heap bezeichnet wird.
  • Nicht gruppiert

    • Nicht gruppierte Indizes weisen eine Struktur auf, die von den Datenzeilen getrennt ist. Ein nicht gruppierter Index enthält die Schlüsselwerte des nicht gruppierten Indexes. Jeder Schlüsselwerteintrag verfügt über einen Zeiger auf die Datenzeile, die den Schlüsselwert enthält.

    • Der Zeiger von einer Indexzeile in einem nicht gruppierten Index auf eine Datenzeile wird als Zeilenlokator bezeichnet. Die Struktur des Zeilenlokators hängt davon ab, ob die Datenseiten in einem Heap oder einer gruppierten Tabelle gespeichert sind. Bei einem Heap ist der Zeilenlokator ein Zeiger auf die Zeile. Bei einer gruppierten Tabelle entspricht der Zeilenlokator dem Schlüssel des gruppierten Indexes.

    • Sie können der Blattebene des nicht gruppierten Indexes Nichtschlüsselspalten hinzufügen, um vorhandene Beschränkungen des Indexschlüssels zu umgehen und vollständig abgedeckte, indizierte Abfragen auszuführen. Weitere Informationen finden Sie unter Erstellen von Indizes mit eingeschlossenen Spalten. Ausführliche Informationen zu Indexschlüsselgrenzwerten finden Sie unter Maximale Kapazitätsspezifikationen für SQL Server.

Sowohl gruppierte als auch nicht gruppierte Indizes können eindeutig sein. Bei einem eindeutigen Index können keine zwei Zeilen denselben Wert für den Indexschlüssel aufweisen. Andernfalls ist der Index nicht eindeutig, und mehrere Zeilen können denselben Schlüsselwert gemeinsam nutzen. Weitere Informationen finden Sie unter Erstellen eindeutiger Indizes.

Indizes werden bei jeder Änderung der Tabellendaten automatisch für eine Tabelle oder Sicht verwaltet.

Weitere Arten von speziellen Indizes finden Sie unter "Indizes ".

Indizes und Einschränkungen

SQL Server erstellt automatisch Indizes, wenn PRIMARY KEY- und UNIQUE-Einschränkungen in Tabellenspalten definiert werden. Wenn Sie beispielsweise eine Tabelle mit einer UNIQUE-Einschränkung erstellen, erstellt Datenbank-Engine automatisch einen nicht gruppierten Index. Wenn Sie einen PRIMÄRSCHLÜSSEL konfigurieren, erstellt Datenbank-Engine automatisch einen gruppierten Index, es sei denn, ein gruppierter Index ist bereits vorhanden. Wenn Sie versuchen, eine PRIMARY KEY-Einschränkung für eine vorhandene Tabelle zu erzwingen, und für die Tabelle bereits ein gruppierter Index vorhanden ist, erzwingt SQL Server den primären Schlüssel mit einem nicht gruppierten Index.

Weitere Informationen finden Sie unter Erstellen von Primärschlüsseln und Erstellen eindeutiger Einschränkungen.

Verwendung von Indizes durch den Abfrageoptimierer

Gut gestaltete Indizes können Datenträger-E/A-Vorgänge reduzieren und weniger Systemressourcen verbrauchen. Daher verbessern diese Indizes die Abfrageleistung. Indizes können für verschiedene Abfragen hilfreich sein, die SELECT-, UPDATE-, DELETE- oder MERGE-Anweisungen enthalten. Sehen Sie sich die SELECT JobTitle, HireDate FROM HumanResources.Employee WHERE BusinessEntityID = 250 -Abfrage in der AdventureWorks2022 -Beispieldatenbank an. Wenn diese Abfrage ausgeführt wird, wertet der Abfrageoptimierer alle verfügbaren Methoden zum Abrufen der Daten aus und wählt dann die effizienteste Methode aus. Bei dieser Methode kann es sich um einen Tabellenscan oder möglicherweise um einen Scan eines Indexes oder mehrerer Indizes handeln, wenn Indizes vorhanden sind.

Während eines Tabellenscans liest der Abfrageoptimierer alle Zeilen in der Tabelle und extrahiert die Zeilen, die den Kriterien der Abfrage entsprechen. Ein Tabellenscan generiert zahlreiche E/A-Operationen des Datenträgers und kann ressourcenintensiv sein. Ein Tabellenscan kann jedoch die effizienteste Methode sein, wenn z. B. das Resultset der Abfrage einen großen Prozentsatz der Zeilen aus der Tabelle enthält.

Wenn der Abfrageoptimierer einen Index verwendet, werden die Indexschlüsselspalten durchsucht, der Speicherort der von der Abfrage benötigten Zeilen ermittelt und die entsprechenden Zeilen aus diesem Speicherort extrahiert. Im Allgemeinen ist das Durchsuchen des Indexes viel schneller als das Durchsuchen der Tabelle. Im Gegensatz zu einer Tabelle enthält ein Index häufig sehr wenige Spalten pro Zeile, und die Zeilen sind sortiert.

Der Abfrageoptimierer wählt beim Ausführen von Abfragen normalerweise die effizienteste Methode aus. Wenn jedoch keine Indizes verfügbar sind, muss der Abfrageoptimierer einen Tabellenscan verwenden. Ihre Aufgabe besteht darin, Indizes zu entwerfen und zu erstellen, die optimal für Ihre Umgebung geeignet sind, damit der Abfrageoptimierer seine Auswahl unter mehreren effizienten Indizes treffen kann. SQL Server stellt die Datenbankoptimierungsratgeber bereit, um die Analyse Ihrer Datenbankumgebung und bei der Auswahl geeigneter Indizes zu unterstützen.

Wichtig

Weitere Informationen zu Indexentwurfsrichtlinien und Internen finden Sie in der SQL Server- und Azure SQL-Indexarchitektur und im Entwurfshandbuch.

Nächste Schritte