Erstellen von Indizes mit eingeschlossenen Spalten

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

In diesem Thema wird beschrieben, wie Sie eingeschlossene (oder nicht schlüsselfreie) Spalten hinzufügen, um die Funktionalität nicht gruppierter Indizes in SQL Server mithilfe von SQL Server Management Studio oder Transact-SQL zu erweitern. Indem Sie Nichtschlüsselspalten einschließen, erstellen Sie nicht gruppierte Indizes, die eine größere Anzahl von Abfragen abdecken. Dies ist der Fall, weil Nichtschlüsselspalten die folgenden Vorteile aufweisen:

  • Es kann sich um Datentypen handeln, die als Indexschlüsselspalten nicht zulässig sind.
  • Sie werden beim Berechnen der Anzahl der Indexschlüsselspalten oder der Indexschlüsselgröße nicht vom Datenbankmodul berücksichtigt.

Ein Index mit Nichtschlüsselspalten kann die Abfrageleistung erheblich steigern, wenn alle Spalten in der Abfrage in den Index als Schlüssel- oder Nichtschlüsselspalten eingeschlossen werden. Leistungsvorteile werden erzielt, weil der Abfrageoptimierer alle Spaltenwerte im Index finden kann; auf Daten der Tabelle oder des gruppierten Indexes wird nicht zugegriffen, sodass als Ergebnis weniger Datenträger-E/A-Vorgänge auftreten.

Hinweis

Wenn ein Index alle Spalten enthält, auf die eine Abfrage verweist, wird dies normalerweise als Abdecken der Abfragebezeichnet.

Vorbereitungen

Entwurfsempfehlungen

  • Überarbeiten Sie nicht gruppierte Indizes mit großen Indexschlüsseln so, dass nur Spalten, die für Suchen und Suchvorgänge verwendet werden, Schlüsselspalten sind. Erklären Sie alle anderen Spalten, die die Abfrage abdecken, zu Nichtschlüsselspalten. Auf diese Weise sind alle Spalten vorhanden, die zum Abdecken der Abfrage erforderlich sind, der Indexschlüssel selbst ist jedoch klein und effizient.

  • Schließen Sie Nichtschlüsselspalten in einen nicht gruppierten Index ein, um zu vermeiden, dass die aktuellen Indexgrößenbeschränkungen von maximal 32 Schlüsselspalten und eine maximale Indexschlüsselgröße von 1.700 Bytes (16 Schlüsselspalten und 900 Bytes vor SQL Server 2016 (13.x)) überschritten werden. Das Datenbankmodul berücksichtigt beim Berechnen der Anzahl der Indexschlüsselspalten oder der Indexschlüsselgröße keine nicht schlüsselfreien Spalten.

  • Die Reihenfolge von Nichtschlüsselspalten in der Indexdefinition wirkt sich nicht auf die Leistung von Abfragen aus, die den Index verwenden.

  • Vermeiden Sie sehr breite, nicht gruppierte Indizes, bei denen die enthaltenen Spalten keine schmal genug Teilmenge der zugrunde liegenden Tabellenspalten darstellen. Überprüfen Sie beim Hinzufügen umfangreicher Indizes immer, ob die Kosten für die Aktualisierung eines solchen Indexes die Kosten für direkte Lesevorgänge in der Tabelle aufwiegen.

Beschränkungen und Einschränkungen

  • Nichtschlüsselspalten können nur für nicht gruppierte Indizes definiert werden.

  • Alle Datentypen außer text, ntextund image können als Nichtschlüsselspalten verwendet werden.

  • Berechnete Spalten, die deterministisch und entweder präzise oder unpräzise sind, können als Nichtschlüsselspalten verwendet werden. Weitere Informationen finden Sie unter Indexes on Computed Columns.

  • Berechnete Spalten, die aus den Datentypen image, ntextund text abgeleitet werden, können Nichtschlüsselspalten sein, wenn der Datentyp der berechneten Spalte als Nichtschlüssel-Indexspalte zulässig ist.

  • Nichtschlüsselspalten können nur aus einer Tabelle gelöscht werden, wenn der Index der Tabelle zuvor gelöscht wird.

  • Nichtschlüsselspalten können nur zum Ausführen der folgenden Aufgaben geändert werden:

    • Ändern der NULL-Zulässigkeit der Spalte von NOT NULL in NULL.

    • Vergrößern der Länge von varchar-, nvarchar- oder varbinary -Spalten.

Sicherheit

Berechtigungen

Erfordert die ALTER-Berechtigung in der Tabelle oder Sicht. Der Benutzer muss ein Mitglied der festen Serverrolle sysadmin bzw. der festen Datenbankrollen db_ddladmin und db_owner sein.

Verwendung von SQL Server Management Studio

So erstellen Sie einen Index mit Nichtschlüsselspalten

  1. Klicken Sie im Objekt-Explorer auf das Pluszeichen, um die Datenbank zu erweitern, die die Tabelle enthält, in der Sie einen Index mit Nichtschlüsselspalten erstellen möchten.

  2. Klicken Sie auf das Pluszeichen, um den Ordner Tabellen zu erweitern.

  3. Klicken Sie auf das Pluszeichen, um die Tabelle zu erweitern, für die Sie einen Index mit Nichtschlüsselspalten erstellen möchten.

  4. Klicken Sie mit der rechten Maustaste auf den Ordner Indizes, zeigen Sie auf Neuer Index, und wählen Sie Nicht gruppierter Index... aus.

  5. Geben Sie in das Dialogfeld Neuer Index auf der Seite Allgemein den Namen des neuen Indexes in das Feld Indexname ein.

  6. Klicken Sie in der Registerkarte Indexschlüsselspalten auf Hinzufügen….

  7. Aktivieren Sie im Dialogfeld Spalten auswählen austable_name das oder die Kontrollkästchen der Tabellenspalte oder der Spalten, die dem Index hinzugefügt werden sollen.

  8. Klicken Sie auf OK.

  9. Klicken Sie auf der Registerkarte Eingeschlossene Spalten auf Hinzufügen....

  10. Aktivieren Sie im Dialogfeld Spalten auswählen austable_name das oder die Kontrollkästchen der Tabellenspalte oder der Spalten, die dem Index als Nichtschlüsselspalten hinzugefügt werden sollen.

  11. Klicken Sie auf OK.

  12. Klicken Sie im Dialogfeld Neuer Index auf OK.

Verwenden von Transact-SQL

So erstellen Sie einen Index mit Nichtschlüsselspalten

  1. Stellen Sie im Objekt-Explorer eine Verbindung mit einer Datenbank-Engine-Instanz her.

  2. Klicken Sie in der Standardleiste auf Neue Abfrage.

  3. Kopieren Sie das folgende Beispiel, fügen Sie es in das Abfragefenster ein, und klicken Sie auf Ausführen.

    USE AdventureWorks2022;  
    GO  
    -- Creates a nonclustered index on the Person.Address table with four included (nonkey) columns.   
    -- index key column is PostalCode and the nonkey columns are  
    -- AddressLine1, AddressLine2, City, and StateProvinceID.  
    CREATE NONCLUSTERED INDEX IX_Address_PostalCode  
    ON Person.Address (PostalCode)  
    INCLUDE (AddressLine1, AddressLine2, City, StateProvinceID);  
    GO  
    

CREATE INDEX (Transact-SQL)
Handbuch zum SQL Server-Indexentwurf