Erstellen eines gruppierten Indexes
Gilt für: SQL Server Azure SQL-Datenbank Azure SQL Managed Instance
Sie können mit SQL Server Management Studio gruppierte Indizes für Tabellen erstellen. Abgesehen von wenigen Ausnahmen sollte jede Tabelle über einen gruppierten Index verfügen. Ein gruppierter Index steigert nicht nur die Abfrageleistung, sondern kann bei Bedarf auch neu erstellt oder neu organisiert werden, um die Tabellenfragmentierung zu steuern. Ein gruppierter Index kann auch für eine Sicht erstellt werden. (Gruppierte Indizes sind im Artikel Gruppierte und nicht gruppierte Indizes definiert.)
Typische Implementierungen
Gruppierte Indizes werden auf folgende Weise implementiert:
PRIMARY KEY- und UNIQUE-Einschränkungen
Wenn Sie eine
PRIMARY KEY
-Einschränkung erstellen, wird automatisch ein eindeutiger gruppierter Index für die Spalte(n) erstellt, wenn noch kein gruppierter Index für die Tabelle vorhanden ist und Sie keinen eindeutigen nicht gruppierten Index angeben. Die Primärschlüsselspalte darf keineNULL
-Werte zulassen.Wenn Sie eine
UNIQUE
-Einschränkung erstellen, wird ein eindeutiger nicht gruppierter Index erstellt, um standardmäßig eineUNIQUE
-Einschränkung zu erzwingen. Sie können einen eindeutigen gruppierten Index angeben, wenn noch kein gruppierter Index für die Tabelle vorhanden ist.Ein Index, der als Bestandteil der Einschränkung erstellt wird, erhält automatisch denselben Namen wie die Einschränkung. Weitere Informationen finden Sie unter Primary and Foreign Key Constraints und Unique Constraints and Check Constraints.
Index unabhängig von einer Einschränkung
Sie können einen gruppierten Index für eine andere Spalte als die Primärschlüsselspalte erstellen, wenn eine nicht gruppierte Primärschlüsseleinschränkung angegeben wurde.
Begrenzungen
Beim Erstellen einer gruppierten Indexstruktur wird Speicherplatz sowohl für die alte Struktur (Quelle) als auch für die neue Struktur (Ziel) in den jeweiligen Dateien und Dateigruppen benötigt. Die Speicherzuordnung für die alte Struktur wird erst dann aufgehoben, wenn die vollständige Transaktion abgeschlossen ist. Eventuell wird weiterer Speicherplatz temporär für Sortierzwecke benötigt. Weitere Informationen finden Sie unter Disk Space Requirements for Index DDL Operations.
Wenn ein gruppierter Index in einem Heap mit mehreren nicht gruppierten Indizes erstellt wird, müssen alle nicht gruppierten Indizes neu erstellt werden, damit sie statt der Zeilen-ID (RID) den Gruppierungsschlüsselwert enthalten. Entsprechend gilt, dass beim Löschen eines gruppierten Indexes in einer Tabelle mit mehreren nicht gruppierten Indizes alle nicht gruppierten Indizes beim Ausführen der
DROP
-Anweisung neu erstellt werden. Dieser Prozess kann bei umfangreichen Tabellen sehr lange dauern.Beim Erstellen von Indizes für umfangreiche Tabellen sollten Sie möglichst mit dem gruppierten Index beginnen und dann die nicht gruppierten Indizes erstellen. Legen Sie gegebenenfalls die
ONLINE
-Option auf ON fest, wenn Sie Indizes für vorhandene Tabellen erstellen. Beim Wert ON werden keine lang andauernden Tabellensperren aufrechterhalten. Damit wird die Fortsetzung von Abfragen oder Updates für die zugrunde liegende Tabelle ermöglicht. Weitere Informationen finden Sie unter Ausführen von Onlineindexvorgängen .Der Indexschlüssel eines gruppierten Index kann keine Spalten des Datentyps varchar enthalten, bei denen Daten in der Zuordnungseinheit
ROW_OVERFLOW_DATA
vorhanden sind. Wird ein gruppierter Index für eine varchar-Spalte erstellt, bei der in der ZuordnungseinheitIN_ROW_DATA
Daten vorhanden sind, erzeugen alle nachfolgenden Einfügungen und Updates der Spalte einen Fehler, bei der diese Daten aus der Zeile entfernt werden. Zum Abrufen von Informationen zu Tabellen, die ggf. Daten mit Zeilenüberlauf enthalten, verwenden Sie die dynamische Verwaltungsfunktion sys.dm_db_index_physical_stats (Transact-SQL).
Berechtigungen
Erfordert die ALTER
-Berechtigung für die 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
Erstellen eines gruppierten Indexes aus dem Objekt-Explorer
Erweitern Sie im Objekt-Explorer die Tabelle, für die Sie einen gruppierten Index erstellen möchten.
Klicken Sie mit der rechten Maustaste auf den Ordner Indizes, zeigen Sie auf Neuer Index, und wählen Sie Gruppierter Index aus.
Geben Sie in das Dialogfeld Neuer Index auf der Seite Allgemein den Namen des neuen Indexes in das Feld Indexname ein.
Klicken Sie unter Indexschlüsselspalten auf Hinzufügen....
Aktivieren Sie im Dialogfeld Spalten auswählen aus table_name das Kontrollkästchen der Tabellenspalte, die dem gruppierten Index hinzugefügt werden soll.
Wählen Sie OK aus.
Klicken Sie im Dialogfeld Neuer Index auf OK.
Erstellen eines gruppierten Indexes mit dem Tabellen-Designer
Erweitern Sie im Objekt-Explorer die Datenbank, für die Sie eine Tabelle mit einem gruppierten Index erstellen möchten.
Klicken Sie mit der rechten Maustaste auf den Ordner Tabellen, und klicken Sie auf Neue Tabelle....
Erstellen Sie eine neue Tabelle. Weitere Informationen finden Sie unter Erstellen von Tabellen (Datenbank-Engine).
Klicken Sie mit der rechten Maustaste auf die zuvor erstellte neue Tabelle, und wählen Sie Entwurf aus.
Wählen Sie im Menü Tabellen-DesignerIndizes/Schlüsselaus.
Klicken Sie im Dialogfeld Indizes/Schlüssel auf Hinzufügen.
Wählen Sie im Textfeld Ausgewählter Primärschlüssel/eindeutiger Schlüssel oder Index den neuen Index aus.
Wählen Sie im Datenblatt Als CLUSTERED erstellenaus, und wählen Sie in der Dropdownliste rechts neben der Eigenschaft Ja aus.
Wählen Sie Schließen aus.
Klicken Sie im Menü Datei auf Speichern table_name.
Verwenden von Transact-SQL
Stellen Sie im Objekt-Explorer eine Verbindung mit einer Datenbank-Engine-Instanz her.
Klicken Sie in der Standardleiste auf Neue Abfrage.
Kopieren Sie das folgende Beispiel in das Abfragefenster, und klicken Sie dann auf Ausführen.
USE AdventureWorks2022; GO -- Create a new table with three columns. CREATE TABLE dbo.TestTable ( TestCol1 INT NOT NULL, TestCol2 NCHAR(10) NULL, TestCol3 NVARCHAR(50) NULL ); GO -- Create a clustered index called IX_TestTable_TestCol1 -- on the dbo.TestTable table using the TestCol1 column. CREATE CLUSTERED INDEX IX_TestTable_TestCol1 ON dbo.TestTable (TestCol1); GO
Weitere Informationen finden Sie unter CREATE INDEX (Transact-SQL).