Erstellen gruppierter IndizesCreate Clustered Indexes

Dieses Thema gilt für: JaSQL ServerJaAzure SQL-DatenbankkeineAzure SQL Data Warehouse keine Parallel DatawarehouseTHIS TOPIC APPLIES TO: yesSQL ServeryesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

Sie können gruppierte Indizes für Tabellen mithilfe von SQL Server Management StudioSQL Server Management Studio oder Transact-SQLTransact-SQL erstellen.You can create clustered indexes on tables by using SQL Server Management StudioSQL Server Management Studio or Transact-SQLTransact-SQL. Abgesehen von wenigen Ausnahmen sollte jede Tabelle über einen gruppierten Index verfügen.With few exceptions, every table should have a clustered index. Ein gruppierter Index steigert nicht nur die Abfrageleistung, sondern kann bei Bedarf auch neu erstellt oder neu organisiert werden, um die Tabellenfragmentierung zu steuern.Besides improving query performance, a clustered index can be rebuilt or reorganized on demand to control table fragmentation. Ein gruppierter Index kann auch für eine Sicht erstellt werden.A clustered index can also be created on a view. (Gruppierte Indizes sind im Thema Beschreibung von gruppierten und nicht gruppierten Indizesdefiniert.)(Clustered indexes are defined in the topic Clustered and Nonclustered Indexes Described.)

In diesem ThemaIn This Topic

Vorbereitungen Before You Begin

Typische Implementierungen Typical Implementations

Gruppierte Indizes werden auf folgende Weise implementiert:Clustered indexes are implemented in the following ways:

  • PRIMARY KEY- und UNIQUE-EinschränkungenPRIMARY KEY and UNIQUE constraints

    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.When you create a PRIMARY KEY constraint, a unique clustered index on the column or columns is automatically created if a clustered index on the table does not already exist and you do not specify a unique nonclustered index. Die Primärschlüsselspalte darf keine NULL-Werte zulassen.The primary key column cannot allow NULL values.

    Wenn Sie eine UNIQUE-Einschränkung erstellen, wird ein eindeutiger nicht gruppierter Index erstellt, um standardmäßig eine UNIQUE-Einschränkung zu erzwingen.When you create a UNIQUE constraint, a unique nonclustered index is created to enforce a UNIQUE constraint by default. Sie können einen eindeutigen gruppierten Index angeben, wenn noch kein gruppierter Index für die Tabelle vorhanden ist.You can specify a unique clustered index if a clustered index on the table does not already exist.

    Ein Index, der als Bestandteil der Einschränkung erstellt wird, erhält automatisch denselben Namen wie die Einschränkung.An index created as part of the constraint is automatically given the same name as the constraint name. Weitere Informationen finden Sie unter Primary and Foreign Key Constraints und Unique Constraints and Check Constraints.For more information, see Primary and Foreign Key Constraints and Unique Constraints and Check Constraints.

  • Index unabhängig von einer EinschränkungIndex independent of a constraint

    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.You can create a clustered index on a column other than primary key column if a nonclustered primary key constraint was specified.

Einschränkungen Limitations and Restrictions

  • 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.When a clustered index structure is created, disk space for both the old (source) and new (target) structures is required in their respective files and filegroups. Die Speicherzuordnung für die alte Struktur wird erst dann aufgehoben, wenn die vollständige Transaktion abgeschlossen ist.The old structure is not deallocated until the complete transaction commits. Eventuell wird weiterer Speicherplatz temporär für Sortierzwecke benötigt.Additional temporary disk space for sorting may also be required. Weitere Informationen finden Sie unter Disk Space Requirements for Index DDL Operations.For more information, see 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.If a clustered index is created on a heap with several existing nonclustered indexes, all the nonclustered indexes must be rebuilt so that they contain the clustering key value instead of the row identifier (RID). 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.Similarly, if a clustered index is dropped on a table that has several nonclustered indexes, the nonclustered indexes are all rebuilt as part of the DROP operation. Dies kann bei umfangreichen Tabellen sehr lange dauern.This may take significant time on large tables.

    Beim Erstellen von Indizes für umfangreiche Tabellen sollten Sie möglichst mit dem gruppierten Index beginnen und dann die nicht gruppierten Indizes erstellen.The preferred way to build indexes on large tables is to start with the clustered index and then build any nonclustered indexes. Legen Sie gegebenenfalls die ONLINE-Option auf ON fest, wenn Sie Indizes für vorhandene Tabellen erstellen.Consider setting the ONLINE option to ON when you create indexes on existing tables. Beim Wert ON werden keine lang andauernden Tabellensperren aufrechterhalten.When set to ON, long-term table locks are not held. Damit wird die Fortsetzung von Abfragen oder Updates für die zugrunde liegende Tabelle ermöglicht.This enables queries or updates to the underlying table to continue. Weitere Informationen finden Sie unter Perform Index Operations Online.For more information, see Perform Index Operations Online.

  • Der Indexschlüssel eines gruppierten Indexes kann keine Spalten des Datentyps varchar enthalten, bei denen Daten in der Zuordnungseinheit ROW_OVERFLOW_DATA vorhanden sind.The index key of a clustered index cannot contain varchar columns that have existing data in the ROW_OVERFLOW_DATA allocation unit. Wird ein gruppierter Index für eine varchar-Spalte erstellt, bei der in der Zuordnungseinheit IN_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.If a clustered index is created on a varchar column and the existing data is in the IN_ROW_DATA allocation unit, subsequent insert or update actions on the column that would push the data off-row will fail. 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).To obtain information about tables that might contain row-overflow data, use the sys.dm_db_index_physical_stats (Transact-SQL) dynamic management function.

Sicherheit Security

Berechtigungen Permissions

Erfordert die ALTER-Berechtigung in der Tabelle oder Sicht.Requires ALTER permission on the table or view. Der Benutzer muss ein Mitglied der festen Serverrolle sysadmin bzw. der festen Datenbankrollen db_ddladmin und db_owner sein.User must be a member of the sysadmin fixed server role or the db_ddladmin and db_owner fixed database roles.

Verwendung von SQL Server Management Studio Using SQL Server Management Studio

So erstellen Sie einen gruppierten Index mit dem Objekt-ExplorerTo create a clustered index by using Object Explorer

  1. Erweitern Sie im Objekt-Explorer die Tabelle, für die Sie einen gruppierten Index erstellen möchten.In Object Explorer, expand the table on which you want to create a clustered index.

  2. Klicken Sie mit der rechten Maustaste auf den Ordner Indizes , zeigen Sie auf Neuer Index, und wählen Sie Gruppierter Indexaus.Right-click the Indexes folder, point to New Index, and select Clustered Index….

  3. Geben Sie in das Dialogfeld Neuer Index auf der Seite Allgemein den Namen des neuen Indexes in das Feld Indexname ein.In the New Index dialog box, on the General page, enter the name of the new index in the Index name box.

  4. Klicken Sie unter Indexschlüsselspaltenauf Hinzufügen….Under Index key columns, click Add….

  5. Aktivieren Sie im Dialogfeld Spalten auswählen austable_name das Kontrollkästchen der Tabellenspalte, die dem gruppierten Index hinzugefügt werden soll.In the Select Columns fromtable_name dialog box, select the check box of the table column to be added to the clustered index.

  6. Klicken Sie auf OK.Click OK.

  7. Klicken Sie im Dialogfeld Neuer Index auf OK.In the New Index dialog box, click OK.

So erstellen Sie einen gruppierten Index mit dem Tabellen-DesignerTo create a clustered index by using the Table Designer

  1. Erweitern Sie im Objekt-Explorer die Datenbank, für die Sie eine Tabelle mit einem gruppierten Index erstellen möchten.In Object Explorer, expand the database on which you want to create a table with a clustered index.

  2. Klicken Sie mit der rechten Maustaste auf den Ordner Tabellen , und klicken Sie auf Neue Tabelle.Right-click the Tables folder and click New Table….

  3. Erstellen Sie eine neue Tabelle.Create a new table as you normally would. Weitere Informationen finden Sie unter Verbindungsserver (Datenbankmodul).For more information, see Create Tables (Database Engine).

  4. Klicken Sie mit der rechten Maustaste auf die neue Tabelle, und klicken Sie auf Entwurf.Right-click the new table created above and click Design.

  5. Klicken Sie im Menü Tabellen-Designer auf Indizes/Schlüssel.On the Table Designer menu, click Indexes/Keys.

  6. Klicken Sie im Dialogfeld Indizes/Schlüssel auf Hinzufügen.In the Indexes/Keys dialog box, click Add.

  7. Wählen Sie im Textfeld Ausgewählter Primärschlüssel/eindeutiger Schlüssel oder Index den neuen Index aus.Select the new index in the Selected Primary/Unique Key or Index text box.

  8. Wählen Sie im Datenblatt Als CLUSTERED erstellenaus, und wählen Sie in der Dropdownliste rechts neben der Eigenschaft Ja aus.In the grid, select Create as Clustered, and choose Yes from the drop-down list to the right of the property.

  9. Klicken Sie auf Schließen.Click Close.

  10. Klicken Sie im Menü Datei auf Speicherntable_name.On the File menu, click Savetable_name.

Verwenden von Transact-SQL Using Transact-SQL

So erstellen Sie einen gruppierten IndexTo create a clustered index

  1. Stellen Sie im Objekt-Explorer eine Verbindung mit einer DatenbankmodulDatabase Engine-Instanz her.In Object Explorer, connect to an instance of DatenbankmodulDatabase Engine.

  2. Klicken Sie in der Standardleiste auf Neue Abfrage.On the Standard bar, click New Query.

  3. Kopieren Sie das folgende Beispiel, fügen Sie es in das Abfragefenster ein, und klicken Sie auf Ausführen.Copy and paste the following example into the query window and click Execute.

    USE AdventureWorks2012;  
    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).For more information, see CREATE INDEX (Transact-SQL).

Siehe auchSee Also

Erstellen von Primärschlüsseln Create Primary Keys
Erstellen von Unique-EinschränkungenCreate Unique Constraints