Freigeben über


Gruppierte und nicht gruppierte Indizes

Gilt für:SQL ServerAzure SQL-DatenbankVerwaltete Azure SQL-InstanzSQL-Datenbank in Microsoft Fabric

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.

Note

In der Dokumentation wird der Begriff „B-Struktur“ im Allgemeinen in Bezug auf Indizes verwendet. In Zeilenspeicherindizes implementiert die Datenbank-Engine 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:

  • Clustered

    • 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.
  • Nonclustered

    • 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 Index Nichtschlüsselspalten hinzufügen, um vorhandene Beschränkungen des Indexschlüssels zu umgehen und vollständig abgedeckte Abfragen auszuführen. Weitere Informationen finden Sie unter Erstellen von Indizes mit eingeschlossenen Spalten. Weitere Informationen zu Einschränkungen von Indexschlüsseln finden Sie unter Spezifikationen der maximalen Kapazität für SQL Server.

Sowohl gruppierte als auch nicht gruppierte Indizes können eindeutig sein. Ein eindeutiger Index bedeutet, dass nicht derselbe Indexschlüsselwert für zwei oder mehr Zeilen verwendet werden darf. Andernfalls handelt es sich nicht um einen eindeutigen Index, und mehrere Zeilen können denselben Schlüsselwert verwenden. Weitere Informationen finden Sie unter Erstellen eines eindeutigen Indexes.

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

Weitere Indextypen für besondere Zwecke finden Sie unter Indexes .

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 das Datenbankmodul automatisch einen nicht gruppierten Index. Wenn Sie ein PRIMARY KEYDatenbankmodul konfigurieren, wird automatisch ein gruppierter Index erstellt, 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 ein gruppierter Index in dieser Tabelle bereits vorhanden ist, erzwingt SQL Server den Primärschlüssel mithilfe eines nicht gruppierten Indexes.

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

Verwenden von Indizes durch den Abfrageoptimierer

Sorgfältig entworfene Indizes können die E/A-Operationen dem Datenträger verringern und weniger Systemressourcen belegen. Sie optimieren aus diesem Grund 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 AdventureWorks2025 -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 Index oder mehrerer Indizes handeln, wenn Indizes vorhanden sind.

Während der Ausführung eines Tabellenscans liest der Abfrageoptimierer alle Zeilen in der Tabelle und extrahiert dann die Zeilen, die die Abfragekriterien erfüllen. 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 geht 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 den Datenbankoptimierungsratgeber bereit, der Sie bei der Analyse Ihrer Datenbankumgebung und der Auswahl der geeigneten Indizes unterstützt.

Important

Weitere Informationen zu den Richtlinien und Besonderheiten für das Entwerfen von Indizes finden Sie unter Leitfaden zur Architektur und zum Entwerfen von SQL Server- und Azure SQL-Indizes.