CREATE INDEX (Transact-SQL)CREATE INDEX (Transact-SQL)

Gilt für: JaSQL Server JaAzure SQL-Datenbank JaAzure Synapse Analytics (SQL DW) JaParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure Synapse Analytics (SQL DW) yesParallel Data Warehouse

Erstellt einen eindeutigen Index für eine Tabelle oder Sicht.Creates a relational index on a table or view. Wird auch als Rowstore-Index bezeichnet, da es sich entweder um einen gruppierten oder nicht gruppierten B-Strukturindex handelt.Also called a rowstore index because it is either a clustered or nonclustered B-tree index. Sie können noch bevor die Tabelle mit Daten aufgefüllt wird, einen Rowstore-Index erstellen.You can create a rowstore index before there is data in the table. Verwenden Sie einen Rowstore-Index, um die Abfrageleistung zu verbessern, insbesondere, wenn die Abfragen aus bestimmten Spalten auswählen oder Werte erfordern, die in einer bestimmten Reihenfolge sortiert werden sollen.Use a rowstore index to improve query performance, especially when the queries select from specific columns or require values to be sorted in a particular order.

Hinweis

SQL Data WarehouseSQL Data Warehouse und Parallel Data WarehouseParallel Data Warehouse unterstützen Unique-Einschränkungen derzeit nicht.and Parallel Data WarehouseParallel Data Warehouse currently do not support Unique constraints. Jegliche Beispiele, die auf Unique-Einschränkungen verweisen, gelten nur für SQL ServerSQL Server und SQL-DatenbankSQL Database.Any examples referencing Unique Constraints are only applicable to SQL ServerSQL Server and SQL-DatenbankSQL Database.

Tipp

Weitere Informationen zu den Richtlinien für das Entwerfen von Indizes finden Sie im Handbuch zum SQL Server-Indexentwurf.For information on index design guidelines, refer to the SQL Server Index Design Guide.

Einfache Beispiele:Simple examples:

-- Create a nonclustered index on a table or view
CREATE INDEX i1 ON t1 (col1);

-- Create a clustered index on a table and use a 3-part name for the table
CREATE CLUSTERED INDEX i1 ON d1.s1.t1 (col1);

-- Syntax for SQL Server and Azure SQL Database
-- Create a nonclustered index with a unique constraint
-- on 3 columns and specify the sort order for each column
CREATE UNIQUE INDEX i1 ON t1 (col1 DESC, col2 ASC, col3 DESC);

Wichtiges Szenario:Key scenario:

Verwenden Sie ab SQL Server 2016 (13.x)SQL Server 2016 (13.x) und SQL-DatenbankSQL Database einen nicht gruppierten Index für einen Columnstore-Index, um die Abfrageleistung von Data Warehouse zu verbessern.Starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x) and SQL-DatenbankSQL Database, use a nonclustered index on a columnstore index to improve data warehousing query performance. Weitere Informationen finden Sie unter Columnstore-Indizes: Data Warehouse.For more information, see Columnstore Indexes - Data Warehouse.

Informationen zu weiteren Indextypen finden Sie unter:For additional types of indexes, see:

Themenlinksymbol Transact-SQL-SyntaxkonventionenTopic link icon Transact-SQL Syntax Conventions

SyntaxSyntax

Syntax für SQL Server und Azure SQL-DatenbankSyntax for SQL Server and Azure SQL Database

CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name
    ON <object> ( column [ ASC | DESC ] [ ,...n ] )
    [ INCLUDE ( column_name [ ,...n ] ) ]
    [ WHERE <filter_predicate> ]
    [ WITH ( <relational_index_option> [ ,...n ] ) ]
    [ ON { partition_scheme_name ( column_name )
         | filegroup_name
         | default
         }
    ]
    [ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ]
  
[ ; ]
  
<object> ::=
{ database_name.schema_name.table_or_view_name | schema_name.table_or_view_name | table_or_view_name }

<relational_index_option> ::=
{
    PAD_INDEX = { ON | OFF }
  | FILLFACTOR = fillfactor
  | SORT_IN_TEMPDB = { ON | OFF }
  | IGNORE_DUP_KEY = { ON | OFF }
  | STATISTICS_NORECOMPUTE = { ON | OFF }
  | STATISTICS_INCREMENTAL = { ON | OFF }
  | DROP_EXISTING = { ON | OFF }
  | ONLINE = { ON | OFF }
  | RESUMABLE = {ON | OF }
  | MAX_DURATION = <time> [MINUTES]
  | ALLOW_ROW_LOCKS = { ON | OFF }
  | ALLOW_PAGE_LOCKS = { ON | OFF }
  | OPTIMIZE_FOR_SEQUENTIAL_KEY = { ON | OFF}
  | MAXDOP = max_degree_of_parallelism
  | DATA_COMPRESSION = { NONE | ROW | PAGE}
     [ ON PARTITIONS ( { <partition_number_expression> | <range> }
     [ , ...n ] ) ]
}

<filter_predicate> ::=
    <conjunct> [ AND <conjunct> ]

<conjunct> ::=
    <disjunct> | <comparison>

<disjunct> ::=
        column_name IN (constant ,...n)

<comparison> ::=
        column_name <comparison_op> constant

<comparison_op> ::=
    { IS | IS NOT | = | <> | != | > | >= | !> | < | <= | !< }

<range> ::=
<partition_number_expression> TO <partition_number_expression>

Abwärtskompatibler relationaler IndexBackward Compatible Relational Index

Wichtig

Die abwärtskompatible Syntaxstruktur für den relationalen Index wird in einer zukünftigen Version von SQL ServerSQL Server entfernt.The backward compatible relational index syntax structure will be removed in a future version of SQL ServerSQL Server. Verwenden Sie diese Syntaxstruktur beim Entwickeln neuer Anwendungen nicht, und planen Sie das Ändern von Anwendungen, in denen die Funktion aktuell verwendet wird.Avoid using this syntax structure in new development work, and plan to modify applications that currently use the feature. Verwenden Sie stattdessen die in <relational_index_option> angegebene Syntaxstruktur.Use the syntax structure specified in <relational_index_option> instead.

CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name
    ON <object> ( column_name [ ASC | DESC ] [ ,...n ] )
    [ WITH <backward_compatible_index_option> [ ,...n ] ]
    [ ON { filegroup_name | "default" } ]

<object> ::=
{
    [ database_name. [ owner_name ] . | owner_name. ]
    table_or_view_name
}

<backward_compatible_index_option> ::=
{
    PAD_INDEX
  | FILLFACTOR = fillfactor
  | SORT_IN_TEMPDB
  | IGNORE_DUP_KEY
  | STATISTICS_NORECOMPUTE
  | DROP_EXISTING
}

Syntax für Azure SQL Data Warehouse und Parallel Data WarehouseSyntax for Azure SQL Data Warehouse and Parallel Data Warehouse


CREATE CLUSTERED COLUMNSTORE INDEX INDEX index_name
    ON [ database_name . [ schema ] . | schema . ] table_name
    [ORDER (column[,...n])]
    [WITH ( DROP_EXISTING = { ON | OFF } )]
[;]


CREATE [ CLUSTERED | NONCLUSTERED ] INDEX index_name
    ON [ database_name . [ schema ] . | schema . ] table_name
        ( { column [ ASC | DESC ] } [ ,...n ] )
    WITH ( DROP_EXISTING = { ON | OFF } )
[;]


ArgumenteArguments

UNIQUEUNIQUE
Erstellt einen eindeutigen Index für eine Tabelle oder Sicht.Creates a unique index on a table or view. Ein eindeutiger Index ist ein Index, bei dem zwei Zeilen nicht den gleichen Indexschlüsselwert haben dürfen.A unique index is one in which no two rows are permitted to have the same index key value. Ein gruppierter Index für eine Sicht muss eindeutig sein.A clustered index on a view must be unique.

Datenbank-EngineDatabase Engine lässt das Erstellen eines eindeutigen Index für Spalten, die bereits doppelte Werte enthalten, nicht zu. Dies ist unabhängig davon, ob IGNORE_DUP_KEY auf ON festgelegt ist.The Datenbank-EngineDatabase Engine does not allow creating a unique index on columns that already include duplicate values, whether or not IGNORE_DUP_KEY is set to ON. Wenn Sie dies versuchen, wird in Datenbank-EngineDatabase Engine eine Fehlermeldung angezeigt.If this is tried, the Datenbank-EngineDatabase Engine displays an error message. Doppelte Werte müssen entfernt werden, bevor ein eindeutiger Index für die Spalte oder Spalten erstellt werden kann.Duplicate values must be removed before a unique index can be created on the column or columns. In einem eindeutigen Index verwendete Spalten müssen auf NOT NULL festgelegt werden, da mehrere NULL-Werte beim Erstellen eines eindeutigen Index als Duplikate angesehen werden.Columns that are used in a unique index should be set to NOT NULL, because multiple null values are considered duplicates when a unique index is created.

CLUSTEREDCLUSTERED
Erstellt einen Index, in dem die logische Reihenfolge der Schlüsselwerte die physische Reihenfolge der entsprechenden Zeilen in einer Tabelle bestimmt.Creates an index in which the logical order of the key values determines the physical order of the corresponding rows in a table. Die unterste Ebene oder Blattebene des gruppierten Indexes enthält die eigentlichen Datenzeilen der Tabelle.The bottom, or leaf, level of the clustered index contains the actual data rows of the table. Eine Tabelle oder Sicht kann nur über jeweils einen gruppierten Index verfügen.A table or view is allowed one clustered index at a time.

Eine Sicht mit einem eindeutigen gruppierten Index wird als indizierte Sicht bezeichnet.A view with a unique clustered index is called an indexed view. Durch das Erstellen eines eindeutigen gruppierten Index für eine Sicht wird die Sicht physisch materialisiert.Creating a unique clustered index on a view physically materializes the view. Ein eindeutiger gruppierter Index muss für eine Sicht erstellt werden, bevor ein anderer Index für dieselbe Sicht definiert werden kann.A unique clustered index must be created on a view before any other indexes can be defined on the same view. Weitere Informationen finden Sie unter Erstellen von indizierten Sichten.For more information, see Create Indexed Views.

Erstellen Sie den gruppierten Index, bevor Sie irgendeinen nicht gruppierten Index erstellen.Create the clustered index before creating any nonclustered indexes. Für eine Tabelle vorhandene nicht gruppierte Indizes werden neu erstellt, wenn ein gruppierter Index erstellt wird.Existing nonclustered indexes on tables are rebuilt when a clustered index is created.

Ist CLUSTERED nicht angegeben, wird ein nicht gruppierter Index erstellt.If CLUSTERED is not specified, a nonclustered index is created.

Hinweis

Da die Blattebene eines gruppierten Index und seine Datenseiten per Definition identisch sind, bewirkt das Erstellen eines gruppierten Index und das Verwenden der ON partition_scheme_name- oder ON filegroup_name-Klausel effektiv, dass eine Tabelle aus der Dateigruppe, in der die Tabelle erstellt wurde, in das neue Partitionsschema oder die neue Dateigruppe verschoben wird.Because the leaf level of a clustered index and the data pages are the same by definition, creating a clustered index and using the ON partition_scheme_name or ON filegroup_name clause effectively moves a table from the filegroup on which the table was created to the new partition scheme or filegroup. Bevor Sie Tabellen oder Indizes für bestimmte Dateigruppen erstellen, überprüfen Sie, welche Dateigruppen verfügbar sind, und stellen Sie sicher, dass in ihnen ausreichend freier Speicherplatz für den Index vorhanden ist.Before creating tables or indexes on specific filegroups, verify which filegroups are available and that they have enough empty space for the index.

In einigen Fällen können durch das Erstellen eines gruppierten Indexes zuvor deaktivierte Indizes aktiviert werden.In some cases creating a clustered index can enable previously disabled indexes. Weitere Informationen finden Sie unter Aktivieren von Indizes und Einschränkungen und Deaktivieren von Indizes und Einschränkungen.For more information, see Enable Indexes and Constraints and Disable Indexes and Constraints.

NONCLUSTEREDNONCLUSTERED
Erstellt einen Index, der die logische Reihenfolge einer Tabelle angibt.Creates an index that specifies the logical ordering of a table. Bei einem nicht gruppierten Index ist die physische Reihenfolge der Datenzeilen unabhängig von deren indizierter Reihenfolge.With a nonclustered index, the physical order of the data rows is independent of their indexed order.

Jede Tabelle kann über bis zu 999 nicht gruppierte Indizes verfügen, unabhängig davon, wie die Indizes erstellt werden: implizit mit PRIMARY KEY- und UNIQUE-Einschränkungen oder explizit mit CREATE INDEX.Each table can have up to 999 nonclustered indexes, regardless of how the indexes are created: either implicitly with PRIMARY KEY and UNIQUE constraints, or explicitly with CREATE INDEX.

Für indizierte Sichten können nicht gruppierte Indizes nur erstellt werden, wenn bereits ein eindeutiger gruppierter Index für die entsprechende Sicht definiert ist.For indexed views, nonclustered indexes can be created only on a view that has a unique clustered index already defined.

Wenn nicht anders angegeben, ist NONCLUSTERED der Standardindextyp.If not otherwise specified, the default index type is NONCLUSTERED.

index_name index_name
Der Name des Indexes.Is the name of the index. Indexnamen müssen für eine Tabelle oder Ansicht eindeutig sein, können aber innerhalb einer Datenbank mehrfach vorkommen.Index names must be unique within a table or view, but do not have to be unique within a database. Indexnamen müssen den Regeln für Bezeichner entsprechen.Index names must follow the rules of identifiers.

column column
Gibt die Spalte(n) an, auf der bzw. denen der Index basiert.Is the column or columns on which the index is based. Geben Sie zwei oder mehr Spaltennamen an, um einen zusammengesetzten Index für die kombinierten Werte der angegebenen Spalten zu erstellen.Specify two or more column names to create a composite index on the combined values in the specified columns. Führen Sie die Spalten, die im zusammengesetzten Index enthalten sein sollen, in der Reihenfolge der Sortierpriorität in den Klammern hinter table_or_view_name auf.List the columns to be included in the composite index, in sort-priority order, inside the parentheses after table_or_view_name.

Es können bis zu 32 Spalten in einem einzigen zusammengesetzten Indexschlüssel kombiniert werden.Up to 32 columns can be combined into a single composite index key. Alle Spalten in einem zusammengesetzten Indexschlüssel müssen sich in derselben Tabelle oder Sicht befinden.All the columns in a composite index key must be in the same table or view. Die maximal zulässige Größe der kombinierten Indexwerte liegt bei 900 Byte für gruppierte Indizes oder 1700 Byte für nicht gruppierte Indizes.The maximum allowable size of the combined index values is 900 bytes for a clustered index, or 1,700 for a nonclustered index. Für Versionen vor SQL-DatenbankSQL Database und SQL Server 2016 (13.x)SQL Server 2016 (13.x) liegen die Höchstwerte bei 16 Spalten und 900 Byte.The limits are 16 columns and 900 bytes for versions before SQL-DatenbankSQL Database and SQL Server 2016 (13.x)SQL Server 2016 (13.x).

Spalten, die von den Large Object-Datentypen (LOB-Datentyp) ntext, text, varchar(max) , nvarchar(max) , varbinary(max) , xml oder image sind, können nicht als Schlüsselspalten für einen Index angegeben werden.Columns that are of the large object (LOB) data types ntext, text, varchar(max), nvarchar(max), varbinary(max), xml, or image cannot be specified as key columns for an index. Darüber hinaus darf eine Sichtdefinition keine Spalten der Datentypen ntext, text oder image enthalten, auch wenn in der CREATE INDEX-Anweisung nicht auf diese Spalten verwiesen wird.Also, a view definition cannot include ntext, text, or image columns, even if they are not referenced in the CREATE INDEX statement.

Sie können Indizes für Spalten mit dem CLR-benutzerdefinierten Typ erstellen, wenn durch den Typ Binärreihenfolgen unterstützt werden.You can create indexes on CLR user-defined type columns if the type supports binary ordering. Außerdem können Sie Indizes für berechnete Spalten erstellen, die als Methodenaufrufe aus einer Spalte mit dem benutzerdefinierten Typ definiert sind, vorausgesetzt, die Methoden sind als deterministisch markiert und führen keine Datenzugriffe durch.You can also create indexes on computed columns that are defined as method invocations off a user-defined type column, as long as the methods are marked deterministic and do not perform data access operations. Weitere Informationen zum Indizieren von Spalten mit dem CLR-benutzerdefinierten Typ finden Sie unter CLR-benutzerdefinierte Typen.For more information about indexing CLR user-defined type columns, see CLR User-defined Types.

[ ASC | DESC ][ ASC | DESC ]
Bestimmt für die entsprechende Indexspalte die aufsteigende oder absteigende Sortierreihenfolge.Determines the ascending or descending sort direction for the particular index column. Die Standardeinstellung ist ASC.The default is ASC.

INCLUDE ( column [ , ... n ] ) INCLUDE (column [ ,... n ] )
Gibt die Nichtschlüsselspalten an, die zur Blattebene des nicht gruppierten Index hinzugefügt werden sollen.Specifies the non-key columns to be added to the leaf level of the nonclustered index. Der nicht gruppierte Index kann eindeutig oder nicht eindeutig sein.The nonclustered index can be unique or non-unique.

Die Spaltennamen dürfen in der INCLUDE-Liste nicht wiederholt und nicht gleichzeitig als Schlüssel- und Nichtschlüsselspalten verwendet werden.Column names cannot be repeated in the INCLUDE list and cannot be used simultaneously as both key and non-key columns. Nicht gruppierte Indizes enthalten stets die Spalten des gruppierten Index, wenn ein gruppierter Index für die Tabelle definiert ist.Nonclustered indexes always contain the clustered index columns if a clustered index is defined on the table. Weitere Informationen finden Sie unter Create Indexes with Included Columns.For more information, see Create Indexes with Included Columns.

Mit Ausnahme von text, ntextund imagesind alle Datentypen zulässig.All data types are allowed except text, ntext, and image. Der Index muss offline erstellt oder neu erstellt werden (ONLINE = OFF), wenn eine der angegebenen Nichtschlüsselspalten den Datentyp varchar(max) , nvarchar(max) oder varbinary(max) aufweist.The index must be created or rebuilt offline (ONLINE = OFF) if any one of the specified non-key columns are varchar(max), nvarchar(max), or varbinary(max) data types.

Bei berechneten Spalten, die deterministisch und präzise oder unpräzise sind, kann es sich um eingeschlossene Spalten handeln.Computed columns that are deterministic and either precise or imprecise can be included columns. Berechnete Spalten, die aus den Datentypen image, ntext, text, varchar(max) , nvarchar(max) , varbinary(max) und xml abgeleitet wurden, können, solange der Datentyp der berechneten Spalte als Indexschlüsselspalte zulässig ist, in Spalten eingefügt werden, bei denen es sich nicht um Schlüsselspalten handelt.Computed columns derived from image, ntext, text, varchar(max), nvarchar(max), varbinary(max), and xml data types can be included in non-key columns as long as the computed column data types is allowable as an included column. Weitere Informationen finden Sie unter Indexes on Computed Columns.For more information, see Indexes on Computed Columns.

Weitere Informationen zum Erstellen eines XML-Index finden Sie unter CREATE XML INDEX.For information on creating an XML index, see CREATE XML INDEX.

WHERE <filter_predicate>WHERE <filter_predicate>
Erstellt einen gefilterten Index, wobei angegeben wird, welche Zeilen in den Index aufgenommen werden sollen.Creates a filtered index by specifying which rows to include in the index. Der gefilterte Index muss ein nicht gruppierter Index für eine Tabelle sein.The filtered index must be a nonclustered index on a table. Erstellt gefilterte Statistikdaten für die Datenzeilen im gefilterten Index.Creates filtered statistics for the data rows in the filtered index.

Im Filterprädikat werden einfache Vergleichsoperatoren verwendet. Es darf darin nicht auf eine berechnete Spalte, eine UDT-Spalte, eine Spalte mit einem räumlichen Datentyp oder eine Spalten mit dem hierarchyID-Datentyp verwiesen werden.The filter predicate uses simple comparison logic and cannot reference a computed column, a UDT column, a spatial data type column, or a hierarchyID data type column. Vergleiche mit NULL-Literalen sind mit den Vergleichsoperatoren nicht zulässig.Comparisons using NULL literals are not allowed with the comparison operators. Verwenden Sie stattdessen den IS NULL-Operator und den IS NOT NULL-Operator.Use the IS NULL and IS NOT NULL operators instead.

Es folgen einige Beispiele für Filterprädikate für die Production.BillOfMaterials-Tabelle:Here are some examples of filter predicates for the Production.BillOfMaterials table:

WHERE StartDate > '20000101' AND EndDate <= '20000630'

WHERE ComponentID IN (533, 324, 753)

WHERE StartDate IN ('20000404', '20000905') AND EndDate IS NOT NULL

Gefilterte Indizes gelten nicht für XML-Indizes und Volltextindizes.Filtered indexes do not apply to XML indexes and full-text indexes. Bei UNIQUE-Indizes müssen nur die ausgewählten Zeilen über eindeutige Indexwerte verfügen.For UNIQUE indexes, only the selected rows must have unique index values. Bei gefilterten Indizes ist die IGNORE_DUP_KEY-Option nicht zulässig.Filtered indexes do not allow the IGNORE_DUP_KEY option.

ON partition_scheme_name ( column_name )ON partition_scheme_name ( column_name )

Gilt für: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 bis SQL Server 2019SQL Server 2019) und Azure SQL-DatenbankAzure SQL DatabaseApplies to: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 through SQL Server 2019SQL Server 2019) and Azure SQL-DatenbankAzure SQL Database

Gibt das Partitionsschema an, das die Dateigruppen definiert, denen die Partitionen eines partitionierten Index zugeordnet werden.Specifies the partition scheme that defines the filegroups onto which the partitions of a partitioned index will be mapped. Das Partitionsschema muss bereits durch Ausführen von CREATE PARTITION SCHEME oder ALTER PARTITION SCHEME in der Datenbank vorhanden sein.The partition scheme must exist within the database by executing either CREATE PARTITION SCHEME or ALTER PARTITION SCHEME. column_name gibt die Spalte an, auf deren Grundlage ein partitionierter Index partitioniert wird.column_name specifies the column against which a partitioned index will be partitioned. Diese Spalte muss mit dem Datentyp, der Länge und der Genauigkeit des Arguments der Partitionsfunktion übereinstimmen, die partition_scheme_name verwendet.This column must match the data type, length, and precision of the argument of the partition function that partition_scheme_name is using. column_name ist nicht auf Spalten in der Indexdefinition beschränkt.column_name is not restricted to the columns in the index definition. Es können beliebige Spalten der Basistabelle angegeben werden, mit der Ausnahme, dass column_name beim Partitionieren von UNIQUE-Indizes aus den Spalten ausgewählt werden muss, die als eindeutige Schlüssel verwendet werden.Any column in the base table can be specified, except when partitioning a UNIQUE index, column_name must be chosen from among those used as the unique key. Mit dieser Einschränkung kann Datenbank-EngineDatabase Engine die Eindeutigkeit der Schlüsselwerte in nur einer einzigen Partition überprüfen.This restriction allows the Datenbank-EngineDatabase Engine to verify uniqueness of key values within a single partition only.

Hinweis

Beim Partitionieren eines nicht eindeutigen gruppierten Index fügt Datenbank-EngineDatabase Engine standardmäßig die Partitionierungsspalte zu der Liste der gruppierten Indexschlüssel hinzu, sofern sie dort noch nicht angegeben wurde.When you partition a non-unique, clustered index, the Datenbank-EngineDatabase Engine by default adds the partitioning column to the list of clustered index keys, if it is not already specified. Beim Partitionieren eines nicht eindeutigen, nicht gruppierten Indexes fügt Datenbank-EngineDatabase Engine die Partitionierungsspalte als (eingeschlossene) Nichtschlüsselspalte des Indexes hinzu, sofern sie noch nicht angegeben wurde.When partitioning a non-unique, nonclustered index, the Datenbank-EngineDatabase Engine adds the partitioning column as a non-key (included) column of the index, if it is not already specified.

Wenn partition_scheme_name oder filegroup bei einer partitionierten Tabelle nicht angegeben werden, wird der Index in demselben Partitionsschema platziert und verwendet dieselbe Partitionierungsspalte wie die zugrunde liegende Tabelle.If partition_scheme_name or filegroup is not specified and the table is partitioned, the index is placed in the same partition scheme, using the same partitioning column, as the underlying table.

Hinweis

Sie können kein Partitionierungsschema für einen XML-Index angeben.You cannot specify a partitioning scheme on an XML index. Beim Partitionieren der Basistabelle verwendet der XML-Index dasselbe Partitionsschema wie die Tabelle.If the base table is partitioned, the XML index uses the same partition scheme as the table.

Weitere Informationen zur Partitionierung von Indizes finden Sie unter Partitionierte Tabellen und Indizes.For more information about partitioning indexes, Partitioned Tables and Indexes.

ON filegroup_nameON filegroup_name

Gilt für: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 bis SQL Server 2019SQL Server 2019).Applies to: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 through SQL Server 2019SQL Server 2019)

Erstellt den angegebenen Index für die angegebene Dateigruppe.Creates the specified index on the specified filegroup. Wenn kein Speicherort angegeben und die Tabelle oder Sicht nicht partitioniert ist, verwendet der Index dieselbe Dateigruppe wie die zugrunde liegende Tabelle oder Sicht.If no location is specified and the table or view is not partitioned, the index uses the same filegroup as the underlying table or view. Die Dateigruppe muss bereits vorhanden sein.The filegroup must already exist.

ON " default "ON " default "

Gilt für: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 bis SQL Server 2019SQL Server 2019) und Azure SQL-DatenbankAzure SQL DatabaseApplies to: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 through SQL Server 2019SQL Server 2019) and Azure SQL-DatenbankAzure SQL Database

Erstellt den angegebenen Index in derselben Dateigruppe oder in demselben Partitionsschema wie die Tabelle oder Sicht.Creates the specified index on the same filegroup or partition scheme as the table or view.

Die Benennung default ist in diesem Kontext kein Schlüsselwort.The term default, in this context, is not a keyword. Es handelt sich dabei um einen Bezeichner für die Standarddateigruppe. Dieser muss wie in ON " default " or ON [ default ] durch Trennzeichen getrennt werden.It is an identifier for the default filegroup and must be delimited, as in ON " default " or ON [ default ]. Wenn "default" angegeben wird, muss die Option QUOTED_IDENTIFIER für die aktuelle Sitzung auf ON festgelegt sein.If "default" is specified, the QUOTED_IDENTIFIER option must be ON for the current session. Dies ist die Standardeinstellung.This is the default setting. Weitere Informationen finden Sie unter SET QUOTED_IDENTIFIER.For more information, see SET QUOTED_IDENTIFIER.

Hinweis

„default“ gibt nicht die Standarddateigruppe der Datenbank im Kontext von CREATE INDEX an."default" does not indicate the database default filegroup in the context of CREATE INDEX. Dies unterscheidet sich von CREATE TABLE, wo „default“ die Tabelle in der Standarddateigruppe der Datenbank platziert.This differs from CREATE TABLE, where "default" locates the table on the database default filegroup.

[ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ][ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ]

Gilt für: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 bis SQL Server 2019SQL Server 2019).Applies to: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 through SQL Server 2019SQL Server 2019)

Gibt die Platzierung der FILESTREAM-Daten für die Tabelle an, wenn ein gruppierter Index erstellt wird.Specifies the placement of FILESTREAM data for the table when a clustered index is created. Die FILESTREAM_ON-Klausel lässt zu, dass FILESTREAM-Daten in eine andere FILESTREAM-Dateigruppe oder ein anderes Partitionsschema verschoben werden.The FILESTREAM_ON clause allows FILESTREAM data to be moved to a different FILESTREAM filegroup or partition scheme.

filestream_filegroup_name ist der Name einer FILESTREAM-Dateigruppe.filestream_filegroup_name is the name of a FILESTREAM filegroup. Für die Dateigruppe muss eine Datei mit einer CREATE DATABASE-Anweisung oder einer ALTER DATABASE-Anweisung definiert worden sein, andernfalls wird ein Fehler ausgelöst.The filegroup must have one file defined for the filegroup by using a CREATE DATABASE or ALTER DATABASE statement; otherwise, an error is raised.

Wenn die Tabelle partitioniert ist, muss die FILESTREAM_ON-Klausel eingeschlossen werden und ein Partitionsschema von FILESTREAM-Dateigruppen angeben, das die gleiche Partitionsfunktion und die gleichen Partitionsspalten wie das Partitionsschema der Tabelle enthält.If the table is partitioned, the FILESTREAM_ON clause must be included and must specify a partition scheme of FILESTREAM filegroups that uses the same partition function and partition columns as the partition scheme for the table. Andernfalls wird ein Fehler ausgelöst.Otherwise, an error is raised.

Wenn die Tabelle nicht partitioniert ist, kann die FILESTREAM-Spalte nicht partitioniert werden.If the table is not partitioned, the FILESTREAM column cannot be partitioned. Die FILESTREAM-Daten für die Tabelle müssen in einer einzigen Dateigruppe gespeichert werden, die in der FILESTREAM_ON-Klausel angegeben wird.FILESTREAM data for the table must be stored in a single filegroup that is specified in the FILESTREAM_ON clause.

FILESTREAM_ON NULL kann in einer CREATE INDEX-Anweisung angegeben werden, wenn ein gruppierter Index erstellt wird und die Tabelle keine FILESTREAM-Spalte enthält.FILESTREAM_ON NULL can be specified in a CREATE INDEX statement if a clustered index is being created and the table does not contain a FILESTREAM column.

Weitere Informationen finden Sie unter FILESTREAM (SQL Server).For more information, see FILESTREAM (SQL Server).

<object>::=<object>::=

Gibt das vollqualifizierte oder nicht vollqualifizierte Objekt an, das indiziert werden soll.Is the fully qualified or nonfully qualified object to be indexed.

database_name database_name
Der Name der Datenbank.Is the name of the database.

schema_name schema_name
Der Name des Schemas, zu dem die Tabelle oder Sicht gehört.Is the name of the schema to which the table or view belongs.

table_or_view_name table_or_view_name
Gibt den Namen der zu indizierenden Tabelle oder Sicht an.Is the name of the table or view to be indexed.

Die Sicht muss mit SCHEMABINDING definiert werden, um einen Index für sie zu erstellten.The view must be defined with SCHEMABINDING to create an index on it. Ein eindeutiger gruppierter Index muss für eine Sicht erstellt werden, bevor ein nicht gruppierter Index erstellt wird.A unique clustered index must be created on a view before any nonclustered index is created. Weitere Informationen zu indizierten Sichten finden Sie im Abschnitt mit den Hinweisen.For more information about indexed views, see the Remarks section.

Ab SQL Server 2016 (13.x)SQL Server 2016 (13.x) kann es sich bei dem Objekt um eine Tabelle handeln, die gemeinsam mit einem gruppierten Columnstore-Index gespeichert wird.Starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x), the object can be a table stored with a clustered columnstore index.

Azure SQL-DatenbankAzure SQL Database unterstützt das aus drei Teilen bestehende Namensformat database_name.[schema_name].object_name, wenn database_name die aktuelle Datenbank bzw. database_name tempdb ist und object_name mit # beginnt.supports the three-part name format database_name.[schema_name].object_name when the database_name is the current database or the database_name is tempdb and the object_name starts with #.

<relational_index_option>::= <relational_index_option>::=
Gibt die Optionen an, die beim Erstellen des Indexes verwendet werden sollen.Specifies the options to use when you create the index.

PAD_INDEX = { ON | OFF }PAD_INDEX = { ON | OFF }

Gilt für: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 bis SQL Server 2019SQL Server 2019) und Azure SQL-DatenbankAzure SQL DatabaseApplies to: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 through SQL Server 2019SQL Server 2019) and Azure SQL-DatenbankAzure SQL Database

Gibt die Auffüllung von Indizes an.Specifies index padding. Der Standardwert ist OFF.The default is OFF.

ONON
Der Prozentsatz des mit fillfactor angegebenen freien Speicherplatzes wird für die Zwischenebenenseiten des Indexes angewendet.The percentage of free space that is specified by fillfactor is applied to the intermediate-level pages of the index.

OFF oder fillfactor ist nicht angegebenOFF or fillfactor is not specified
Die Zwischenebenenseiten sind nahezu vollständig aufgefüllt. Allerdings ist ausreichend Speicherplatz vorhanden, um mindestens eine Zeile in der maximal für den Index möglichen Größe aufzunehmen, wenn der Schlüsselsatz auf den Zwischenseiten berücksichtigt wird.The intermediate-level pages are filled to near capacity, leaving sufficient space for at least one row of the maximum size the index can have, considering the set of keys on the intermediate pages.

Die Option PAD_INDEX ist nur dann hilfreich, wenn FILLFACTOR angegeben ist, da PAD_INDEX den durch FILLFACTOR angegebenen Prozentsatz verwendet.The PAD_INDEX option is useful only when FILLFACTOR is specified, because PAD_INDEX uses the percentage specified by FILLFACTOR. Wenn der für FILLFACTOR angegebene Prozentsatz nicht groß genug ist, um eine Zeile aufzunehmen, überschreibt Datenbank-EngineDatabase Engine diesen Prozentsatz intern, um das Minimum zuzulassen.If the percentage specified for FILLFACTOR is not large enough to allow for one row, the Datenbank-EngineDatabase Engine internally overrides the percentage to allow for the minimum. Auf jeder Zwischenindexseite befinden sich unabhängig vom angegebenen fillfactor-Wert nie weniger als zwei Zeilen.The number of rows on an intermediate index page is never less than two, regardless of how low the value of fillfactor.

In abwärtskompatibler Syntax ist WITH PAD_INDEX gleichwertig mit WITH PAD_INDEX = ON.In backward compatible syntax, WITH PAD_INDEX is equivalent to WITH PAD_INDEX = ON.

FILLFACTOR = fillfactorFILLFACTOR =fillfactor

Gilt für: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 bis SQL Server 2019SQL Server 2019) und Azure SQL-DatenbankAzure SQL DatabaseApplies to: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 through SQL Server 2019SQL Server 2019) and Azure SQL-DatenbankAzure SQL Database

Gibt einen Prozentsatz an, der angibt, wie weit das Datenbank-EngineDatabase Engine die Blattebene jeder Indexseite während der Indexerstellung oder -neuerstellung füllen soll.Specifies a percentage that indicates how full the Datenbank-EngineDatabase Engine should make the leaf level of each index page during index creation or rebuild. fillfactor muss ein ganzzahliger Wert zwischen 1 und 100 sein.fillfactor must be an integer value from 1 to 100. Wenn fillfactor 100 ist, erstellt das Datenbank-EngineDatabase Engine Indizes mit vollständig aufgefüllten Blattseiten.If fillfactor is 100, the Datenbank-EngineDatabase Engine creates indexes with leaf pages filled to capacity.

Die FILLFACTOR-Einstellung gilt nur, wenn der Index erstellt oder neu erstellt wird.The FILLFACTOR setting applies only when the index is created or rebuilt. Datenbank-EngineDatabase Engine hält den angegebenen Prozentsatz des Speicherplatzes nicht dynamisch auf den Seiten frei.The Datenbank-EngineDatabase Engine does not dynamically keep the specified percentage of empty space in the pages. Zum Anzeigen der Füllfaktoreinstellung verwenden Sie die Katalogsicht sys.indexes.To view the fill factor setting, use the sys.indexes catalog view.

Wichtig

Das Erstellen eines gruppierten Indexes mit einem FILLFACTOR-Wert unter 100 wirkt sich auf den Speicherplatz aus, den die Daten belegen, da Datenbank-EngineDatabase Engine die Daten beim Erstellen des gruppierten Indexes neu verteilt.Creating a clustered index with a FILLFACTOR less than 100 affects the amount of storage space the data occupies because the Datenbank-EngineDatabase Engine redistributes the data when it creates the clustered index.

Weitere Informationen finden Sie unter Angeben des Füllfaktors für einen Index.For more information, see Specify Fill Factor for an Index.

SORT_IN_TEMPDB = { ON | OFF }SORT_IN_TEMPDB = { ON | OFF }

Gilt für: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 bis SQL Server 2019SQL Server 2019) und Azure SQL-DatenbankAzure SQL DatabaseApplies to: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 through SQL Server 2019SQL Server 2019) and Azure SQL-DatenbankAzure SQL Database

Gibt an, ob temporäre Ergebnisse des Sortierens in tempdb gespeichert werden sollen.Specifies whether to store temporary sort results in tempdb. Außer für Hyperscale von Azure SQL-Datenbank ist der Standardwert OFF. Für alle Indexerstellungsvorgänge in Hyperscale ist SORT_IN_TEMPDB unabhängig von der angegebenen Option immer ON, sofern nicht die fortsetzbare Indexneuerstellung verwendet wird.The default is OFF except for Azure SQL Database Hyperscale.For all index build operations in Hyperscale, SORT_IN_TEMPDB is always ON, regardless of the option specified unless resumable index rebuild is used.

ONON
Die Zwischenergebnisse von Sortierungen, mit denen der Index erstellt wird, werden in tempdb gespeichert.The intermediate sort results that are used to build the index are stored in tempdb. Dadurch kann sich die zum Erstellen eines Index erforderliche Zeit verringern, wenn sich tempdb in anderen Datenträgersätzen befindet als die Benutzerdatenbank.This may reduce the time required to create an index if tempdb is on a different set of disks than the user database. Sie erhöht jedoch den Betrag an Speicherplatz, der während der Indexerstellung verwendet wird.However, this increases the amount of disk space that is used during the index build.

OFFOFF
Die Zwischenergebnisse der Sortierung werden in derselben Datenbank gespeichert wie der Index.The intermediate sort results are stored in the same database as the index.

Zusätzlich zu dem Speicherplatz, der in der Benutzerdatenbank zum Erstellen des Index erforderlich ist, muss tempdb ungefähr die gleiche Menge an zusätzlichem Speicherplatz aufweisen, um die Zwischenergebnisse der Sortierung zu speichern.In addition to the space required in the user database to create the index, tempdb must have about the same amount of additional space to hold the intermediate sort results. Weitere Informationen finden Sie unter SORT_IN_TEMPDB-Option für Indizes.For more information, see SORT_IN_TEMPDB Option For Indexes.

In abwärtskompatibler Syntax ist WITH SORT_IN_TEMPDB gleichwertig mit WITH SORT_IN_TEMPDB = ON.In backward compatible syntax, WITH SORT_IN_TEMPDB is equivalent to WITH SORT_IN_TEMPDB = ON.

IGNORE_DUP_KEY = { ON | OFF }IGNORE_DUP_KEY = { ON | OFF }
Gibt die Fehlermeldung an, wenn ein Einfügevorgang versucht, doppelte Schlüsselwerte in einen eindeutigen Index einzufügen.Specifies the error response when an insert operation attempts to insert duplicate key values into a unique index. Die IGNORE_DUP_KEY-Option gilt nur für Einfügevorgänge nach dem Erstellen oder Neuerstellen des Index.The IGNORE_DUP_KEY option applies only to insert operations after the index is created or rebuilt. Beim Ausführen von CREATE INDEX, ALTER INDEX oder UPDATE hat die Option keine Auswirkungen.The option has no effect when executing CREATE INDEX, ALTER INDEX, or UPDATE. Der Standardwert ist OFF.The default is OFF.

ONON
Eine Warnmeldung wird ausgegeben, wenn doppelte Schlüsselwerte in einen eindeutigen Index eingefügt werden.A warning message will occur when duplicate key values are inserted into a unique index. Es schlagen nur die Zeilen fehl, die gegen die Eindeutigkeitseinschränkung verstoßen.Only the rows violating the uniqueness constraint will fail.

OFFOFF
Eine Fehlermeldung wird ausgegeben, wenn doppelte Schlüsselwerte in einen eindeutigen Index eingefügt werden.An error message will occur when duplicate key values are inserted into a unique index. Für den gesamten INSERT-Vorgang wird ein Rollback ausgeführt.The entire INSERT operation will be rolled back.

IGNORE_DUP_KEY kann für Indizes, die für eine Sicht erstellt werden, nicht eindeutige Indizes, XML-Indizes, räumliche und gefilterte Indizes nicht auf ON festgelegt werden.IGNORE_DUP_KEY cannot be set to ON for indexes created on a view, non-unique indexes, XML indexes, spatial indexes, and filtered indexes.

Um IGNORE_DUP_KEY anzuzeigen, verwenden Sie sys.indexes.To view IGNORE_DUP_KEY, use sys.indexes.

In abwärtskompatibler Syntax ist WITH IGNORE_DUP_KEY gleichwertig mit WITH IGNORE_DUP_KEY = ON.In backward compatible syntax, WITH IGNORE_DUP_KEY is equivalent to WITH IGNORE_DUP_KEY = ON.

STATISTICS_NORECOMPUTE = { ON | OFF}STATISTICS_NORECOMPUTE = { ON | OFF}
Gibt an, ob Verteilungsstatistiken neu berechnet werden.Specifies whether distribution statistics are recomputed. Der Standardwert ist OFF.The default is OFF.

ONON
Veraltete Indexstatistiken werden nicht automatisch neu berechnet.Out-of-date statistics are not automatically recomputed.

OFFOFF
Die automatischen Updates der Statistiken sind aktiviert.Automatic statistics updating are enabled.

Um das automatische Aktualisieren von Statistiken wiederherzustellen, müssen Sie STATISTICS_NORECOMPUTE auf OFF festlegen oder die UPDATE STATISTICS-Anweisung ohne die NORECOMPUTE-Klausel ausführen.To restore automatic statistics updating, set the STATISTICS_NORECOMPUTE to OFF, or execute UPDATE STATISTICS without the NORECOMPUTE clause.

Wichtig

Wenn Sie die automatische Neuberechnung von Verteilungsstatistiken deaktivieren, wählt der Abfrageoptimierer möglicherweise nicht die optimalen Ausführungspläne für Abfragen, an denen die Tabelle beteiligt ist.Disabling automatic recomputation of distribution statistics may prevent the query optimizer from picking optimal execution plans for queries involving the table.

In abwärtskompatibler Syntax ist WITH STATISTICS_NORECOMPUTE gleichwertig mit WITH STATISTICS_NORECOMPUTE = ON.In backward compatible syntax, WITH STATISTICS_NORECOMPUTE is equivalent to WITH STATISTICS_NORECOMPUTE = ON.

STATISTICS_INCREMENTAL = { ON | OFF }STATISTICS_INCREMENTAL = { ON | OFF }

Gilt für: SQL ServerSQL Server (ab SQL Server 2014 (12.x)SQL Server 2014 (12.x)) und Azure SQL-DatenbankAzure SQL DatabaseApplies to: SQL ServerSQL Server (Starting with SQL Server 2014 (12.x)SQL Server 2014 (12.x)) and Azure SQL-DatenbankAzure SQL Database

Bei ON wird die Statistik pro Partition erstellt.When ON, the statistics created are per partition statistics. Bei OFF wird die Statistikstruktur gelöscht und die Statistik von SQL ServerSQL Server neu berechnet.When OFF, the statistics tree is dropped and SQL ServerSQL Server re-computes the statistics. Der Standardwert ist OFF.The default is OFF.

Wenn Statistiken pro Partition nicht unterstützt werden, wird die Option ignoriert und eine Warnung generiert.If per partition statistics are not supported the option is ignored and a warning is generated. Inkrementelle Statistiken werden für folgende Statistiktypen nicht unterstützt:Incremental stats are not supported for following statistics types:

  • Statistiken, die mit Indizes erstellt wurden, die über keine Partitionsausrichtung mit der Basistabelle verfügen.Statistics created with indexes that are not partition-aligned with the base table.
  • Statistiken, die für lesbare sekundäre Always On-Datenbanken erstellt wurden.Statistics created on Always On readable secondary databases.
  • Statistiken, die für schreibgeschützte Datenbanken erstellt wurden.Statistics created on read-only databases.
  • Statistiken, die für gefilterte Indizes erstellt wurden.Statistics created on filtered indexes.
  • Statistiken, die für Sichten erstellt wurden.Statistics created on views.
  • Statistiken, die für interne Tabellen erstellt wurden.Statistics created on internal tables.
  • Statistiken, die mit räumlichen Indizes oder XML-Indizes erstellt wurden.Statistics created with spatial indexes or XML indexes.

DROP_EXISTING = { ON | OFF }DROP_EXISTING = { ON | OFF }
Eine Option zum Entfernen und erneutem Erstellen eines vorhandenen gruppierten oder nicht gruppierten Index mit veränderten Spaltenspezifikationen, die den Namen für den Index beibehält.Is an option to drop and rebuild the existing clustered or nonclustered index with modified column specifications, and keep the same name for the index. Der Standardwert ist OFF.The default is OFF.

ONON
Gibt an, dass der vorhandene Index entfernt und neu erstellt werden soll. Der Index muss über denselben Namen wie der Parameter index_name verfügen.Specifies to drop and rebuild the existing index, which must have the same name as the parameter index_name.

OFFOFF
Gibt an, dass der vorhandene Index nicht entfernt und neu erstellt werden soll.Specifies not to drop and rebuild the existing index. SQL Server zeigt einen Fehler an, wenn der angegebene Indexname bereits vorhanden ist.SQL Server displays an error if the specified index name already exists.

Mit DROP_EXISTING können Sie folgende Änderung vornehmen:With DROP_EXISTING, you can change:

  • Umwandlung eines nicht gruppierten Rowstore-Index in einen gruppierten Rowstore-Index.A nonclustered rowstore index to a clustered rowstore index.

Mit DROP_EXISTING können Sie folgende Änderung nicht vornehmen:With DROP_EXISTING, you cannot change:

  • Umwandlung eines gruppierten Rowstore-Index in einen nicht gruppierten Rowstore-Index.A clustered rowstore index to a nonclustered rowstore index.
  • Umwandlung eines gruppierten Columnstore-Index in einen nicht gruppierten Rowstore-Index.A clustered columnstore index to any type of rowstore index.

In abwärtskompatibler Syntax ist WITH DROP_EXISTING gleichwertig mit WITH DROP_EXISTING = ON.In backward compatible syntax, WITH DROP_EXISTING is equivalent to WITH DROP_EXISTING = ON.

ONLINE = { ON | OFF }ONLINE = { ON | OFF }
Gibt an, ob die zugrunde liegenden Tabellen und zugeordneten Indizes für Abfragen und Datenänderungen während des Indexvorgangs verfügbar sind.Specifies whether underlying tables and associated indexes are available for queries and data modification during the index operation. Der Standardwert ist OFF.The default is OFF.

Wichtig

Onlineindexvorgänge sind nicht in jeder Edition von MicrosoftMicrosoftSQL ServerSQL Server verfügbar.Online index operations are not available in every edition of MicrosoftMicrosoftSQL ServerSQL Server. Eine Liste der Funktionen, die von den SQL ServerSQL Server-Editionen unterstützt werden, finden Sie unter Editionen und unterstütze Funktionen für den SQL Server 2016.For a list of features that are supported by the editions of SQL ServerSQL Server, see Editions and Supported Features for SQL Server 2016.

ONON
Lang andauernde Sperren werden nicht für die Dauer des Indexvorgangs aufrechterhalten.Long-term table locks are not held for the duration of the index operation. Während der Hauptphase des Indexvorgangs wird nur eine beabsichtigte freigegebene Sperre für die Quelltabelle aufrechterhalten.During the main phase of the index operation, only an Intent Share (IS) lock is held on the source table. Dadurch können Abfragen oder Updates für die zugrunde liegende Tabelle und die Indizes fortgesetzt werden.This enables queries or updates to the underlying table and indexes to proceed. Zu Beginn des Vorgangs wird für sehr kurze Zeit eine freigegebene Sperre (S) für das Quellobjekt aufrechterhalten.At the start of the operation, a Shared (S) lock is held on the source object for a very short period of time. Am Ende des Vorgangs wird für die Quelle für kurze Zeit eine freigegebene Sperre (S) aktiviert, wenn ein nicht gruppierter Index erstellt wird. Eine Schemaänderungssperre (SCH-M) wird aktiviert, wenn ein gruppierter Index online erstellt oder gelöscht und wenn ein gruppierter oder nicht gruppierter Index neu erstellt wird.At the end of the operation, for a short period of time, an S (Shared) lock is acquired on the source if a nonclustered index is being created; or an SCH-M (Schema Modification) lock is acquired when a clustered index is created or dropped online and when a clustered or nonclustered index is being rebuilt. ONLINE kann nicht auf ON festgelegt werden, wenn ein Index auf einer lokalen temporären Tabelle erstellt wird.ONLINE cannot be set to ON when an index is being created on a local temporary table.

OFFOFF
Die Tabellensperren werden für die Dauer des Indexvorgangs angewendet.Table locks are applied for the duration of the index operation. Ein Offlineindexvorgang, bei dem ein gruppierter Index erstellt, neu erstellt oder gelöscht bzw. ein nicht gruppierter Index neu erstellt oder gelöscht wird, aktiviert eine Schemaänderungssperre (SCH-M) für die Tabelle.An offline index operation that creates, rebuilds, or drops a clustered index, or rebuilds or drops a nonclustered index, acquires a Schema modification (Sch-M) lock on the table. Dadurch wird verhindert, dass Benutzer für die Dauer des Vorgangs auf die zugrunde liegende Tabelle zugreifen können.This prevents all user access to the underlying table for the duration of the operation. Ein Offlineindexvorgang, bei dem ein nicht gruppierter Index erstellt wird, aktiviert eine freigegebene Sperre (S) für die Tabelle.An offline index operation that creates a nonclustered index acquires a Shared (S) lock on the table. Dadurch werden Updates der zugrunde liegenden Tabelle verhindert. Lesevorgänge, wie SELECT-Anweisungen, sind jedoch zulässig.This prevents updates to the underlying table but allows read operations, such as SELECT statements.

Weitere Informationen finden Sie unter Ausführen von Onlineindexvorgängen .For more information, see Perform Index Operations Online.

Indizes, einschließlich Indizes globaler temporärer Tabellen, können online erstellt werden. Es gelten folgende Ausnahmen:Indexes, including indexes on global temp tables, can be created online except for the following cases:

  • XML-IndexXML index
  • Index für eine lokale temp-TabelleIndex on a local temp table
  • Eindeutiger gruppierter Ausgangsindex für eine SichtInitial unique clustered index on a view
  • Deaktivierte gruppierte IndizesDisabled clustered indexes
  • Columnstore-IndizesColumnstore indexes
  • Gruppierter Index, wenn die zugrunde liegende Tabelle LOB-Datentypen (image, ntext, text) und räumliche Datentypen enthält.Clustered index, if the underlying table contains LOB data types (image, ntext, text) and spatial data types
  • varchar(max) - und varbinary(max) -Spalten können nicht Teil eines Index sein.varchar(max) and varbinary(max) columns cannot be part of an index. In SQL ServerSQL Server (ab SQL Server 2012 (11.x)SQL Server 2012 (11.x)) und Azure SQL-DatenbankAzure SQL Database kann ein gruppierter Index mit der Option ONLINE erstellt oder neu erstellt werden, wenn eine Tabelle Spalten vom Typ varchar(max) oder varbinary(max) enthält.In SQL ServerSQL Server (Starting with SQL Server 2012 (11.x)SQL Server 2012 (11.x)) and Azure SQL-DatenbankAzure SQL Database, when a table contains varchar(max) or varbinary(max) columns, a clustered index containing other columns can be built or rebuilt using the ONLINE option. Azure SQL-DatenbankAzure SQL Database lässt die ONLINE-Option nicht zu, wenn die Basistabelle Spalten vom Typ varchar(max) oder varbinary(max) enthält.does not permit the ONLINE option when the base table contains varchar(max) or varbinary(max) columns

Weitere Informationen finden Sie unter Funktionsweise von Onlineindexvorgängen.For more information, see How Online Index Operations Work.

RESUMABLE = { ON | OFF}RESUMABLE = { ON | OFF}

Gilt für: SQL ServerSQL Server (ab SQL Server 2019 (15.x)SQL Server 2019 (15.x)) und Azure SQL-DatenbankAzure SQL Database (Vorschauversion)Applies to: SQL ServerSQL Server (Starting with SQL Server 2019 (15.x)SQL Server 2019 (15.x)) and Azure SQL-DatenbankAzure SQL Database (public preview)

Gibt an, ob ein Onlineindexvorgang fortsetzbar ist.Specifies whether an online index operation is resumable.

ONON
Der Indexvorgang ist fortsetzbar.Index operation is resumable.

OFFOFF
Der Indexvorgang ist nicht fortsetzbar.Index operation is not resumable.

MAX_DURATION = time [MINUTES] kombiniert mit RESUMABLE = ON (erfordert ONLINE = ON).MAX_DURATION = time [MINUTES] used with RESUMABLE = ON (requires ONLINE = ON)

Gilt für: SQL ServerSQL Server (ab SQL Server 2019 (15.x)SQL Server 2019 (15.x)) und Azure SQL-DatenbankAzure SQL Database (Vorschauversion)Applies to: SQL ServerSQL Server (Starting with SQL Server 2019 (15.x)SQL Server 2019 (15.x)) and Azure SQL-DatenbankAzure SQL Database (public preview)

Gibt die Zeitspanne an (als ganzzahligen Wert in Minuten), in der ein fortsetzbarer Onlineindexvorgang ausgeführt wird, bevor er angehalten wird.Indicates time (an integer value specified in minutes) that a resumable online index operation is executed before being paused.

Wichtig

Ausführlichere Informationen zu Indexvorgängen, die online ausgeführt werden können, finden Sie unter Richtlinien für Onlineindexvorgänge.For more detailed information about index operations that can be performed online, see Guidelines for Online Index Operations.

Hinweis

Fortsetzbare Neuerstellungen von Onlineindizes werden für Columnstore-Indizes nicht unterstützt.Resumable online index rebuilds are not supported on columnstore indexes.

ALLOW_ROW_LOCKS = { ON | OFF }ALLOW_ROW_LOCKS = { ON | OFF }
Gilt für: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 bis SQL Server 2019SQL Server 2019) und Azure SQL-DatenbankAzure SQL DatabaseApplies to: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 through SQL Server 2019SQL Server 2019) and Azure SQL-DatenbankAzure SQL Database

Gibt an, ob Zeilensperren zulässig sind.Specifies whether row locks are allowed. Der Standardwert ist ON.The default is ON.

ONON
Zeilensperren sind beim Zugriff auf den Index zulässig.Row locks are allowed when accessing the index. Das Datenbank-EngineDatabase Engine bestimmt, wann Zeilensperren verwendet werden.The Datenbank-EngineDatabase Engine determines when row locks are used.

OFFOFF
Zeilensperren werden nicht verwendet.Row locks are not used.

ALLOW_PAGE_LOCKS = { ON | OFF }ALLOW_PAGE_LOCKS = { ON | OFF }
Gilt für: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 bis SQL Server 2019SQL Server 2019) und Azure SQL-DatenbankAzure SQL DatabaseApplies to: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 through SQL Server 2019SQL Server 2019) and Azure SQL-DatenbankAzure SQL Database

Gibt an, ob Seitensperren zulässig sind.Specifies whether page locks are allowed. Der Standardwert ist ON.The default is ON.

ONON
Seitensperren sind beim Zugriff auf den Index zulässig.Page locks are allowed when accessing the index. Das Datenbank-EngineDatabase Engine bestimmt, wann Seitensperren verwendet werden.The Datenbank-EngineDatabase Engine determines when page locks are used.

OFFOFF
Seitensperren werden nicht verwendet.Page locks are not used.

OPTIMIZE_FOR_SEQUENTIAL_KEY = { ON | OFF }OPTIMIZE_FOR_SEQUENTIAL_KEY = { ON | OFF }
Gilt für: SQL ServerSQL Server (ab SQL Server 2019 (15.x)SQL Server 2019 (15.x))Applies to: SQL ServerSQL Server (Starting with SQL Server 2019 (15.x)SQL Server 2019 (15.x))

Gibt an, ob der Konflikt beim Einfügen der letzten Seite optimiert werden soll.Specifies whether or not to optimize for last-page insert contention. Der Standardwert ist OFF.The default is OFF. Weitere Informationen finden Sie im Abschnitt Sequenzielle Schlüssel.See the Sequential Keys section for more information.

MAXDOP = max_degree_of_parallelism MAXDOP = max_degree_of_parallelism
Gilt für: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 bis SQL Server 2019SQL Server 2019) und Azure SQL-DatenbankAzure SQL DatabaseApplies to: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 through SQL Server 2019SQL Server 2019) and Azure SQL-DatenbankAzure SQL Database

Überschreibt die Konfigurationsoption max degree of parallelism (Max. Grad an Parallelität) für die Dauer des Indexvorgangs.Overrides the max degree of parallelism configuration option for the duration of the index operation. Weitere Informationen finden Sie unter Konfigurieren der Serverkonfigurationsoption Max. Grad an Parallelität.For more information, see Configure the max degree of parallelism Server Configuration Option. Sie können mit MAXDOP die Anzahl der Prozessoren begrenzen, die bei der Ausführung paralleler Pläne verwendet werden.Use MAXDOP to limit the number of processors used in a parallel plan execution. Maximal sind 64 Prozessoren zulässig.The maximum is 64 processors.

max_degree_of_parallelism kann folgende Werte haben:max_degree_of_parallelism can be:

11
Unterdrückt das Generieren paralleler Pläne.Suppresses parallel plan generation.

>1>1
Beschränkt die maximale Anzahl der Prozessoren, die bei einem parallelen Indexvorgang verwendet werden, je nach aktueller Systemauslastung auf die angegebene Zahl oder einen niedrigeren Wert.Restricts the maximum number of processors used in a parallel index operation to the specified number or fewer based on the current system workload.

0 (Standard)0 (default)
Verwendet abhängig von der aktuellen Systemarbeitsauslastung die tatsächliche Anzahl von Prozessoren oder weniger Prozessoren.Uses the actual number of processors or fewer based on the current system workload.

Weitere Informationen finden Sie unter Konfigurieren von Parallelindexvorgängen.For more information, see Configure Parallel Index Operations.

Hinweis

Parallele Indexvorgänge sind nicht in jeder Edition von MicrosoftMicrosoftSQL ServerSQL Server verfügbar.Parallel index operations are not available in every edition of MicrosoftMicrosoftSQL ServerSQL Server. Eine Liste der Features, die von den Editionen von SQL ServerSQL Server unterstützt werden, finden Sie unter Editionen und unterstütze Features für SQL Server 2016 und Editionen und unterstützte Features von SQL Server 2017.For a list of features that are supported by the editions of SQL ServerSQL Server, see Editions and Supported Features for SQL Server 2016 and Editions and Supported Features for SQL Server 2017.

DATA_COMPRESSIONDATA_COMPRESSION
Gibt die Datenkomprimierungsoption für den angegebenen Index, die Partitionsnummer oder den Bereich von Partitionen an.Specifies the data compression option for the specified index, partition number, or range of partitions. Folgende Optionen stehen zur Verfügung:The options are as follows:

KeineNONE
Der Index oder die angegebenen Partitionen werden nicht komprimiert.Index or specified partitions are not compressed.

ROWROW
Der Index oder die angegebenen Partitionen werden mit Zeilenkomprimierung komprimiert.Index or specified partitions are compressed by using row compression.

PAGEPAGE
Der Index oder die angegebenen Partitionen werden mit Seitenkomprimierung komprimiert.Index or specified partitions are compressed by using page compression.

Weitere Informationen zur Datenkomprimierung finden Sie unter Datenkomprimierung.For more information about compression, see Data Compression.

ON PARTITIONS ( { <partition_number_expression> | <range> } [ , ...n ] ) ON PARTITIONS ( { <partition_number_expression> | <range> } [ ,...n ] )
Gilt für: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 bis SQL Server 2019SQL Server 2019) und Azure SQL-DatenbankAzure SQL DatabaseApplies to: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 through SQL Server 2019SQL Server 2019) and Azure SQL-DatenbankAzure SQL Database

Gibt die Partitionen an, für die die DATA_COMPRESSION-Einstellung gilt.Specifies the partitions to which the DATA_COMPRESSION setting applies. Wenn der Index nicht partitioniert ist, erzeugt das ON PARTITIONS-Argument einen Fehler.If the index is not partitioned, the ON PARTITIONS argument will generate an error. Wenn die ON PARTITIONS-Klausel nicht angegeben wird, gilt die DATA_COMPRESSION-Option für alle Partitionen eines partitionierten Indexes.If the ON PARTITIONS clause is not provided, the DATA_COMPRESSION option applies to all partitions of a partitioned index.

<partition_number_expression> kann auf die folgenden Weisen angegeben werden:<partition_number_expression> can be specified in the following ways:

  • Geben Sie die Nummer der Partition an, beispielsweise: ON PARTITIONS (2).Provide the number for a partition, for example: ON PARTITIONS (2).
  • Geben Sie die Partitionsnummern mehrerer einzelner Partitionen durch Kommas getrennt an, beispielsweise: ON PARTITIONS (1, 5).Provide the partition numbers for several individual partitions separated by commas, for example: ON PARTITIONS (1, 5).
  • Geben Sie sowohl Bereiche als auch einzelne Partitionen an, beispielsweise: ON PARTITIONS (2, 4, 6 TO 8).Provide both ranges and individual partitions, for example: ON PARTITIONS (2, 4, 6 TO 8).

Für <range> können durch das Wort TO getrennte Partitionsnummern angegeben werden, beispielsweise ON PARTITIONS (6 TO 8).<range> can be specified as partition numbers separated by the word TO, for example: ON PARTITIONS (6 TO 8).

Wenn Sie für verschiedene Partitionen unterschiedliche Datenkomprimierungstypen festlegen möchten, geben Sie die Option DATA_COMPRESSION mehrmals an, beispielsweise:To set different types of data compression for different partitions, specify the DATA_COMPRESSION option more than once, for example:

REBUILD WITH
(
  DATA_COMPRESSION = NONE ON PARTITIONS (1),
  DATA_COMPRESSION = ROW ON PARTITIONS (2, 4, 6 TO 8),
  DATA_COMPRESSION = PAGE ON PARTITIONS (3, 5)
);

RemarksRemarks

Die CREATE INDEX-Anweisung wird so optimiert wie jede andere Abfrage.The CREATE INDEX statement is optimized like any other query. Um weniger E/A-Vorgänge zu benötigen, entscheidet der Abfrageprozessor möglicherweise, einen anderen Index zu scannen, statt einen Tabellenscan auszuführen.To save on I/O operations, the query processor may choose to scan another index instead of performing a table scan. Der Sortiervorgang wird in einigen Situationen möglicherweise umgangen.The sort operation may be eliminated in some situations. Auf einem Multiprozessorcomputer kann CREATE INDEX mehr Prozessoren verwenden, um die mit dem Erstellen des Index zusammenhängenden Scan- und Sortiervorgänge auszuführen. Dies geschieht in gleicher Weise wie für andere Abfragen.On multiprocessor computers CREATE INDEX can use more processors to perform the scan and sort operations associated with creating the index, in the same way as other queries do. Weitere Informationen finden Sie unter Konfigurieren von Parallelindexvorgängen.For more information, see Configure Parallel Index Operations.

Der Indexerstellungsvorgang kann minimal protokolliert werden, wenn das Wiederherstellungsmodell der Datenbank auf die massenprotokollierte oder einfache Wiederherstellung festgelegt ist.The create index operation can be minimally logged if the database recovery model is set to either bulk-logged or simple.

Indizes können für temporäre Tabellen erstellt werden.Indexes can be created on a temporary table. Wenn die Tabelle gelöscht oder die Sitzung beendet wird, werden die Indizes gelöscht.When the table is dropped or the session ends, the indexes are dropped.

Ein gruppierter Index kann auf einer Tabellenvariable erstellt werden, wenn ein Primärschlüssel generiert wird.A clustered index can be built on a table variable when a Primary Key is created. Wenn die Abfrage abgeschlossen wird oder die Sitzung beendet wird, wird der Index gelöscht.When the query completes or the session ends, the index is dropped.

Durch Indizes werden erweiterte Eigenschaften unterstützt.Indexes support extended properties.

Gruppierte IndizesClustered Indexes

Für das Erstellen eines gruppierten Index für eine Tabelle (Heap) oder das Löschen und Neuerstellen eines vorhandenen gruppierten Index muss zusätzlicher Arbeitsbereich in der Datenbank verfügbar sein, um das Sortieren von Daten und das Speichern einer temporären Kopie der ursprünglichen Tabelle oder von vorhandenen gruppierten Indexdaten zu ermöglichen.Creating a clustered index on a table (heap) or dropping and re-creating an existing clustered index requires additional workspace to be available in the database to accommodate data sorting and a temporary copy of the original table or existing clustered index data. Weitere Informationen zu gruppierten Indizes finden Sie unter Erstellen gruppierter Indizes und im Leitfaden zur Architektur und zum Design von SQL Server-Indizes.For more information about clustered indexes, see Create Clustered Indexes and the SQL Server Index Architecture and Design Guide.

Nicht gruppierte IndizesNonclustered Indexes

Ab SQL Server 2016 (13.x)SQL Server 2016 (13.x) und Azure SQL-DatenbankAzure SQL Database können Sie nicht gruppierte Indizes für eine Tabelle erstellen, die als gruppierter Columnstore-Index gespeichert wurde.Starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x) and in Azure SQL-DatenbankAzure SQL Database, you can create a nonclustered index on a table stored as a clustered columnstore index. Wenn Sie zuerst einen nicht gruppierten Index für eine Tabelle erstellen, die als Head oder gruppierter Index gespeichert ist, bleibt der Index erhalten, wenn Sie später die Tabelle in einen gruppierten Columnstore-Index konvertieren.If you first create a nonclustered index on a table stored as a heap or clustered index, the index will persist if you later convert the table to a clustered columnstore index. Außerdem ist es nicht notwendig, den nicht gruppierten Index zu löschen, wenn Sie den gruppierten Columnstore-Index neu erstellen.It is also not necessary to drop the nonclustered index when you rebuild the clustered columnstore index.

Einschränkungen:Limitations and Restrictions:

  • Die FILESTREAM_ON-Option ist nicht gültig, wenn Sie einen nicht gruppierten Index für eine Tabelle erstellen, die als gruppierter Columnstore-Index gespeichert wurde.The FILESTREAM_ON option is not valid when you create a nonclustered index on a table stored as a clustered columnstore index.

Eindeutige IndizesUnique Indexes

Wenn ein eindeutiger Index vorhanden ist, prüft Datenbank-EngineDatabase Engine jedes Mal, wenn Daten mithilfe von Einfügevorgängen hinzugefügt werden, auf doppelte Werte.When a unique index exists, the Datenbank-EngineDatabase Engine checks for duplicate values each time data is added by a insert operations. Für Einfügevorgänge, die doppelte Schlüsselwerte generieren würden, wird ein Rollback ausgeführt. In Datenbank-EngineDatabase Engine wird in diesem Fall eine Fehlermeldung angezeigt.Insert operations that would generate duplicate key values are rolled back, and the Datenbank-EngineDatabase Engine displays an error message. Dies trifft auch dann zu, wenn beim Einfügevorgang viele Zeilen geändert werden, aber nur ein doppelter Wert verursacht wird.This is true even if the insert operation changes many rows but causes only one duplicate. Wenn versucht wird, Daten einzugeben, für die ein eindeutiger Index vorhanden ist, und die IGNORE_DUP_KEY-Klausel auf ON festgelegt ist, schlagen nur die Zeilen fehl, die den UNIQUE-Index verletzen.If an attempt is made to enter data for which there is a unique index and the IGNORE_DUP_KEY clause is set to ON, only the rows violating the UNIQUE index fail.

Partitionierte IndizesPartitioned Indexes

Partitionierte Indizes werden ähnlich wie partitionierte Tabellen erstellt und verwaltet. Aber wie gewöhnliche Indizes werden sie wie separate Datenobjekte behandelt.Partitioned indexes are created and maintained in a similar manner to partitioned tables, but like ordinary indexes, they are handled as separate database objects. Sie können einen partitionierten Index für eine nicht partitionierte Tabelle erstellen, und Sie können einen nicht partitionierten Index für eine partitionierte Tabelle erstellen.You can have a partitioned index on a table that is not partitioned, and you can have a nonpartitioned index on a table that is partitioned.

Wenn Sie einen Index für eine partitionierte Tabelle erstellen und keine Dateigruppe angeben, in die der Index platziert werden soll, wird der Index auf die gleiche Weise partitioniert wie die zugrunde liegende Tabelle.If you are creating an index on a partitioned table, and do not specify a filegroup on which to place the index, the index is partitioned in the same manner as the underlying table. Der Grund hierfür ist, dass Indizes standardmäßig in dieselben Dateigruppen wie die zugrunde liegenden Tabellen platziert werden. Bei partitionierten Tabellen werden Indizes in dasselbe Partitionsschema platziert, das dieselben Partitionierungsspalten verwendet.This is because indexes, by default, are placed on the same filegroups as their underlying tables, and for a partitioned table in the same partition scheme that uses the same partitioning columns. Wenn der Index das gleiche Partitionsschema und die gleiche Partitionierungsspalte wie die Tabelle verwendet, wird der Index auf die Tabelle ausgerichtet.When the index uses the same partition scheme and partitioning column as the table, the index is aligned with the table.

Warnung

Das Erstellen bzw. Neuerstellen von nicht ausgerichteten Indizes für eine Tabelle mit mehr als 1.000 Partitionen ist möglich, wird aber nicht unterstützt.Creating and rebuilding nonaligned indexes on a table with more than 1,000 partitions is possible, but is not supported. Dies hätte Leistungseinbußen oder eine zu hohe Speicherauslastung während der Vorgänge zur Folge.Doing so may cause degraded performance or excessive memory consumption during these operations. Es empfiehlt sich, bei mehr als 1.000 Partitionen nur ausgerichtete Indizes zu verwenden.We recommend using only aligned indexes when the number of partitions exceed 1,000.

Beim Partitionieren eines nicht eindeutigen gruppierten Index fügt Datenbank-EngineDatabase Engine standardmäßig alle Partitionierungsspalten zu der Liste der gruppierten Indexschlüssel hinzu, sofern sie dort noch nicht angegeben wurden.When partitioning a non-unique, clustered index, the Datenbank-EngineDatabase Engine by default adds any partitioning columns to the list of clustered index keys, if not already specified.

Indizierte Sichten können für partitionierte Tabellen auf die gleiche Weise wie Indizes für Tabellen erstellt werden.Indexed views can be created on partitioned tables in the same manner as indexes on tables. Weitere Informationen zu gruppierten Indizes finden Sie unter Partitionierte Tabellen und Indizes und im Leitfaden zur Architektur und zum Design von SQL Server-Indizes.For more information about partitioned indexes, see Partitioned Tables and Indexes and the SQL Server Index Architecture and Design Guide.

In SQL Server 2019SQL Server 2019 werden Statistiken nicht durch das Scannen aller Zeilen in der Tabelle erstellt, wenn ein partitionierter Index erstellt oder neu erstellt wird.In SQL Server 2019SQL Server 2019, statistics are not created by scanning all the rows in the table when a partitioned index is created or rebuilt. Der Abfrageoptimierer generiert stattdessen Statistiken mithilfe des Standardalgorithmus zur Stichprobenentnahme.Instead, the query optimizer uses the default sampling algorithm to generate statistics. Um Statistiken zu partitionierten Indizes durch das Scannen aller Zeilen in der Tabelle abzurufen, verwenden Sie CREATE STATISTICS oder UPDATE STATISTICS mit der FULLSCAN-Klausel.To obtain statistics on partitioned indexes by scanning all the rows in the table, use CREATE STATISTICS or UPDATE STATISTICS with the FULLSCAN clause.

Gefilterten IndizesFiltered Indexes

Ein gefilterter Index ist ein optimierter nicht gruppierter Index, der sich für Abfragen eignet, mit denen ein kleiner Prozentsatz von Zeilen in einer Tabelle ausgewählt wird.A filtered index is an optimized nonclustered index, suited for queries that select a small percentage of rows from a table. Es wird ein Filterprädikat verwendet, um einen Teil der Daten in der Tabelle zu indizieren.It uses a filter predicate to index a portion of the data in the table. Ein gut entworfener gefilterter Index kann die Abfrageleistung verbessern, den Speicheraufwand verringern und Wartungskosten reduzieren.A well-designed filtered index can improve query performance, reduce storage costs, and reduce maintenance costs.

Erforderliche SET-Optionen für gefilterte IndizesRequired SET Options for Filtered Indexes

Die SET-Optionen in der Spalte Erforderlicher Wert sind immer dann erforderlich, wenn eine der folgenden Bedingungen auftritt:The SET options in the Required Value column are required whenever any of the following conditions occur:

  • Es wird ein gefilterter Index erstellt.Create a filtered index.

  • Ein INSERT-, UPDATE-, DELETE- oder MERGE-Vorgang ändert die Daten in einem gefilterten Index.INSERT, UPDATE, DELETE, or MERGE operation modifies the data in a filtered index.

  • Der gefilterte Index wird vom Abfrageoptimierer verwendet, um den Abfrageplan zu erstellen.The filtered index is used by the query optimizer to produce the query plan.

    SET-OptionenSET options Erforderlicher WertRequired value StandardserverwertDefault server value DefaultDefault

    OLE DB- und ODBC-WertOLE DB and ODBC value
    DefaultDefault

    DB-Library-WertDB-Library value
    ANSI_NULLSANSI_NULLS ONON ONON ONON OFFOFF
    ANSI_PADDINGANSI_PADDING ONON ONON ONON OFFOFF
    ANSI_WARNINGS*ANSI_WARNINGS* ONON ONON ONON OFFOFF
    ARITHABORTARITHABORT ONON ONON OFFOFF OFFOFF
    CONCAT_NULL_YIELDS_NULLCONCAT_NULL_YIELDS_NULL ONON ONON ONON OFFOFF
    NUMERIC_ROUNDABORTNUMERIC_ROUNDABORT OFFOFF OFFOFF OFFOFF OFFOFF
    QUOTED_IDENTIFIERQUOTED_IDENTIFIER ONON ONON ONON OFFOFF
    • Durch Festlegen von ANSI_WARNINGS auf ON wird implizit ARITHABORT auf ON festgelegt, wenn der Kompatibilitätsgrad der Datenbank auf 90 oder höher festgelegt ist.Setting ANSI_WARNINGS to ON implicitly sets ARITHABORT to ON when the database compatibility level is set to 90 or higher. Wird der Kompatibilitätsgrad der Datenbank auf 80 oder niedriger festgelegt, muss die ARITHABORT-Option explizit auf ON festgelegt werden.If the database compatibility level is set to 80 or earlier, the ARITHABORT option must explicitly be set to ON.

Wenn die SET-Optionen falsch sind, können die folgenden Bedingungen auftreten:If the SET options are incorrect, the following conditions can occur:

  • Der gefilterte Index wird nicht erstellt.The filtered index is not created.
  • Datenbank-EngineDatabase Engine generiert einen Fehler und führt ein Rollback aller INSERT-, UPDATE-, DELETE- oder MERGE-Anweisungen aus, die im Index gespeicherte Daten ändern.The Datenbank-EngineDatabase Engine generates an error and rolls back INSERT, UPDATE, DELETE, or MERGE statements that change data in the index.
  • Der Abfrageoptimierer berücksichtigt den Index des Abfrageausführungsplans von Transact-SQL-Anweisungen nicht.Query optimizer does not consider the index in the execution plan for any Transact-SQL statements.

Weitere Informationen zu gruppierten Indizes finden Sie unter Erstellen gefilterter Indizes und im Leitfaden zur Architektur und zum Design von SQL Server-Indizes.For more information about Filtered Indexes, see Create Filtered Indexes and the SQL Server Index Architecture and Design Guide.

Räumliche IndizesSpatial Indexes

Weitere Informationen zu räumlichen Indizes finden Sie unter CREATE SPATIAL INDEX und Übersicht über räumliche Indizes.For information about spatial indexes, see CREATE SPATIAL INDEX and Spatial Indexes Overview.

XML-IndizesXML Indexes

Weitere Informationen zu XML-Indizes finden Sie unter CREATE XML INDEX; und XML-Indizes (SQL Server).For information about XML indexes see, CREATE XML INDEX and XML Indexes (SQL Server).

IndexschlüsselgrößeIndex Key Size

Die maximale Größe für einen Indexschlüssel beträgt 900 Byte für gruppierte Indizes und 1700 Byte für nicht gruppierte Indizes.The maximum size for an index key is 900 bytes for a clustered index and 1,700 bytes for a nonclustered index. (Vor SQL-DatenbankSQL Database und SQL Server 2016 (13.x)SQL Server 2016 (13.x) lag die maximale Größe bei 900 Byte.) Indizes für Spalten des Datentyps varchar, deren Größe das Limit überschreitet, können erstellt werden, wenn die in den Spalten vorhandenen Daten zum Zeitpunkt der Indexerstellung das Größenlimit nicht überschreiten. Allerdings treten bei nachfolgenden Einfüge- oder Updateaktionen für die Spalten Fehler auf, wenn dadurch das Limit überschritten wird.(Before SQL-DatenbankSQL Database and SQL Server 2016 (13.x)SQL Server 2016 (13.x) the limit was always 900 bytes.) Indexes on varchar columns that exceed the byte limit can be created if the existing data in the columns do not exceed the limit at the time the index is created; however, subsequent insert or update actions on the columns that cause the total size to be greater than the limit will fail. 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.

Nicht gruppierte Indizes können Nichtschlüsselspalten auf der Blattebene des Indexes enthalten.Nonclustered indexes can include non-key columns in the leaf level of the index. Diese Spalten werden von Datenbank-EngineDatabase Engine beim Berechnen der Indexschlüsselgröße nicht berücksichtigt.These columns are not considered by the Datenbank-EngineDatabase Engine when calculating the index key size . Weitere Informationen finden Sie unter Erstellen von Indizes mit eingeschlossenen Spalten und im Leitfaden zur Architektur und zum Design von SQL Server-Indizes.For more information, see Create Indexes with Included Columns and the SQL Server Index Architecture and Design Guide.

Hinweis

Falls beim Partitionieren der Tabellen die Partitionierungsschlüsselspalten nicht bereits in einem nicht eindeutigen gruppierten Index vorhanden sind, werden Sie mithilfe von Datenbank-EngineDatabase Engine dem Index hinzugefügt.When tables are partitioned, if the partitioning key columns are not already present in a non-unique clustered index, they are added to the index by the Datenbank-EngineDatabase Engine. Die kombinierte Größe der indizierten Spalten (eingeschlossene Spalten werden nicht gezählt), zzgl. beliebiger hinzugefügter Partitionierungsspalten dürfen 1800 Byte in einem nicht eindeutigen gruppierten Index nicht übersteigen.The combined size of the indexed columns (not counting included columns), plus any added partitioning columns cannot exceed 1800 bytes in a non-unique clustered index.

Berechnete SpaltenComputed Columns

Indizes können für berechnete Spalten erstellt werden.Indexes can be created on computed columns. Zudem können berechnete Spalten die Eigenschaft PERSISTED besitzen.In addition, computed columns can have the property PERSISTED. Das bedeutet, dass Datenbank-EngineDatabase Engine die berechneten Werte in der Tabelle speichert und sie aktualisiert, wenn andere Spalten, von denen die berechnete Spalte abhängt, aktualisiert werden.This means that the Datenbank-EngineDatabase Engine stores the computed values in the table, and updates them when any other columns on which the computed column depends are updated. Datenbank-EngineDatabase Engine verwendet diese persistenten Werte, wenn ein Index für die Spalte erstellt wird und wenn in einer Abfrage auf den Index verwiesen wird.The Datenbank-EngineDatabase Engine uses these persisted values when it creates an index on the column, and when the index is referenced in a query.

Zum Indizieren einer berechneten Spalte muss diese deterministisch und präzise sein.To index a computed column, the computed column must deterministic and precise. Allerdings wird mithilfe der PERSISTED-Eigenschaft der Typ der indizierbaren berechneten Spalten um Folgendes erweitert:However, using the PERSISTED property expands the type of indexable computed columns to include:

  • Auf Transact-SQLTransact-SQL und CLR-Funktionen basierte berechnete Spalten und Methoden des CLR-benutzerdefinierten Typs, die vom Benutzer als deterministisch markiert sind.Computed columns based on Transact-SQLTransact-SQL and CLR functions and CLR user-defined type methods that are marked deterministic by the user.
  • Berechnete Spalten, die auf Ausdrücken basieren, die gemäß der Definition von Datenbank-EngineDatabase Engine deterministisch, aber unpräzise sind.Computed columns based on expressions that are deterministic as defined by the Datenbank-EngineDatabase Engine but imprecise.

Für persistente berechnete Spalten müssen die folgenden SET-Optionen wie im vorherigen Abschnitt Erforderliche SET-Optionen für gefilterte Indizes gezeigt festgelegt werden.Persisted computed columns require the following SET options to be set as shown in the previous section Required SET Options for Filtered Indexes.

Die jeweilige UNIQUE- oder PRIMARY KEY-Einschränkung kann eine berechnete Spalte enthalten, sofern diese alle Bedingungen für das Indizieren erfüllt.The UNIQUE or PRIMARY KEY constraint can contain a computed column as long as it satisfies all conditions for indexing. Die berechnete Spalte muss insbesondere deterministisch und präzise oder deterministisch und persistent sein.Specifically, the computed column must be deterministic and precise or deterministic and persisted. Weitere Informationen zu deterministischen Funktionen finden Sie unter Deterministische und nicht deterministische Funktionen.For more information about determinism, see Deterministic and Nondeterministic Functions.

Berechnete Spalten, die aus den Datentypen image, ntext, text, varchar(max) , nvarchar(max) , varbinary(max) und xml abgeleitet wurden, können entweder als Schlüssel oder eingefügte Spalte indiziert werden, bei der es sich nicht um eine Schlüsselspalte handelt, solange der Datentyp der berechneten Spalte als Indexschlüsselspalte oder Nichtschlüsselspalte zulässig ist.Computed columns derived from image, ntext, text, varchar(max), nvarchar(max), varbinary(max), and xml data types can be indexed either as a key or included non-key column as long as the computed column data type is allowable as an index key column or non-key column. Sie können beispielsweise keinen primären XML-Index für eine berechnete xml-Spalte erstellen.For example, you cannot create a primary XML index on a computed xml column. Wenn der Indexschlüssel die zulässige Größe von 900 Byte überschreitet, wird eine Warnmeldung angezeigt.If the index key size exceeds 900 bytes, a warning message is displayed.

Das Erstellen eines Indexes für eine berechnete Spalte kann bei einem Einfüge- oder Updatevorgang einen Fehler erzeugen, wenn der Einfüge- oder Updatevorgang zuvor funktioniert hat.Creating an index on a computed column may cause the failure of an insert or update operation that previously worked. Ein solcher Fehler tritt möglicherweise auf, wenn die berechnete Spalte einen arithmetischen Fehler zur Folge hat.Such a failure may take place when the computed column results in arithmetic error. In der folgenden Tabelle wird zum Beispiel die INSERT-Anweisung erfolgreich ausgeführt, obwohl die berechnete Spalte c einen arithmetischen Fehler zur Folge hat.For example, in the following table, although computed column c results in an arithmetic error, the INSERT statement works.

CREATE TABLE t1 (a INT, b INT, c AS a/b);
INSERT INTO t1 VALUES (1, 0);

Wenn Sie allerdings nach dem Erstellen der Tabelle einen Index für die berechnete Spalte c erstellen, meldet die gleiche INSERT-Anweisung einen Fehler.If, instead, after creating the table, you create an index on computed column c, the same INSERT statement will now fail.

CREATE TABLE t1 (a INT, b INT, c AS a/b);
CREATE UNIQUE CLUSTERED INDEX Idx1 ON t1(c);
INSERT INTO t1 VALUES (1, 0);

Weitere Informationen finden Sie unter Indexes on Computed Columns.For more information, see Indexes on Computed Columns.

Eingeschlossene Spalten in IndizesIncluded Columns in Indexes

Nichtschlüsselspalten werden als eingeschlossene Spalten bezeichnet und können zur Blattebene eines nicht gruppierten Index hinzugefügt werden, um die Abfrageleistung durch Abdecken der Abfrage zu verbessern.Non-key columns, called included columns, can be added to the leaf level of a nonclustered index to improve query performance by covering the query. Das heißt, alle Spalten, auf die in der Abfrage verwiesen wird, sind im Index als Schlüssel- oder Nichtschlüsselspalten enthalten.That is, all columns referenced in the query are included in the index as either key or non-key columns. Dadurch kann der Abfrageoptimierer alle erforderlichen Informationen über einen Indexscan suchen. Es erfolgt kein Zugriff auf die Daten der Tabelle oder des gruppierten Index.This allows the query optimizer to locate all the required information from an index scan; the table or clustered index data is not accessed. Weitere Informationen finden Sie unter Erstellen von Indizes mit eingeschlossenen Spalten und im Leitfaden zur Architektur und zum Design von SQL Server-Indizes.For more information, see Create Indexes with Included Columns and the SQL Server Index Architecture and Design Guide.

Angeben von IndexoptionenSpecifying Index Options

Mit SQL Server 2005 (9.x)SQL Server 2005 (9.x) wurden neue Indexoptionen eingeführt. Außerdem werden die Optionen auf andere Weise angegeben.SQL Server 2005 (9.x)SQL Server 2005 (9.x) introduced new index options and also modifies the way in which options are specified. In der abwärtskompatiblen Syntax ist WITH option_name gleichbedeutend mit WITH ( <option_name> = ON ) .In backward compatible syntax, WITH option_name is equivalent to WITH ( <option_name> = ON ). Beim Festlegen von Indexoptionen gelten folgende Regeln:When you set index options, the following rules apply:

  • Neue Indexoptionen können nur mithilfe von WITH ( option_name = ON | OFF) angegeben werden.New index options can only be specified by using WITH (option_name = ON | OFF).
  • Optionen können nicht mithilfe der abwärtskompatiblen und der neuen Syntax in derselben Anweisung angegeben werden.Options cannot be specified by using both the backward compatible and new syntax in the same statement. Wenn Sie beispielsweise WITH (DROP_EXISTING, ONLINE = ON) angeben, schlägt die Anweisung fehl.For example, specifying WITH (DROP_EXISTING, ONLINE = ON) causes the statement to fail.
  • Beim Erstellen eines XML-Index müssen die Optionen mithilfe von WITH ( option_name= ON | OFF) angegeben werden.When you create an XML index, the options must be specified by using WITH (option_name= ON | OFF).

DROP_EXISTING (Klausel)DROP_EXISTING Clause

Mit der DROP_EXISTING-Klausel können Sie den Index neu erstellen, Spalten hinzufügen oder löschen, Optionen ändern, die Sortierreihenfolge für Spalten ändern sowie das Partitionsschema oder die Dateigruppe ändern.You can use the DROP_EXISTING clause to rebuild the index, add or drop columns, modify options, modify column sort order, or change the partition scheme or filegroup.

Wenn der Index eine PRIMARY KEY- oder UNIQUE-Einschränkung erzwingt und die Indexdefinition in keiner Weise geändert wurde, wird der Index gelöscht und neu erstellt. Dabei wird die vorhandene Einschränkung beibehalten.If the index enforces a PRIMARY KEY or UNIQUE constraint and the index definition is not altered in any way, the index is dropped and re-created preserving the existing constraint. Wenn die Indexdefinition jedoch geändert wird, schlägt die Anweisung fehl.However, if the index definition is altered the statement fails. Zum Ändern der Definition einer PRIMARY KEY- oder UNIQUE-Einschränkung müssen Sie die Einschränkung löschen und eine Einschränkung mit der neuen Definition hinzufügen.To change the definition of a PRIMARY KEY or UNIQUE constraint, drop the constraint and add a constraint with the new definition.

Die DROP_EXISTING-Klausel erhöht die Leistung beim Neuerstellen eines gruppierten Index (mit der gleichen oder einer anderen Schlüsselmenge) für eine Tabelle, die auch nicht gruppierte Indizes besitzt.DROP_EXISTING enhances performance when you re-create a clustered index, with either the same or different set of keys, on a table that also has nonclustered indexes. Die DROP_EXISTING-Klausel ersetzt die Ausführung einer DROP INDEX-Anweisung für den alten gruppierten Index mit anschließender Ausführung einer CREATE INDEX-Anweisung für den neuen gruppierten Index.DROP_EXISTING replaces the execution of a DROP INDEX statement on the old clustered index followed by the execution of a CREATE INDEX statement for the new clustered index. Die nicht gruppierten Indizes werden einmal neu erstellt, dies aber nur dann, wenn die Indexdefinition geändert wurde.The nonclustered indexes are rebuilt once, and then only if the index definition has changed. Die DROP_EXISTING-Klausel erstellt die nicht gruppierten Indizes nicht neu, wenn die Indexdefinition denselben Indexnamen, dieselben Schlüssel- und Partitionsspalten, dasselbe Eindeutigkeitsattribut und dieselbe Sortierreihenfolge wie der ursprüngliche Index aufweist.The DROP_EXISTING clause does not rebuild the nonclustered indexes when the index definition has the same index name, key and partition columns, uniqueness attribute, and sort order as the original index.

Unabhängig davon, ob die nicht gruppierten Indizes neu erstellt werden, verbleiben sie immer in ihren ursprünglichen Dateigruppen oder Partitionsschemas und verwenden die ursprünglichen Partitionsfunktionen.Whether the nonclustered indexes are rebuilt or not, they always remain in their original filegroups or partition schemes and use the original partition functions. Wenn ein gruppierter Index in einer anderen Dateigruppe oder einem anderen Partitionsschema neu erstellt wird, werden die nicht gruppierten Indizes nicht an den neuen Standort des gruppierten Index verschoben.If a clustered index is rebuilt to a different filegroup or partition scheme, the nonclustered indexes are not moved to coincide with the new location of the clustered index. Daher können auch die nicht gruppierten Indizes, die zuvor mit dem gruppierten Index ausgerichtet waren, möglicherweise nicht mehr damit ausgerichtet sein.Therefore, even the nonclustered indexes previously aligned with the clustered index, they may no longer be aligned with it. Weitere Informationen zu Ausrichtung von partitionierten Indizes finden Sie unter Partitionierte Tabellen und Indizes.For more information about partitioned index alignment, see Partitioned Tables and Indexes.

Die DROP_EXISTING-Klausel sortiert die Daten nicht erneut, wenn dieselben Indexschlüsselspalten in derselben Reihenfolge und mit derselben aufsteigenden oder absteigenden Reihenfolge verwendet werden, es sei denn, in der Indexanweisung ist ein nicht gruppierter Index angegeben und die ONLINE-Option ist auf OFF festgelegt.The DROP_EXISTING clause will not sort the data again if the same index key columns are used in the same order and with the same ascending or descending order, unless the index statement specifies a nonclustered index and the ONLINE option is set to OFF. Wenn der gruppierte Index deaktiviert ist, muss der CREATE INDEX WITH DROP_EXISTING-Vorgang mit der ONLINE-Einstellung OFF durchgeführt werden.If the clustered index is disabled, the CREATE INDEX WITH DROP_EXISTING operation must be performed with ONLINE set to OFF. Wenn ein nicht gruppierter Index deaktiviert ist und keinem deaktivierten gruppierten Index zugeordnet ist, kann der CREATE INDEX WITH DROP_EXISTING-Vorgang mit der ONLINE-Einstellung OFF oder ON durchgeführt werden.If a nonclustered index is disabled and is not associated with a disabled clustered index, the CREATE INDEX WITH DROP_EXISTING operation can be performed with ONLINE set to OFF or ON.

Hinweis

Wenn Indizes mit 128 oder mehr Blöcken gelöscht oder neu erstellt werden, verzögert Datenbank-EngineDatabase Engine die eigentlichen Seitenzuordnungsaufhebungen und die zugehörigen Sperren bis zu einem Zeitpunkt nach dem Transaktionscommit.When indexes with 128 extents or more are dropped or rebuilt, the Datenbank-EngineDatabase Engine defers the actual page deallocations, and their associated locks, until after the transaction commits.

ONLINE (Option)ONLINE Option

Die folgenden Regeln gelten für das Durchführen von Onlineindexvorgängen:The following guidelines apply for performing index operations online:

  • Die zugrunde liegende Tabelle kann nicht geändert, abgeschnitten oder gelöscht werden, wenn ein Onlineindexvorgang verarbeitet wird.The underlying table cannot be altered, truncated, or dropped while an online index operation is in process.
  • Beim Indexvorgang ist zusätzlicher temporärer Speicherplatz erforderlich.Additional temporary disk space is required during the index operation.
  • Onlinevorgänge können für partitionierte Indizes und Indizes durchgeführt werden, die persistente berechnete Spalten oder eingeschlossene Spalten enthalten.Online operations can be performed on partitioned indexes and indexes that contain persisted computed columns, or included columns.

Weitere Informationen finden Sie unter Ausführen von Onlineindexvorgängen .For more information, see Perform Index Operations Online.

Fortsetzbare IndexvorgängeResumable index operations

Gilt für: SQL ServerSQL Server (ab SQL Server 2019 (15.x)SQL Server 2019 (15.x)) und Azure SQL-DatenbankAzure SQL Database (Vorschauversion)Applies to: SQL ServerSQL Server (Starting with SQL Server 2019 (15.x)SQL Server 2019 (15.x)) and Azure SQL-DatenbankAzure SQL Database (public preview)

Die folgenden Richtlinien gelten für fortsetzbare Indexvorgänge:The following guidelines apply for resumable index operations:

  • Eine Onlineneuerstellung eines Indexes wird mit der RESUMABLE = ON-Option als fortsetzbar angegeben.Online index create is specified as resumable using the RESUMABLE = ON option.
  • Die RESUMABLE-Option wird in den Metadaten nicht für einen bestimmten Index beibehalten und gilt nur für die Dauer der aktuellen DDL-Anweisung.The RESUMABLE option is not persisted in the metadata for a given index and applies only to the duration of a current DDL statement. Daher muss die RESUMABLE = ON-Klausel explizit angegeben werden, wenn Fortsetzbarkeit aktiviert werden soll.Therefore, the RESUMABLE = ON clause must be specified explicitly to enable resumability.
  • Die MAX_DURATION-Option wird nur für die RESUMABLE = ON-Option unterstützt.MAX_DURATION option is only supported for RESUMABLE = ON option.
  • MAX_DURATION gibt bei der RESUMABLE-Option das Zeitintervall an, in dem ein Index erstellt wird.MAX_DURATION for RESUMABLE option specifies the time interval for an index being built. Sobald dieses Zeitintervall beendet ist, wird die Indexerstellung entweder angehalten oder in ihrer Ausführung beendet.Once this time is used the index build is either paused or it completes its execution. Der Benutzer entscheidet, wann die Erstellung eines angehaltenen Index fortgesetzt werden kann.User decides when a build for a paused index can be resumed. Die Zeitspanne für MAX_DURATION in Minuten muss größer als 0 Minuten und kleiner oder gleich einer Woche (7 * 24 * 60 = 10.080 Minuten) sein.The time in minutes for MAX_DURATION must be greater than 0 minutes and less or equal one week (7 * 24 * 60 = 10080 minutes). Das lange Anhalten eines Indexvorgangs kann Auswirkungen auf die DML-Leistung für eine bestimmte Tabelle sowie die Datenträgerkapazität der Datenbank haben, da sowohl der ursprüngliche Index als auch der neu erstellte Index Speicherplatz benötigen und während der DML-Vorgänge aktualisiert werden müssen.Having a long pause for an index operation may impact the DML performance on a specific table as well as the database disk capacity since both indexes the original one and the newly created one require disk space and need to be updated during DML operations. Wird die MAX_DURATION-Option ausgelassen, dann wird der Indexvorgang bis zum vollständigen Abschluss oder bis ein Fehler auftritt fortgeführt.If MAX_DURATION option is omitted, the index operation will continue until its completion or until a failure occurs.
  • Wenn Sie den Indexvorgang sofort anhalten möchten, können Sie den laufenden Befehl beenden (STRG+C) oder die Befehle ALTER INDEX PAUSE oder KILL <session_id> ausführen.To pause immediately the index operation, you can stop (Ctrl-C) the ongoing command, execute the ALTER INDEX PAUSE command, or execute the KILL <session_id> command. Ein angehaltener Befehl kann mit dem Befehl ALTER INDEX fortgesetzt werden.Once the command is paused, it can be resumed using ALTER INDEX command.
  • Das erneute Ausführen der ursprünglichen CREATE INDEX-Anweisung für den fortsetzbaren Index führt dazu, dass ein angehaltener Indexvorgang automatisch fortgesetzt wird.Re-executing the original CREATE INDEX statement for resumable index, automatically resumes a paused index create operation.
  • Die Option SORT_IN_TEMPDB = ON wird für den fortsetzbaren Index nicht unterstützt.The SORT_IN_TEMPDB = ON option is not supported for resumable index.
  • Der DDL-Befehl kann mit RESUMABLE = ON nicht innerhalb einer expliziten Transaktion ausgeführt werden (kann nicht Teil des Blocks „Begin TRAN ... COMMIT“ sein).The DDL command with RESUMABLE = ON cannot be executed inside an explicit transaction (cannot be part of begin TRAN ... COMMIT block).
  • Zum Fortsetzen bzw. Abbrechen einer Indexerstellung bzw. -neuerstellung verwenden Sie die ALTER INDEX-T-SQL-Syntax.To resume/abort an index create/rebuild, use the ALTER INDEX T-SQL syntax

Hinweis

Der DDL-Befehl wird so lange ausgeführt, bis er entweder abgeschlossen ist, angehalten wird oder ein Fehler auftritt.The DDL command runs until it completes, pauses or fails. Wenn der Befehl angehalten wird, wird ein Fehler ausgelöst, der meldet, dass der Vorgang angehalten wurde und dass die Indexerstellung nicht abgeschlossen wurde.In case the command pauses, an error will be issued indicating that the operation was paused and that the index creation did not complete. Weitere Informationen zum aktuellen Indexstatus finden Sie unter sys.index_resumable_operations.More information about the current index status can be obtained from sys.index_resumable_operations. Tritt ein Fehler auf, wird auch hier eine Fehlermeldung ausgegeben.As before in case of a failure an error will be issued as well.

Informationen zur Anzeige, dass eine Indexerstellung als fortsetzbarer Vorgang ausgeführt wird, und zur Überprüfung des aktuellen Ausführungsstatus finden Sie unter sys.index_resumable_operations.To indicate that an index create is executed as resumable operation and to check its current execution state, see sys.index_resumable_operations.

RessourcenResources

Die folgenden Ressourcen sind für die Onlineerstellung des fortsetzbaren Indexes erforderlich:The following resources are required for resumable online index create operation:

  • zusätzlichem Speicherplatz, damit der Index weiter erstellt wird, einschließlich der Zeit, wenn der Index angehalten wirdAdditional space required to keep the index being built, including the time when index is being paused
  • Zusätzlicher Protokolldurchsatz während der SortierungsphaseAdditional log throughput during the sorting phase. Der insgesamt durch Protokolle belegte Speicherplatz für den fortsetzbaren Index ist geringer als bei der Erstellung eines regulären Onlineindexes. Zudem ist eine Protokollkürzung während dieses Vorgangs möglich.The overall log space usage for resumable index is less compared to regular online index create and allows log truncation during this operation.
  • DDL-Status zur Verhinderung von DDL-ÄnderungenA DDL state preventing any DDL modification
  • Ein Cleanup inaktiver Datensätze wird für den Index innerhalb des Builds für die Dauer des Vorgangs blockiert, während dieser angehalten und auch während der Vorgang ausgeführt wird.Ghost cleanup is blocked on the in-build index for the duration of the operation both while paused and while the operation is running.

Aktuelle funktionale EinschränkungenCurrent functional limitations

Die folgenden Funktionen sind für Vorgänge zur Erstellung fortsetzbarer Indizes deaktiviert:The following functionality is disabled for resumable index create operations:

  • Nachdem der Vorgang zum Erstellen eines fortsetzbaren Onlineindexes angehalten wurde, kann der ursprüngliche Wert von MAXDOP nicht mehr geändert werden.After a resumable online index create operation is paused, the initial value of MAXDOP cannot be changed

  • Die Erstellung eines Indexes, der Folgendes enthält:Create an index that contains:

    • Berechnete Spalte oder TIMESTAMP-Spalte als SchlüsselspalteComputed or TIMESTAMP column(s) as key columns
    • LOB-Spalte als enthaltene Spalte für die Erstellung des fortsetzbaren IndexesLOB column as included column for resumable index create
    • Gefilterter IndexFiltered index

Zeilen- und Seitensperren (Optionen)Row and Page Locks Options

Wenn ALLOW_ROW_LOCKS = ON und ALLOW_PAGE_LOCK = ON angegeben sind, sind Sperren auf Zeilen-, Seiten- und Tabellenebene zulässig, wenn auf den Index zugegriffen wird.When ALLOW_ROW_LOCKS = ON and ALLOW_PAGE_LOCK = ON, row-, page-, and table-level locks are allowed when accessing the index. Das Datenbank-EngineDatabase Engine wählt die geeignete Sperre aus und kann die Sperre von einer Zeilen- oder Seitensperre auf eine Tabellensperre ausweiten.The Datenbank-EngineDatabase Engine chooses the appropriate lock and can escalate the lock from a row or page lock to a table lock.

Wenn ALLOW_ROW_LOCKS = OFF und ALLOW_PAGE_LOCK = OFF angegeben sind, ist nur eine Sperre auf Tabellenebene zulässig, wenn auf den Index zugegriffen wird.When ALLOW_ROW_LOCKS = OFF and ALLOW_PAGE_LOCK = OFF, only a table-level lock is allowed when accessing the index.

Sequenzielle SchlüsselSequential Keys

Gilt für: SQL ServerSQL Server (ab SQL Server 2019 (15.x)SQL Server 2019 (15.x))Applies to: SQL ServerSQL Server (Starting with SQL Server 2019 (15.x)SQL Server 2019 (15.x))

Das Leistungsproblem von Speicherkonflikten bei Einfügevorgängen für die letzte Seite tritt häufig auf, wenn eine große Anzahl von gleichzeitigen Threads versucht, Zeilen in einen Index mit einem sequentiellen Schlüssel einzufügen.Last-page insert contention is a common performance problem that occurs when a large number of concurrent threads attempt to insert rows into an index with a sequential key. Ein Index wird als sequentiell betrachtet, wenn die führende Schlüsselspalte Werte enthält, die immer größer (oder kleiner) werden, wie beispielsweise eine Identitätsspalte oder ein Datum, das auf das aktuelle Datum/Uhrzeit voreingestellt ist.An index is considered sequential when the leading key column contains values that are always increasing (or decreasing), such as an identity column or a date that defaults to the current date/time. Da die einzufügenden Schlüssel sequentiell sind, werden alle neuen Zeilen am Ende der Indexstruktur eingefügt – also auf der gleichen Seite.Because the keys being inserted are sequential, all new rows will be inserted at the end of the index structure - in other words, on the same page. Dies führt zu Konflikten für die Seite im Speicher, die als mehrere Threads betrachtet werden kann, die auf PAGELATCH_EX für die betreffende Seite warten.This leads to contention for the page in memory which can be observed as several threads waiting on PAGELATCH_EX for the page in question.

Diese Indexoption OPTIMIZE_FOR_SEQUENTIAL_KEY aktiviert eine Optimierung in der Datenbank-Engine, die den Durchsatz für Einfügevorgänge mit hoher Parallelität in den Index verbessert.Turning on the OPTIMIZE_FOR_SEQUENTIAL_KEY index option enables an optimization within the database engine that helps improve throughput for high-concurrency inserts into the index. Dies ist für Indizes vorgesehen, die einen sequenziellen Schlüssel enthalten und bei denen es daher verstärkt zu Speicherkonflikten bei Einfügevorgängen für die letzte Seite kommen kann, kann aber auch für Indizes verwendet werden, die Hotspots in anderen Bereichen des B-Strukturindex aufweisen.It is intended for indexes that have a sequential key and thus are prone to last-page insert contention, but it may also help with indexes that have hot spots in other areas of the B-Tree index structure.

Anzeigen von IndexinformationenViewing Index Information

Informationen zu Indizes können Sie mithilfe von Katalogsichten, Systemfunktionen und gespeicherten Systemprozeduren zurückgeben.To return information about indexes, you can use catalog views, system functions, and system stored procedures.

DatenkomprimierungData Compression

Die Datenkomprimierung wird im Artikel Datenkomprimierung beschrieben.Data compression is described in the topic Data Compression. Die folgenden wichtigen Punkte sind zu berücksichtigen:The following are key points to consider:

  • Die Komprimierung kann es ermöglichen, dass mehr Zeilen auf einer Seite gespeichert werden, die maximale Zeilengröße wird durch sie allerdings nicht geändert.Compression can allow more rows to be stored on a page, but does not change the maximum row size.
  • Nicht-Blattseiten eines Index sind nicht seitenkomprimiert, können jedoch zeilenkomprimiert sein.Non-leaf pages of an index are not page compressed but can be row compressed.
  • Jeder nicht gruppierte Index verfügt über eine eigenen Komprimierungseinstellung und erbt die Komprimierungseinstellung nicht von der zugrunde liegenden Tabelle.Each nonclustered index has an individual compression setting, and does not inherit the compression setting of the underlying table.
  • Wenn ein gruppierter Index auf einem Heap erstellt wird, erbt der gruppierte Index den Komprimierungsstatus des Heaps, sofern kein anderer Komprimierungsstatus angegeben wird.When a clustered index is created on a heap, the clustered index inherits the compression state of the heap unless an alternative compression state is specified.

Für partitionierte Indizes gelten die folgenden Einschränkungen:The following restrictions apply to partitioned indexes:

  • Sie können die Komprimierungseinstellung einer einzelnen Partition nicht ändern, wenn die Tabelle nicht ausgerichtete Indizes aufweist.You cannot change the compression setting of a single partition if the table has nonaligned indexes.
  • Mit der ALTER INDEX <index> ... REBUILD PARTITION ...-Syntax wird die angegebene Partition des Indexes neu erstellt.The ALTER INDEX <index> ... REBUILD PARTITION ... syntax rebuilds the specified partition of the index.
  • Mit der ALTER INDEX <index> ... REBUILD WITH ...-Syntax werden alle Partitionen des Indexes neu erstellt.The ALTER INDEX <index> ... REBUILD WITH ... syntax rebuilds all partitions of the index.

Mit der gespeicherten Prozedur sp_estimate_data_compression_savings können Sie einschätzen, wie sich eine Änderung des Komprimierungsstatus auf eine Tabelle, einen Index oder eine Partition auswirkt.To evaluate how changing the compression state will affect a table, an index, or a partition, use the sp_estimate_data_compression_savings stored procedure.

BerechtigungenPermissions

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

EinschränkungenLimitations and Restrictions

In SQL Data WarehouseSQL Data Warehouse und Parallel Data WarehouseParallel Data Warehouse können Sie Folgendes nicht erstellen:In SQL Data WarehouseSQL Data Warehouse and Parallel Data WarehouseParallel Data Warehouse, you cannot create:

  • Einen gruppierten oder nicht gruppierten Rowstore-Index für eine Data Warehouse-Tabelle, wenn ein Columnstore-Index bereits vorhanden ist.A clustered or nonclustered rowstore index on a data warehouse table when a columnstore index already exists. Dieses Verhalten unterscheidet sich von SMP SQL ServerSQL Server, da dieser Dienst es zulässt, dass Rowstore- und Columnstore-Indizes beide in derselben vorhanden sind.This behavior is different from SMP SQL ServerSQL Server which allows both rowstore and columnstore indexes to co-exist on the same table.
  • Sie können keinen Index für eine Sicht erstellen.You cannot create an index on a view.

MetadatenMetadata

Informationen zu vorhandenen Indizes erhalten Sie, wenn Sie die sys.indexes-Katalogsicht abfragen.To view information on existing indexes, you can query the sys.indexes catalog view.

VersionshinweiseVersion Notes

SQL-DatenbankSQL Database unterstützt die Optionen „Dateigruppe“ und „Filestream“ nicht.does not support filegroup and filestream options.

Beispiele: Alle Versionen.Examples: All versions. Verwendet die AdventureWorks-Datenbank.Uses the AdventureWorks database

A.A. Erstellen eines einfachen nicht gruppierten Rowstore-IndexCreate a simple nonclustered rowstore index

Im folgenden Beispiel wird ein nicht gruppierter Index für die Spalte VendorID der Tabelle Purchasing.ProductVendor erstellt.The following examples create a nonclustered index on the VendorID column of the Purchasing.ProductVendor table.

CREATE INDEX IX_VendorID ON ProductVendor (VendorID);
CREATE INDEX IX_VendorID ON dbo.ProductVendor (VendorID DESC, Name ASC, Address DESC);
CREATE INDEX IX_VendorID ON Purchasing..ProductVendor (VendorID);

B.B. Erstellen eines einfachen nicht gruppierten zusammengesetzten Rowstore-IndexCreate a simple nonclustered rowstore composite index

Im folgenden Beispiel wird ein nicht gruppierter zusammengesetzter Index für die Spalten SalesQuota und SalesYTD der Tabelle Sales.SalesPerson erstellt.The following example creates a nonclustered composite index on the SalesQuota and SalesYTD columns of the Sales.SalesPerson table.

CREATE NONCLUSTERED INDEX IX_SalesPerson_SalesQuota_SalesYTD ON Sales.SalesPerson (SalesQuota, SalesYTD);

C.C. Erstellen eines Index für eine Tabelle in einer anderen DatenbankCreate an index on a table in another database

Im folgenden Beispiel wird ein gruppierter Index für die VendorID-Spalte der ProductVendor-Tabelle in der Purchasing-Datenbank erstellt.The following example creates a clustered index on the VendorID column of the ProductVendor table in the Purchasing database.

CREATE CLUSTERED INDEX IX_ProductVendor_VendorID ON Purchasing..ProductVendor (VendorID);

D.D. Hinzufügen einer Spalte zu einem IndexAdd a column to an index

Im folgenden Beispiel wird der Index X_FF mit zwei Spalten der dbo.FactFinance-Tabelle erstellt.The following example creates index IX_FF with two columns from the dbo.FactFinance table. Die nächste Anweisung erstellt den Index mit zwei weiteren Spalten neu und behält den bereits vorhandenen Namen bei.The next statement rebuilds the index with one more column and keeps the existing name.

CREATE INDEX IX_FF ON dbo.FactFinance (FinanceKey ASC, DateKey ASC);

-- Rebuild and add the OrganizationKey
CREATE INDEX IX_FF ON dbo.FactFinance (FinanceKey, DateKey, OrganizationKey DESC)
  WITH (DROP_EXISTING = ON);

Beispiele: SQL Server, Azure SQL-DatenbankExamples: SQL Server, Azure SQL Database

E.E. Erstellen eines eindeutigen nicht gruppierten IndexCreate a unique nonclustered index

Im folgenden Beispiel wird ein eindeutiger nicht gruppierter Index für die Name-Spalte der Production.UnitMeasure-Tabelle in der AdventureWorks2012AdventureWorks2012-Datenbank erstellt.The following example creates a unique nonclustered index on the Name column of the Production.UnitMeasure table in the AdventureWorks2012AdventureWorks2012 database. Der Index erzwingt Eindeutigkeit für die Daten, die in die Spalte Name eingefügt werden.The index will enforce uniqueness on the data inserted into the Name column.

CREATE UNIQUE INDEX AK_UnitMeasure_Name
  ON Production.UnitMeasure(Name);

In der folgenden Abfrage wird die Eindeutigkeitseinschränkung getestet, indem eine Zeile mit demselben Wert wie in einer vorhandenen Zeile eingefügt wird.The following query tests the uniqueness constraint by attempting to insert a row with the same value as that in an existing row.

-- Verify the existing value.
SELECT Name FROM Production.UnitMeasure WHERE Name = N'Ounces';
GO

INSERT INTO Production.UnitMeasure (UnitMeasureCode, Name, ModifiedDate)
  VALUES ('OC', 'Ounces', GETDATE());

Die folgende Fehlermeldung wird angezeigt:The resulting error message is:

Server: Msg 2601, Level 14, State 1, Line 1
Cannot insert duplicate key row in object 'UnitMeasure' with unique index 'AK_UnitMeasure_Name'. The statement has been terminated.

F.F. Verwenden der IGNORE_DUP_KEY-OptionUse the IGNORE_DUP_KEY option

Das folgende Beispiel veranschaulicht die Wirkung der Option IGNORE_DUP_KEY, indem mehrere Zeilen zunächst mit dem Optionswert ON und anschließend mit dem Optionswert OFF in eine temporäre Tabelle eingefügt werden.The following example demonstrates the effect of the IGNORE_DUP_KEY option by inserting multiple rows into a temporary table first with the option set to ON and again with the option set to OFF. Eine einzelne Zeile wird in die #Test-Tabelle eingefügt, die absichtlich einen doppelten Wert erzeugt, wenn die zweite mehrzeilige INSERT-Anweisung ausgeführt wird.A single row is inserted into the #Test table that will intentionally cause a duplicate value when the second multiple-row INSERT statement is executed. Eine Zählung der Zeilen in der Tabelle gibt die Anzahl der eingefügten Zeilen zurück.A count of rows in the table returns the number of rows inserted.

CREATE TABLE #Test (C1 NVARCHAR(10), C2 NVARCHAR(50), C3 DATETIME);
GO

CREATE UNIQUE INDEX AK_Index ON #Test (C2)
  WITH (IGNORE_DUP_KEY = ON);
GO

INSERT INTO #Test VALUES (N'OC', N'Ounces', GETDATE());
INSERT INTO #Test SELECT * FROM Production.UnitMeasure;
GO

SELECT COUNT(*) AS [Number of rows] FROM #Test;
GO

DROP TABLE #Test;
GO

Im Folgenden werden die Ergebnisse der zweiten INSERT-Anweisung aufgeführt.Here are the results of the second INSERT statement.

Server: Msg 3604, Level 16, State 1, Line 5 Duplicate key was ignored.

Number of rows
--------------
38

Beachten Sie, dass die aus der Tabelle Production.UnitMeasure eingefügten Zeilen, die die Eindeutigkeitseinschränkung nicht verletzten, erfolgreich eingefügt wurden.Notice that the rows inserted from the Production.UnitMeasure table that did not violate the uniqueness constraint were successfully inserted. Es wurde eine Warnung ausgegeben, und die doppelte Zeile wurde ignoriert, aber es wurde kein Rollback für die gesamte Transaktion ausgeführt.A warning was issued and the duplicate row ignored, but the entire transaction was not rolled back.

Dieselben Anweisungen werden erneut ausgeführt. Dabei ist die Option IGNORE_DUP_KEY allerdings auf OFF festgelegt.The same statements are executed again, but with IGNORE_DUP_KEY set to OFF.

CREATE TABLE #Test (C1 NVARCHAR(10), C2 NVARCHAR(50), C3 DATETIME);
GO

CREATE UNIQUE INDEX AK_Index ON #Test (C2)
  WITH (IGNORE_DUP_KEY = OFF);
GO

INSERT INTO #Test VALUES (N'OC', N'Ounces', GETDATE());
INSERT INTO #Test SELECT * FROM Production.UnitMeasure;
GO

SELECT COUNT(*) AS [Number of rows] FROM #Test;
GO

DROP TABLE #Test;
GO

Im Folgenden werden die Ergebnisse der zweiten INSERT-Anweisung aufgeführt.Here are the results of the second INSERT statement.

Server: Msg 2601, Level 14, State 1, Line 5
Cannot insert duplicate key row in object '#Test' with unique index
'AK_Index'. The statement has been terminated.

Number of rows
--------------
1

Beachten Sie, dass keine Zeilen aus der Production.UnitMeasure-Tabelle in die Tabelle eingefügt wurden, obwohl nur eine Zeile in der Tabelle die UNIQUE-Einschränkung für den Index verletzte.Notice that none of the rows from the Production.UnitMeasure table were inserted into the table even though only one row in the table violated the UNIQUE index constraint.

G.G. Verwenden von DROP_EXISTING zum Löschen und Neuerstellen eines IndexUsing DROP_EXISTING to drop and re-create an index

Im folgenden Beispiel wird ein vorhandener Index für die ProductID-Spalte der Production.WorkOrder-Tabelle in der AdventureWorks2012AdventureWorks2012-Datenbank mithilfe der DROP_EXISTING-Option gelöscht und neu erstellt.The following example drops and re-creates an existing index on the ProductID column of the Production.WorkOrder table in the AdventureWorks2012AdventureWorks2012 database by using the DROP_EXISTING option. Die Optionen FILLFACTOR und PAD_INDEX sind ebenfalls festgelegt.The options FILLFACTOR and PAD_INDEX are also set.

CREATE NONCLUSTERED INDEX IX_WorkOrder_ProductID
  ON Production.WorkOrder(ProductID)
    WITH (FILLFACTOR = 80,
      PAD_INDEX = ON,
      DROP_EXISTING = ON);
GO

H.H. Erstellen eines Index für eine SichtCreate an index on a view

Im folgenden Beispiel werden eine Sicht und ein Index für diese Sicht erstellt.The following example creates a view and an index on that view. Dies beinhaltet zwei Abfragen, in denen die indizierte Sicht verwendet wird.Two queries are included that use the indexed view.

-- Set the options to support indexed views
SET NUMERIC_ROUNDABORT OFF;
SET ANSI_PADDING, ANSI_WARNINGS, CONCAT_NULL_YIELDS_NULL, ARITHABORT,
  QUOTED_IDENTIFIER, ANSI_NULLS ON;
GO

-- Create view with schemabinding
IF OBJECT_ID ('Sales.vOrders', 'view') IS NOT NULL
  DROP VIEW Sales.vOrders;
GO

CREATE VIEW Sales.vOrders
  WITH SCHEMABINDING
AS
  SELECT SUM(UnitPrice * OrderQty * (1.00 - UnitPriceDiscount)) AS Revenue,
    OrderDate, ProductID, COUNT_BIG(*) AS COUNT
  FROM Sales.SalesOrderDetail AS od, Sales.SalesOrderHeader AS o
  WHERE od.SalesOrderID = o.SalesOrderID
  GROUP BY OrderDate, ProductID;
GO

-- Create an index on the view
CREATE UNIQUE CLUSTERED INDEX IDX_V1
  ON Sales.vOrders (OrderDate, ProductID);
GO

-- This query can use the indexed view even though the view is
-- not specified in the FROM clause.
SELECT SUM(UnitPrice * OrderQty * (1.00 - UnitPriceDiscount)) AS Rev,
  OrderDate, ProductID
FROM Sales.SalesOrderDetail AS od
  JOIN Sales.SalesOrderHeader AS o ON od.SalesOrderID = o.SalesOrderID
    AND ProductID BETWEEN 700 AND 800
    AND OrderDate >= CONVERT(DATETIME, '05/01/2002', 101)
GROUP BY OrderDate, ProductID
ORDER BY Rev DESC;
GO

-- This query can use the above indexed view
SELECT OrderDate, SUM(UnitPrice * OrderQty * (1.00 - UnitPriceDiscount)) AS Rev
FROM Sales.SalesOrderDetail AS od
  JOIN Sales.SalesOrderHeader AS o ON od.SalesOrderID = o.SalesOrderID
    AND DATEPART(mm, OrderDate) = 3
  AND DATEPART(yy, OrderDate) = 2002
GROUP BY OrderDate
ORDER BY OrderDate ASC;
GO

I.I. Erstellen eines Index mit eingeschlossenen (Nichtschlüssel-)SpaltenCreate an index with included (non-key) columns

Im folgenden Beispiel wird ein nicht gruppierter Index mit einer Schlüsselspalte (PostalCode) und vier Nichtschlüsselspalten (AddressLine1, AddressLine2, City, StateProvinceID) erstellt.The following example creates a nonclustered index with one key column (PostalCode) and four non-key columns (AddressLine1, AddressLine2, City, StateProvinceID). Es folgt eine Abfrage, die vom Index abgedeckt wird.A query that is covered by the index follows. Wenn Sie den vom Abfrageoptimierer ausgewählten Index anzeigen möchten, wählen Sie in SQL Server Management StudioSQL Server Management Studio im Menü Abfrage die Option Display Actual Execution Plan (Tatsächlichen Ausführungsplan einschließen) aus.To display the index that is selected by the query optimizer, on the Query menu in SQL Server Management StudioSQL Server Management Studio, select Display Actual Execution Plan before executing the query.

CREATE NONCLUSTERED INDEX IX_Address_PostalCode
  ON Person.Address (PostalCode)
  INCLUDE (AddressLine1, AddressLine2, City, StateProvinceID);
GO

SELECT AddressLine1, AddressLine2, City, StateProvinceID, PostalCode
FROM Person.Address
WHERE PostalCode BETWEEN N'98000' and N'99999';
GO

J.J. Erstellen eines partitionierten IndexCreate a partitioned index

Im folgenden Beispiel wird ein nicht gruppierter partitionierter Index für TransactionsPS1 (ein vorhandenes Partitionsschema in der AdventureWorks2012AdventureWorks2012-Datenbank) erstellt.The following example creates a nonclustered partitioned index on TransactionsPS1, an existing partition scheme in the AdventureWorks2012AdventureWorks2012 database. Dieses Beispiel setzt voraus, dass das Beispiel für einen partitionierten Index installiert wurde.This example assumes the partitioned index sample has been installed.

Gilt für: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 bis SQL Server 2019SQL Server 2019) und Azure SQL-DatenbankAzure SQL DatabaseApplies to: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 through SQL Server 2019SQL Server 2019) and Azure SQL-DatenbankAzure SQL Database

CREATE NONCLUSTERED INDEX IX_TransactionHistory_ReferenceOrderID
  ON Production.TransactionHistory (ReferenceOrderID)
  ON TransactionsPS1 (TransactionDate);
GO

K.K. Erstellen eines gefilterten IndexCreating a filtered index

Im folgenden Beispiel wird ein gefilterter Index für die Production.BillOfMaterialsAdventureWorks2012AdventureWorks2012-Tabelle in der -Datenbank erstellt.The following example creates a filtered index on the Production.BillOfMaterials table in the AdventureWorks2012AdventureWorks2012 database. Das Filterprädikat kann Spalten einschließen, die keine Schlüsselspalten im gefilterten Index sind.The filter predicate can include columns that are not key columns in the filtered index. Das Prädikat in diesem Beispiel wählt nur die Zeilen aus, in denen EndDate nicht NULL ist.The predicate in this example selects only the rows where EndDate is non-NULL.

CREATE NONCLUSTERED INDEX "FIBillOfMaterialsWithEndDate"
  ON Production.BillOfMaterials (ComponentID, StartDate)
  WHERE EndDate IS NOT NULL;

L.L. Erstellen eines komprimierten IndexCreate a compressed index

Im folgenden Beispiel wird ein Index für eine nicht partitionierte Tabelle unter Verwendung der Zeilenkomprimierung erstellt.The following example creates an index on a nonpartitioned table by using row compression.

CREATE NONCLUSTERED INDEX IX_INDEX_1
  ON T1 (C2)
  WITH (DATA_COMPRESSION = ROW);
GO

Im folgenden Beispiel wird ein Index für eine partitionierte Tabelle unter Verwendung der Zeilenkomprimierung für alle Partitionen des Indexes erstellt.The following example creates an index on a partitioned table by using row compression on all partitions of the index.

CREATE CLUSTERED INDEX IX_PartTab2Col1
  ON PartitionTable1 (Col1)
  WITH (DATA_COMPRESSION = ROW);
GO

Im folgenden Beispiel wird ein Index für eine partitionierte Tabelle erstellt, wobei die Seitenkomprimierung für Partition 1 des Indexes und die Zeilenkomprimierung für die Partitionen 2 bis 4 des Indexes verwendet wird.The following example creates an index on a partitioned table by using page compression on partition 1 of the index and row compression on partitions 2 through 4 of the index.

CREATE CLUSTERED INDEX IX_PartTab2Col1
  ON PartitionTable1 (Col1)
  WITH (
    DATA_COMPRESSION = PAGE ON PARTITIONS(1),
    DATA_COMPRESSION = ROW ON PARTITIONS (2 TO 4)
  );
GO

M.M. Erstellen, Fortsetzen, Anhalten und Abbrechen von Vorgängen fortsetzbarer IndizesCreate, resume, pause, and abort resumable index operations

Gilt für: SQL ServerSQL Server (ab SQL Server 2019 (15.x)SQL Server 2019 (15.x)) und Azure SQL-DatenbankAzure SQL Database (Vorschauversion)Applies to: SQL ServerSQL Server (Starting with SQL Server 2019 (15.x)SQL Server 2019 (15.x)) and Azure SQL-DatenbankAzure SQL Database (public preview)

-- Execute a resumable online index create statement with MAXDOP=1
CREATE INDEX test_idx1 ON test_table (col1) WITH (ONLINE = ON, MAXDOP = 1, RESUMABLE = ON);

-- Executing the same command again (see above) after an index operation was paused, resumes automatically the index create operation.

-- Execute a resumable online index creates operation with MAX_DURATION set to 240 minutes. After the time expires, the resumable index create operation is paused.
CREATE INDEX test_idx2 ON test_table (col2) WITH (ONLINE = ON, RESUMABLE = ON, MAX_DURATION = 240);

-- Pause a running resumable online index creation
ALTER INDEX test_idx1 ON test_table PAUSE;
ALTER INDEX test_idx2 ON test_table PAUSE;

-- Resume a paused online index creation
ALTER INDEX test_idx1 ON test_table RESUME;
ALTER INDEX test_idx2 ON test_table RESUME;

-- Abort resumable index create operation which is running or paused
ALTER INDEX test_idx1 ON test_table ABORT;
ALTER INDEX test_idx2 ON test_table ABORT;

Beispiele: Azure Synapse Analytics (SQL Data Warehouse)Azure Synapse Analytics (SQL DW) und Parallel Data WarehouseParallel Data Warehouse.Examples: Azure Synapse Analytics (SQL Data Warehouse)Azure Synapse Analytics (SQL DW) and Parallel Data WarehouseParallel Data Warehouse

N.N. Grundlegende SyntaxBasic syntax

Erstellen, Fortsetzen, Anhalten und Abbrechen von Vorgängen fortsetzbarer IndizesCreate, resume, pause, and abort resumable index operations

Gilt für: SQL ServerSQL Server (ab SQL Server 2019 (15.x)SQL Server 2019 (15.x)) und Azure SQL-DatenbankAzure SQL Database (Vorschauversion)Applies to: SQL ServerSQL Server (Starting with SQL Server 2019 (15.x)SQL Server 2019 (15.x)) and Azure SQL-DatenbankAzure SQL Database (public preview)

-- Execute a resumable online index create statement with MAXDOP=1
CREATE INDEX test_idx ON test_table WITH (ONLINE = ON, MAXDOP = 1, RESUMABLE = ON);

-- Executing the same command again (see above) after an index operation was paused, resumes automatically the index create operation.

-- Execute a resumable online index creates operation with MAX_DURATION set to 240 minutes. After the time expires, the resumable index create operation is paused.
CREATE INDEX test_idx ON test_table WITH (ONLINE = ON, RESUMABLE = ON, MAX_DURATION = 240);

-- Pause a running resumable online index creation
ALTER INDEX test_idx ON test_table PAUSE;

-- Resume a paused online index creation
ALTER INDEX test_idx ON test_table RESUME;

-- Abort resumable index create operation which is running or paused
ALTER INDEX test_idx ON test_table ABORT;

O.O. Erstellen eines nicht gruppierten Index für eine Tabelle in der aktuellen DatenbankCreate a nonclustered index on a table in the current database

Im folgenden Beispiel wird ein nicht gruppierter Index für die Spalte VendorID der Tabelle ProductVendor erstellt.The following example creates a nonclustered index on the VendorID column of the ProductVendor table.

CREATE INDEX IX_ProductVendor_VendorID
  ON ProductVendor (VendorID);

P.P. Erstellen eines nicht gruppierten Index für eine Tabelle in einer anderen DatenbankCreate a clustered index on a table in another database

Im folgenden Beispiel wird ein nicht gruppierter Index für die VendorID-Spalte der ProductVendor-Tabelle in der Purchasing-Datenbank erstellt.The following example creates a nonclustered index on the VendorID column of the ProductVendor table in the Purchasing database.

CREATE CLUSTERED INDEX IX_ProductVendor_VendorID
  ON Purchasing..ProductVendor (VendorID);

Q.Q. Erstellen eines geordneten gruppierten Index für eine TabelleCreate an ordered clustered index on a table

Im folgenden Beispiel wird ein geordneter gruppierter Index für die c1-Spalte und die c2-Spalte der T1-Tabelle in der MyDB-Datenbank erstellt.The following example creates an ordered clustered index on the c1 and c2 columns of the T1 table in the MyDB database.

CREATE CLUSTERED COLUMNSTORE INDEX MyOrderedCCI ON MyDB.dbo.T1 
ORDER (c1, c2);

R.R. Umwandeln eines gruppierten Columnstore-Index in einen geordneten gruppierten Index für eine TabelleConvert a CCI to an ordered clustered index on a table

Im folgenden Beispiel wird der vorhandene gruppierte Columnstore-Index in einen geordneten gruppierten Columnstore-Index mit dem Namen MyOrderedCCI für die Spalten c1 und c2 der Tabelle T2 in der Datenbank MyDB umgewandelt.The following example convert the existing clustered columnstore index to an ordered clustered columnstore index called MyOrderedCCI on the c1 and c2 columns of the T2 table in the MyDB database.

CREATE CLUSTERED COLUMNSTORE INDEX MyOrderedCCI ON MyDB.dbo.T2
ORDER (c1, c2)
WITH (DROP_EXISTING = ON);

Weitere InformationenSee Also

Leitfaden zur Architektur und zum Design von SQL Server-Indizes SQL Server Index Architecture and Design Guide
Ausführen von OnlineindexvorgängenPerform Index Operations Online
Indizes und ALTER TABLE Indexes and ALTER TABLE
ALTER INDEX ALTER INDEX
CREATE PARTITION FUNCTION CREATE PARTITION FUNCTION
CREATE PARTITION SCHEME CREATE PARTITION SCHEME
CREATE SPATIAL INDEX CREATE SPATIAL INDEX
CREATE STATISTICS CREATE STATISTICS
CREATE TABLE CREATE TABLE
CREATE XML INDEX CREATE XML INDEX
Datentypen Data Types
DBCC SHOW_STATISTICS DBCC SHOW_STATISTICS
DROP INDEX DROP INDEX
XML-Indizes (SQL Server) XML Indexes (SQL Server)
sys.indexes sys.indexes
sys.index_columns sys.index_columns
sys.xml_indexes sys.xml_indexes
EVENTDATAEVENTDATA