Beschreibung von gruppierten und nicht gruppierten IndizesClustered and Nonclustered Indexes Described

DIESES THEMA GILT FÜR:jaSQL Server (ab 2016)jaAzure SQL-DatenbankneinAzure SQL Data Warehouse neinParallel Data WarehouseTHIS TOPIC APPLIES TO: yesSQL Server (starting with 2016)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

Weitere Informationen, die sich auf vorherige Versionen von SQL Server beziehen, finden Sie unter Beschreibung von gruppierten und nicht gruppierten Indizes.For content related to previous versions of SQL Server, see Clustered and Nonclustered Indexes Described.

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.An index is an on-disk structure associated with a table or view that speeds retrieval of rows from the table or view. Ein Index enthält Schlüssel, die aus einer oder mehreren Spalten in der Tabelle oder Sicht erstellt werden.An index contains keys built from one or more columns in the table or view. Diese Schlüssel werden in einer Struktur (B-Struktur) gespeichert, die es SQL ServerSQL Server ermöglicht, die den Schlüsselwerten zugeordneten Zeilen schnell und effizient zu finden.These keys are stored in a structure (B-tree) that enables SQL ServerSQL Server to find the row or rows associated with the key values quickly and efficiently.

Eine Tabelle oder Sicht kann die folgenden Indextypen enthalten:A table or view can contain the following types of indexes:

  • GruppiertClustered

    • Gruppierte Indizes sortieren und speichern die Datenzeilen in der Tabelle oder Sicht basierend auf ihren Schlüsselwerten.Clustered indexes sort and store the data rows in the table or view based on their key values. Dies sind die Spalten, die in der Indexdefinition enthalten sind.These are the columns included in the index definition. Pro Tabelle kann nur ein gruppierter Index vorhanden sein, da die Datenzeilen nur in einer Reihenfolge sortiert werden können.There can be only one clustered index per table, because the data rows themselves can be sorted in only one order.

    • Datenzeilen in einer Tabelle werden nur dann in sortierter Reihenfolge gespeichert, wenn die Tabelle einen gruppierten Index enthält.The only time the data rows in a table are stored in sorted order is when the table contains a clustered index. Wenn eine Tabelle einen gruppierten Index besitzt, wird die Tabelle als gruppierte Tabelle bezeichnet.When a table has a clustered index, the table is called a clustered table. Wenn eine Tabelle nicht über einen gruppierten Index verfügt, werden die Datenzeilen in einer nicht geordneten Struktur gespeichert, die als Heap bezeichnet wird.If a table has no clustered index, its data rows are stored in an unordered structure called a heap.

  • Nicht gruppiertNonclustered

    • Nicht gruppierte Indizes weisen eine Struktur auf, die von den Datenzeilen getrennt ist.Nonclustered indexes have a structure separate from the data rows. 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.A nonclustered index contains the nonclustered index key values and each key value entry has a pointer to the data row that contains the key value.

    • Der Zeiger von einer Indexzeile in einem nicht gruppierten Index auf eine Datenzeile wird als Zeilenlokator bezeichnet.The pointer from an index row in a nonclustered index to a data row is called a row locator. Die Struktur des Zeilenlokators hängt davon ab, ob die Datenseiten in einem Heap oder einer gruppierten Tabelle gespeichert sind.The structure of the row locator depends on whether the data pages are stored in a heap or a clustered table. Bei einem Heap ist der Zeilenlokator ein Zeiger auf die Zeile.For a heap, a row locator is a pointer to the row. Bei einer gruppierten Tabelle entspricht der Zeilenlokator dem Schlüssel des gruppierten Indexes.For a clustered table, the row locator is the clustered index key.

    • Sie können der Blattebene des nicht gruppierten Indexes Nichtschlüsselspalten hinzufügen, um vorhandene Beschränkungen des Indexschlüssels (900 Bytes und 16 Schlüsselspalten) zu umgehen und vollständig abgedeckte, indizierte Abfragen auszuführen.You can add nonkey columns to the leaf level of the nonclustered index to by-pass existing index key limits, 900 bytes and 16 key columns, and execute fully covered, indexed, queries. Weitere Informationen finden Sie unter Create Indexes with Included Columns.For more information, see Create Indexes with Included Columns.

    Sowohl gruppierte als auch nicht gruppierte Indizes können eindeutig sein.Both clustered and nonclustered indexes can be unique. Dies bedeutet, dass nicht derselbe Indexschlüsselwert für zwei oder mehr Zeilen verwendet werden darf.This means no two rows can have the same value for the index key. Andernfalls handelt es sich nicht um einen eindeutigen Index, und mehrere Zeilen können denselben Schlüsselwert verwenden.Otherwise, the index is not unique and multiple rows can share the same key value. Weitere Informationen finden Sie unter Erstellen eindeutiger Indizes.For more information, see Create Unique Indexes.

    Indizes werden bei jeder Änderung der Tabellendaten automatisch für eine Tabelle oder Sicht verwaltet.Indexes are automatically maintained for a table or view whenever the table data is modified.

    Zusätzliche Indextypen für besondere Zwecke finden Sie unter Indexes .See Indexes for additional types of special purpose indexes.

Indizes und EinschränkungenIndexes and Constraints

Indizes werden automatisch erstellt, wenn PRIMARY KEY- und UNIQUE-Einschränkungen für Tabellenspalten definiert werden.Indexes are automatically created when PRIMARY KEY and UNIQUE constraints are defined on table columns. Wenn Sie z. B. eine Tabelle erstellen und eine bestimmte Spalte als Primärschlüssel angeben, erstellt DatenbankmodulDatabase Engine automatisch eine PRIMARY KEY-Einschränkung und einen Index für die betreffende Spalte.For example, when you create a table and identify a particular column to be the primary key, the DatenbankmodulDatabase Engine automatically creates a PRIMARY KEY constraint and index on that column. Weitere Informationen finden Sie unter Create Primary Keys und Create Unique Constraints.For more information, see Create Primary Keys and Create Unique Constraints.

Verwenden von Indizes durch den AbfrageoptimiererHow Indexes Are Used by the Query Optimizer

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.Well-designed indexes can reduce disk I/O operations and consume fewer system resources therefore improving query performance. Indizes können bei einer Vielzahl von Abfragen hilfreich sein, die die Anweisungen SELECT, UPDATE, DELETE oder MERGE enthalten.Indexes can be helpful for a variety of queries that contain SELECT, UPDATE, DELETE, or MERGE statements. Sehen Sie sich die SELECT Title, HireDate FROM HumanResources.Employee WHERE EmployeeID = 250 -Abfrage in der AdventureWorks2012AdventureWorks2012 -Beispieldatenbank an.Consider the query SELECT Title, HireDate FROM HumanResources.Employee WHERE EmployeeID = 250 in the AdventureWorks2012AdventureWorks2012 database. 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.When this query is executed, the query optimizer evaluates each available method for retrieving the data and selects the most efficient method. 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.The method may be a table scan, or may be scanning one or more indexes if they exist.

Bei der Ausführung eines Tabellenscans liest der Abfrageoptimierer alle Zeilen in der Tabelle und extrahiert dann die Zeilen, die die Abfragekriterien erfüllen.When performing a table scan, the query optimizer reads all the rows in the table, and extracts the rows that meet the criteria of the query. Ein Tabellenscan generiert zahlreiche E/A-Operationen des Datenträgers und kann ressourcenintensiv sein.A table scan generates many disk I/O operations and can be resource intensive. 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.However, a table scan could be the most efficient method if, for example, the result set of the query is a high percentage of rows from the table.

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.When the query optimizer uses an index, it searches the index key columns, finds the storage location of the rows needed by the query and extracts the matching rows from that location. Im Allgemeinen ist das Durchsuchen des Indexes wesentlich schneller als das Durchsuchen der Tabelle, weil ein Index im Gegensatz zu einer Tabelle häufig nur sehr wenige Spalten pro Zeile enthält und die Zeilen eine sortierte Reihenfolge aufweisen.Generally, searching the index is much faster than searching the table because unlike a table, an index frequently contains very few columns per row and the rows are in sorted order.

Der Abfrageoptimierer wählt beim Ausführen von Abfragen normalerweise die effizienteste Methode aus.The query optimizer typically selects the most efficient method when executing queries. Wenn jedoch keine Indizes verfügbar sind, muss der Abfrageoptimierer einen Tabellenscan verwenden.However, if no indexes are available, the query optimizer must use a table scan. 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.Your task is to design and create indexes that are best suited to your environment so that the query optimizer has a selection of efficient indexes from which to select. SQL ServerSQL Server stellt den [Datenbankoptimierungsratgeber](../../relational-databases/performance/database-engine-tuning-advisor.md) bereit, der Sie bei der Analyse Ihrer Datenbankumgebung und der Auswahl der geeigneten Indizes unterstützt.(../../relational-databases/performance/database-engine-tuning-advisor.md) to help with the analysis of your database environment and in the selection of appropriate indexes.

Erstellen gruppierter IndizesCreate Clustered Indexes

Erstellen nicht gruppierter IndizesCreate Nonclustered Indexes