Teilen über


Erstellen von Indizes mit eingeschlossenen Spalten

Gilt für: SQL Server Azure SQL-Datenbank Azure SQL Managed Instance

In diesem Thema wird beschrieben, wie eingeschlossene Spalten (oder Nichtschlüsselspalten) hinzugefügt werden, um die Funktionalität von nicht gruppierten 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 vom Datenbank-Engine nicht berücksichtigt, wenn die Anzahl der Indexschlüsselspalten oder die Indexschlüsselgröße berechnet wird.

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.

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, damit die Größenbegrenzungen des aktuellen Indexes von maximal 32 Schlüsselspalten und einer maximalen Größe des Indexschlüssels von 1.700 Byte (16 Schlüsselspalten und 900 Byte vor SQL Server 2016 (13.x)) nicht überschritten werden. Nichtschlüsselspalten werden von Datenbank-Engine beim Berechnen der Indexschlüsselspalten oder Indexschlüsselgröße nicht berücksichtigt.

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

  • Vermeiden Sie sehr umfangreiche nicht gruppierte Indizes, deren eingeschlossene Spalten eine Teilmenge der zugrunde liegenden Tabellenspalten repräsentieren, die nicht klein genug ist. Ü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.

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.

Verwenden von SQL Server Management Studio zum Erstellen eines Indexes 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 wollen.

  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 wollen.

  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 unter der Registerkarte Indexschlüsselspalten auf Hinzufügen....

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

  8. Wählen Sie OK aus.

  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. Wählen Sie OK aus.

  12. Klicken Sie im Dialogfeld Neuer Index auf OK.

Verwendung von Transact-SQL zum Erstellen eines 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 in das Abfragefenster, und klicken Sie dann 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