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

GILT FÜR: jaSQL Server (ab 2012) jaAzure SQL-DatenbankjaAzure SQL Data Warehouse jaParallel Data WarehouseAPPLIES TO: yesSQL Server (starting with 2012) yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

Konvertiert eine Rowstore-Tabelle in einen gruppierten Columnstore-Index oder erstellt einen nicht gruppierten Columnstore-Index.Convert a rowstore table to a clustered columnstore index or create a nonclustered columnstore index. Verwendet einen Columnstore-Index, um eine operative Echtzeitanalyse für eine OLTP-Arbeitslast effizient auszuführen oder um die Datenkomprimierung und Abfrageleistung für Data Warehouse-Arbeitslasten zu verbessern.Use a columnstore index to efficiently run real-time operational analytics on an OLTP workload or to improve data compression and query performance for data warehousing workloads.

Hinweis

Ab SQL Server 2016 (13.x)SQL Server 2016 (13.x) können Sie die Tabelle als gruppierten Columnstore-Index erstellen.Starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x), you can create the table as a clustered columnstore index. Es ist nun nicht mehr erforderlich, zuerst eine Rowstore-Tabelle zu erstellen und diese dann in einen gruppierten Columnstore-Index zu konvertieren.It is no longer necessary to first create a rowstore table and then convert it to a clustered columnstore index.

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.

Zu den Beispielen wechseln:Skip to examples:

Zu den Szenarios wechseln:Go to scenarios:

Weitere Informationen:Learn more:

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

SyntaxSyntax

-- Syntax for SQL Server and Azure SQL Database  
  
-- Create a clustered columnstore index on disk-based table.  
CREATE CLUSTERED COLUMNSTORE INDEX index_name  
    ON [database_name. [schema_name ] . | schema_name . ] table_name  
    [ WITH ( < with_option> [ ,...n ] ) ]  
    [ ON <on_option> ]  
[ ; ]  
  
--Create a non-clustered columnstore index on a disk-based table.  
CREATE [NONCLUSTERED]  COLUMNSTORE INDEX index_name   
    ON [database_name. [schema_name ] . | schema_name . ] table_name   
        ( column  [ ,...n ] )  
    [ WHERE <filter_expression> [ AND <filter_expression> ] ]
    [ WITH ( < with_option> [ ,...n ] ) ]  
    [ ON <on_option> ]   
[ ; ]  
  
<with_option> ::=  
      DROP_EXISTING = { ON | OFF } -- default is OFF  
    | MAXDOP = max_degree_of_parallelism 
    | ONLINE = { ON | OFF } 
    | COMPRESSION_DELAY  = { 0 | delay [ Minutes ] }  
    | DATA_COMPRESSION = { COLUMNSTORE | COLUMNSTORE_ARCHIVE }  
      [ ON PARTITIONS ( { partition_number_expression | range } [ ,...n ] ) ]  
  
<on_option>::=  
      partition_scheme_name ( column_name )   
    | filegroup_name   
    | "default"   
  
<filter_expression> ::=  
      column_name IN ( constant [ ,...n ]  
    | column_name { IS | IS NOT | = | <> | != | > | >= | !> | < | <= | !< } constant  
  
-- Syntax for Azure SQL Data Warehouse and Parallel Data Warehouse  
  
CREATE CLUSTERED COLUMNSTORE INDEX index_name   
    ON [ database_name . [ schema_name ] . | schema_name . ] table_name  
    [ WITH ( DROP_EXISTING = { ON | OFF } ) ] --default is OFF  
[;]  

ArgumenteArguments

Einige Optionen sind nicht in allen Datenbank-Engine-Versionen verfügbar.Some of the options are not available in all database engine versions. Die folgende Tabelle enthält die Versionen, in denen die Optionen in GRUPPIERTEN COLUMNSTORE- und NICHT GRUPPIERTEN COLUMNSTORE-INDIZES eingeführt wurden:The following table shows the versions when the options are introduced in CLUSTERED COLUMNSTORE and NONCLUSTERED COLUMNSTORE indexes:

OptionOption CLUSTEREDCLUSTERED NONCLUSTEREDNONCLUSTERED
COMPRESSION_DELAYCOMPRESSION_DELAY SQL Server 2016 (13.x)SQL Server 2016 (13.x) SQL Server 2016 (13.x)SQL Server 2016 (13.x)
DATA_COMPRESSIONDATA_COMPRESSION SQL Server 2016 (13.x)SQL Server 2016 (13.x) SQL Server 2016 (13.x)SQL Server 2016 (13.x)
ONLINEONLINE SQL Server-2019 (Vorschau)SQL Server 2019 preview SQL Server 2017 (14.x)SQL Server 2017 (14.x)
WHERE-KlauselWHERE clause N/A SQL Server 2016 (13.x)SQL Server 2016 (13.x)

Alle Optionen sind in Azure SQL-Datenbank verfügbar.All options are available in Azure SQL Database.

CREATE CLUSTERED COLUMNSTORE INDEXCREATE CLUSTERED COLUMNSTORE INDEX

Erstellt einen gruppierten Columnstore-Index, in dem alle Daten komprimiert und nach Spalten gespeichert werden.Create a clustered columnstore index in which all of the data is compressed and stored by column. Der Index beinhaltet alle Spalten der Tabelle und speichert die gesamte Tabelle.The index includes all of the columns in the table, and stores the entire table. Wenn die vorhandene Tabelle ein Heap oder ein gruppierter Index ist, wird die Tabelle in einen gruppierten Columnstore-Index konvertiert.If the existing table is a heap or clustered index, the table is converted to a clustered columnstore index. Wenn die Tabelle bereits als gruppierter Columnstore-Index gespeichert ist, wird der vorhandene Index gelöscht und neu erstellt.If the table is already stored as a clustered columnstore index, the existing index is dropped and rebuilt.

index_nameindex_name
Gibt den Namen für den neuen Index an.Specifies the name for the new index.

Wenn die Tabelle bereits einen gruppierten Columnstore-Index enthält, können Sie denselben Namen wie für den vorhandenen Index angeben oder die DROP EXISTING-Option zum Angeben eines neuen Namens verwenden.If the table already has a clustered columnstore index, you can specify the same name as the existing index, or you can use the DROP EXISTING option to specify a new name.

ON [database_name.ON [database_name. [schema_name ] .[schema_name ] . | *schema_name* . | *schema_name* . ] table_name] table_name
Gibt den ein-, zwei- oder dreiteiligen Namen der Tabelle an, die als gruppierter Columnstore-Index gespeichert werden soll.Specifies the one-, two-, or three-part name of the table to be stored as a clustered columnstore index. Wenn die Tabelle ein Heap oder ein gruppierter Index ist, wird die Tabelle von einem Rowstore in einen Columnstore konvertiert.If the table is a heap or clustered index the table is converted from rowstore to a columnstore. Wenn die Tabelle bereits ein Columnstore ist, wird mit dieser Anweisung der gruppierte Columnstore-Index neu erstellt.If the table is already a columnstore, this statement rebuilds the clustered columnstore index.

WITH-OptionenWITH options

DROP_EXISTING = [OFF] | ONDROP_EXISTING = [OFF] | ON

DROP_EXISTING = ON gibt an, dass der vorhandene Index gelöscht und ein neuer Columnstore-Index erstellt werden soll.DROP_EXISTING = ON specifies to drop the existing index, and create a new columnstore index.

CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
       WITH (DROP_EXISTING = ON);

Bei Verwendung der Standardeinstellung DROP_EXISTING = OFF wird erwartet, dass der Indexname mit dem vorhandenen Namen übereinstimmt.The default, DROP_EXISTING = OFF expects the index name is the same as the existing name. Wenn der angegebene Indexname bereits vorhanden ist, tritt ein Fehler auf.An error occurs is the specified index name already exists.

MAXDOP = max_degree_of_parallelismMAXDOP = max_degree_of_parallelism

Überschreibt die Serverkonfiguration für den maximalen Grad an Parallelität für die Dauer des Indexvorgangs.Overrides the existing maximum degree of parallelism server configuration for the duration of the index operation. 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 values can be:

  • 1 - Unterdrückt die Generierung paralleler Pläne.1 - Suppress parallel plan generation.
  • >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.>1 - Restrict the maximum number of processors used in a parallel index operation to the specified number or fewer based on the current system workload. Beispiel: Wenn MAXDOP = 4, beträgt die Anzahl der verwendeten Prozessoren 4 oder weniger.For example, when MAXDOP = 4, the number of processors used is 4 or less.
  • 0 (Standard) - Verwendet abhängig von der aktuellen Systemarbeitsauslastung die tatsächliche Anzahl von Prozessoren oder weniger Prozessoren.0 (default) - Use the actual number of processors or fewer based on the current system workload.
CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
       WITH (MAXDOP = 2);

Weitere Informationen finden Sie unter Konfigurieren der Serverkonfigurationsoption Max. Grad an Parallelität und Konfigurieren von Parallelindexvorgängen.For more information, see Configure the max degree of parallelism Server Configuration Option, and Configure Parallel Index Operations.

COMPRESSION_DELAY = 0 | delay [ Minuten ]COMPRESSION_DELAY = 0 | delay [ Minutes ]

Bei einer datenträgerbasierten Tabelle gibt delay die minimale Anzahl von Minuten an, die eine Delta-Zeilengruppe im Zustand CLOSED in der Delta-Zeilengruppe verbringen muss, bevor SQL Server sie in die komprimierte Zeilengruppe komprimieren kann.For a disk-based table, delay specifies the minimum number of minutes a delta rowgroup in the CLOSED state must remain in the delta rowgroup before SQL Server can compress it into the compressed rowgroup. Da Einfügungs- und Aktualisierungszeiten in datenträgerbasierten Tabellen nicht für einzelne Zeilen nachverfolgt werden, wird in SQL Server die Verzögerung auf Delta-Zeilengruppen im Zustand CLOSED angewendet.Since disk-based tables don't track insert and update times on individual rows, SQL Server applies the delay to delta rowgroups in the CLOSED state.
Die Standardeinstellung beträgt 0 Minuten.The default is 0 minutes.

CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
       WITH ( COMPRESSION_DELAY = 10 Minutes );

Empfehlungen zur Verwendung von COMPRESSION_DELAY finden Sie unter Erste Schritte mit Columnstore für operative Echtzeitanalyse.For recommendations on when to use COMPRESSION_DELAY, see Get started with Columnstore for real time operational analytics.

DATA_COMPRESSION = COLUMNSTORE | COLUMNSTORE_ARCHIVEDATA_COMPRESSION = COLUMNSTORE | COLUMNSTORE_ARCHIVE

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

  • COLUMNSTORE ist die Standardeinstellung und gibt an, dass die Komprimierung mit der leistungsstärksten Columnstore-Komprimierung ausgeführt werden soll.COLUMNSTORE is the default and specifies to compress with the most performant columnstore compression. Dies ist die gängige Methode.This is the typical choice.
  • Durch COLUMNSTORE_ARCHIVE wird die Tabelle oder Partition weiter in eine geringere Größe komprimiert.COLUMNSTORE_ARCHIVE further compresses the table or partition to a smaller size. Verwenden Sie diese Option für Situationen wie etwa die Archivierung, bei denen es auf eine geringere Datenspeichergröße und nicht auf den zusätzlichen Zeitaufwand für das Speichern und Abrufen ankommt.Use this option for situations such as archival that require a smaller storage size and can afford more time for storage and retrieval.
CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
       WITH ( DATA_COMPRESSION = COLUMNSTORE_ARCHIVE );

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

ONLINE = [ON | OFF]ONLINE = [ON | OFF]
  • ON gibt an, dass der Columnstore-Index online und verfügbar bleibt, während die neue Kopie des Indexes erstellt wird.ON specifies that the columnstore index remains online and available while the new copy of the index is being built.
  • OFF gibt an, dass der Index nicht verwendet werden kann, während die neue Kopie erstellt wird.OFF specifies that the index is not available for use while the new copy is being built.
CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
       WITH ( ONLINE = ON );

ON-OptionenON options

Mit den ON-Optionen können Sie Optionen für die Datenspeicherung, wie ein Partitionsschema, eine bestimmte Dateigruppe oder die Standarddateigruppe, angeben.With the ON options you can specify options for data storage, such as a partition scheme, a specific filegroup, or the default filegroup. Wenn die ON-Option nicht angegeben ist, verwendet der Index die Einstellungspartition oder Dateigruppeneinstellungen der vorhandenen Tabelle.If the ON option is not specified, the index uses the settings partition or filegroup settings of the existing table.

partition_scheme_name ( column_name )partition_scheme_name ( column_name )
Gibt das Partitionsschema für die Tabelle an.Specifies the partition scheme for the table. Das Partitionsschema muss in der Datenbank bereits vorhanden sein.The partition scheme must already exist in the database. Informationen zum Erstellen des Partitionsschemas finden Sie unter CREATE PARTITION SCHEME.To create the partition scheme, see CREATE 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 is partitioned. Diese Spalte muss mit dem Datentyp, der Länge und der Genauigkeit des Arguments der Partitionierungsfunktion ü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.

filegroup_namefilegroup_name
Gibt die Dateigruppe zum Speichern des gruppierten Columnstore-Indexes an.Specifies the filegroup for storing the clustered columnstore index. Wenn kein Speicherort angegeben und die Tabelle nicht partitioniert ist, verwendet der Index die gleiche Dateigruppe wie die zugrunde liegende Tabelle oder Sicht.If no location is specified and the table 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.

" default "" default "
Um den Index in der Standarddateigruppe zu erstellen, verwenden Sie "default" oder [ default ].To create the index on the default filegroup, use "default" or [ 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. QUOTED_IDENTIFIER hat standardmäßig den Wert ON.QUOTED_IDENTIFIER is ON by default. Weitere Informationen finden Sie unter SET QUOTED_IDENTIFIER (Transact-SQL).For more information, see SET QUOTED_IDENTIFIER (Transact-SQL).

CREATE [NONCLUSTERED] COLUMNSTORE INDEXCREATE [NONCLUSTERED] COLUMNSTORE INDEX

Erstellt einen nicht gruppierten In-Memory-Columnstore-Index in einer als Heap oder gruppierter Index gespeicherten Rowstore-Tabelle.Create an in-memory nonclustered columnstore index on a rowstore table stored as a heap or clustered index. Der Index kann gefiltert sein und muss nicht alle Spalten der zugrunde liegenden Tabelle enthalten.The index can have a filtered condition and does not need to include all of the columns of the underlying table. Der Columnstore-Index benötigt genügend Platz zum Speichern einer Kopie der Daten.The columnstore index requires enough space to store a copy of the data. Er kann aktualisiert werden und wird bei einer Änderung der zugrunde liegenden Tabelle aktualisiert.It is updateable and is updated as the underlying table is changed. Der nicht gruppierte Columnstore-Index in einem gruppierten Index ermöglicht eine Echtzeitanalyse.The nonclustered columnstore index on a clustered index enables real-time analytics.

index_nameindex_name
Gibt den Namen des Indexes an.Specifies the name of the index. index_name muss innerhalb der Tabelle eindeutig sein, kann aber innerhalb der Datenbank mehrfach vorkommen.index_name must be unique within the table, but does not have to be unique within the database. Indexnamen müssen den Regeln für Bezeichner entsprechen.Index names must follow the rules of identifiers.

( column [ ,...n ] )( column [ ,...n ] )
Gibt die zu speichernden Spalten an.Specifies the columns to store. Ein nicht gruppierter Columnstore-Index ist auf 1024 Spalten beschränkt.A nonclustered columnstore index is limited to 1024 columns.
Jede Spalte muss ein unterstützter Datentyp für columnstore-Indizes sein.Each column must be of a supported data type for columnstore indexes. Eine Liste der unterstützten Datentypen finden Sie unter Einschränkungen.See Limitations and Restrictions for a list of the supported data types.

ON [database_name.ON [database_name. [schema_name ] .[schema_name ] . | *schema_name* . | *schema_name* . ] table_name] table_name
Gibt den ein-, zwei- oder dreiteiligen Name der Tabelle an, die den Index enthält.Specifies the one-, two-, or three-part name of the table that contains the index.

WITH-OptionenWITH options

DROP_EXISTING = [OFF] | ONDROP_EXISTING = [OFF] | ON

DROP_EXISTING = ON Der vorhandene Index wird gelöscht und neu erstellt.DROP_EXISTING = ON The existing index is dropped and rebuilt. Der angegebene Indexname muss mit dem Namen eines derzeit vorhandenen Index übereinstimmen. Die Indexdefinition kann jedoch geändert werden.The index name specified must be the same as a currently existing index; however, the index definition can be modified. Sie können z. B. andere Spalten oder Indexoptionen angeben.For example, you can specify different columns, or index options.

DROP_EXISTING = OFF Es wird ein Fehler angezeigt, wenn der angegebene Indexname bereits vorhanden ist.DROP_EXISTING = OFF An error is displayed if the specified index name already exists. Der Indextyp kann nicht mithilfe von DROP_EXISTING geändert werden.The index type cannot be changed by using DROP_EXISTING. 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.

MAXDOP = max_degree_of_parallelismMAXDOP = max_degree_of_parallelism

Überschreibt die Konfigurationsoption Max. Grad an Parallelität für die Dauer des Indexvorgangs.Overrides the Configure the max degree of parallelism Server Configuration Option configuration option for the duration of the index operation. 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 values can be:

  • 1 - Unterdrückt die Generierung paralleler Pläne.1 - Suppress parallel plan generation.
  • >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.>1 - Restrict the maximum number of processors used in a parallel index operation to the specified number or fewer based on the current system workload. Beispiel: Wenn MAXDOP = 4, beträgt die Anzahl der verwendeten Prozessoren 4 oder weniger.For example, when MAXDOP = 4, the number of processors used is 4 or less.
  • 0 (Standard) - Verwendet abhängig von der aktuellen Systemarbeitsauslastung die tatsächliche Anzahl von Prozessoren oder weniger Prozessoren.0 (default) - Use 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 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.

ONLINE = [ON | OFF]ONLINE = [ON | OFF]
  • ON gibt an, dass der Columnstore-Index online und verfügbar bleibt, während die neue Kopie des Indexes erstellt wird.ON specifies that the columnstore index remains online and available while the new copy of the index is being built.
  • OFF gibt an, dass der Index nicht verwendet werden kann, während die neue Kopie erstellt wird.OFF specifies that the index is not available for use while the new copy is being built. In einem nicht gruppierten Index bleibt die Basistabelle verfügbar, nur der nicht gruppierte Columnstore-Index wird erst für Abfragen verwendet, wenn der neue Index erstellt ist.In nonclustered index, the base table remains available, only the nonclustered columnstore index is not used to satisfy queries until the new index is complete.
CREATE COLUMNSTORE INDEX ncci ON Sales.OrderLines (StockItemID, Quantity, UnitPrice, TaxRate) WITH ( ONLINE = ON );
COMPRESSION_DELAY = 0 | <delay>[Minuten]COMPRESSION_DELAY = 0 | <delay>[Minutes]

Gibt eine Untergrenze für die Zeitdauer an, für die eine Zeile in der Deltazeilengruppe bleibt, bevor sie in die komprimierte Zeilengruppe migriert werden kann.Specifies a lower bound on how long a row should stay in delta rowgroup before it is eligible for migration to compressed rowgroup. Ein Kunde kann beispielsweise angeben, dass eine Zeile für die Komprimierung in das Spaltenspeicherformat freigegeben werden soll, wenn an ihr 120 Minuten lang keine Änderungen vorgenommen wurden.For example, a customer can say that if a row is unchanged for 120 minutes, make it eligible for compressing into columnar storage format. Bei Columnstore-Indizes in datenträgerbasierten Tabellen wird die Zeit nicht nachverfolgt, wenn eine Zeile eingefügt oder aktualisiert wird. Vielmehr wird die Zeit, in der die Deltazeilengruppe geschlossen war, als Proxy für die Zeile verwendet.For columnstore index on disk-based tables, we don't track the time when a row was inserted or updated, we use the delta rowgroup closed time as a proxy for the row instead. Die Standardeinstellung beträgt 0 Minuten.The default duration is 0 minutes. Eine Zeile wird in einen Speicher im Spaltenformat migriert, nachdem sich 1 Million Zeilen in der Deltazeilengruppe angesammelt haben und die Zeile als geschlossen gekennzeichnet wurde.A row is migrated to columnar storage once 1 million rows have been accumulated in delta rowgroup and it has been marked closed.

DATA_COMPRESSIONDATA_COMPRESSION

Gibt die Datenkomprimierungsoption für die angegebene Tabelle, die Partitionsnummer oder den Bereich von Partitionen an.Specifies the data compression option for the specified table, partition number, or range of partitions. Gilt nur für columnstore-Indizes, einschließlich nicht gruppierter und gruppierter columnstore-Indizes.Applies only to columnstore indexes, including both nonclustered columnstore and clustered columnstore indexes. Folgende Optionen stehen zur Verfügung:The options are as follows:

  • COLUMNSTORE: Dies ist die Standardeinstellung und gibt an, dass die Komprimierung mit der leistungsstärksten Columnstore-Komprimierung ausgeführt werden soll.COLUMNSTORE - the default and specifies to compress with the most performant columnstore compression. Dies ist die gängige Methode.This is the typical choice.
  • COLUMNSTORE_ARCHIVE: Durch COLUMNSTORE_ARCHIVE wird die Tabelle oder Partition weiter in eine geringere Größe komprimiert.COLUMNSTORE_ARCHIVE - COLUMNSTORE_ARCHIVE further compresses the table or partition to a smaller size. Dies empfiehlt sich bei der Archivierung und in Situationen, in denen es auf eine geringere Speichergröße und nicht auf den zusätzlichen Zeitaufwand für das Speichern und Abrufen ankommt.This can be used for archival, or for other situations that require a smaller storage size and can afford more time for storage and retrieval.

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

WHERE <filter_expression> [ AND <filter_expression> ]WHERE <filter_expression> [ AND <filter_expression> ]

Gibt nach dem Aufruf eines Filterprädikats an, welche Zeilen in den Index aufgenommen werden sollen.Called a filter predicate, this specifies which rows to include in the index. SQL ServerSQL Server erstellt gefilterte Statistikdaten für die Datenzeilen im gefilterten Index.creates filtered statistics on the data rows in the filtered index.

Für das Filterprädikat wird eine einfache Vergleichslogik verwendet.The filter predicate uses simple comparison logic. 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

Informationen zu gefilterten Indizes finden Sie unter Erstellen gefilterter Indizes.For guidance on filtered indexes, see Create Filtered Indexes.

ON-OptionenON options

Diese Optionen geben die Dateigruppen an, für die der Index erstellt wird.These options specify the filegroups on which the index is created.

partition_scheme_name ( column_name )partition_scheme_name ( column_name )
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 is mapped. Das Partitionsschema muss bereits durch Ausführen von CREATE PARTITION SCHEME in der Datenbank vorhanden sein.The partition scheme must exist within the database by executing CREATE 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 is partitioned. Diese Spalte muss mit dem Datentyp, der Länge und der Genauigkeit des Arguments der Partitionierungsfunktion ü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. Wenn Sie einen columnstore-Index partitionieren, fügt Datenbank-EngineDatabase Engine die Partitionierungsspalte als Spalte des Index hinzu, wenn sie noch nicht angegeben ist.When partitioning a columnstore index, Datenbank-EngineDatabase Engine adds the partitioning column as a 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.
Ein columnstore-Index einer partitionierten Tabelle muss über eine Partitionsausrichtung verfügen.A columnstore index on a partitioned table must be partition aligned.
Weitere Informationen zu partitionierten Indizes finden Sie unter Partitioned Tables and Indexes.For more information about partitioning indexes, see Partitioned Tables and Indexes.

filegroup_namefilegroup_name
Gibt den Namen einer Dateigruppe an, für die der Index erstellt werden soll.Specifies a filegroup name on which to create the index. Wenn filegroup_name nicht angegeben und die Tabelle nicht partitioniert ist, verwendet der Index die gleiche Dateigruppe wie die zugrunde liegende Tabelle.If filegroup_name is not specified and the table is not partitioned, the index uses the same filegroup as the underlying table. Die Dateigruppe muss bereits vorhanden sein.The filegroup must already exist.

" default "" default "
Erstellt den angegebenen Index für die Standarddateigruppe.Creates the specified index on the default filegroup.

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 (Transact-SQL).For more information, see SET QUOTED_IDENTIFIER (Transact-SQL).

BerechtigungenPermissions

Erfordert die ALTER-Berechtigung für die Tabelle.Requires ALTER permission on the table.

Allgemeine HinweiseGeneral Remarks

Ein Columnstore-Index kann für eine temporäre Tabelle erstellt werden.A columnstore index can be created on a temporary table. Wenn die Tabelle gelöscht oder die Sitzung beendet wird, wird der Index ebenfalls gelöscht.When the table is dropped or the session ends, the index is also dropped.

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 gefilterten Indizes finden Sie unter Erstellen gefilterter Indizes.For more information about Filtered Indexes, see Create Filtered Indexes.

EinschränkungenLimitations and Restrictions

Jede Spalte in einem Columnstore-Index muss von einem der folgenden allgemeinen Geschäftsdatentypen sein:Each column in a columnstore index must be of one of the following common business data types:

  • datetimeoffset [ ( n ) ]datetimeoffset [ ( n ) ]
  • datetime2 [ ( n ) ]datetime2 [ ( n ) ]
  • DATETIMEdatetime
  • smalldatetimesmalldatetime
  • datedate
  • time [ ( n ) ]time [ ( n ) ]
  • float [ ( n ) ]float [ ( n ) ]
  • real [ ( n ) ]real [ ( n ) ]
  • decimal [ ( precision [ , scale ] ) ]decimal [ ( precision [ , scale ] ) ]
  • numeric [ ( precision [ , scale ] ) ]numeric [ ( precision [ , scale ] ) ]
  • moneymoney
  • SMALLMONEYsmallmoney
  • BIGINTbigint
  • ssNoversionint
  • smallintsmallint
  • TINYINTtinyint
  • bitbit
  • nvarchar [ ( n ) ]nvarchar [ ( n ) ]
  • nvarchar(max) (Gilt für SQL Server 2017 (14.x)SQL Server 2017 (14.x), den Premium-Tarif und den Standard-Tarif (S3 und höher) sowie alle Tarife der vCore-Angebote, ausschließlich in gruppierten Columnstore-Indizes)nvarchar(max) (Applies to SQL Server 2017 (14.x)SQL Server 2017 (14.x) and Premium tier, Standard tier (S3 and above), and all VCore offerings tiers, in clustered columnstore indexes only)
  • nchar [ ( n ) ]nchar [ ( n ) ]
  • varchar [ ( n ) ]varchar [ ( n ) ]
  • varchar(max) (Gilt für SQL Server 2017 (14.x)SQL Server 2017 (14.x), den Premium-Tarif und den Standard-Tarif (S3 und höher) sowie alle Tarife der vCore-Angebote, ausschließlich in gruppierten Columnstore-Indizes)varchar(max) (Applies to SQL Server 2017 (14.x)SQL Server 2017 (14.x) and Premium tier, Standard tier (S3 and above), and all VCore offerings tiers, in clustered columnstore indexes only)
  • char [ ( n ) ]char [ ( n ) ]
  • varbinary [ ( n ) ]varbinary [ ( n ) ]
  • varbinary (max) (Gilt für SQL Server 2017 (14.x)SQL Server 2017 (14.x) und Azure SQL Database zum Premium- und Standard-Tarif (S3 und höher) sowie alle Tarife der vCore-Angebote, ausschließlich in gruppierten Columnstore-Indizes)varbinary (max) (Applies to SQL Server 2017 (14.x)SQL Server 2017 (14.x) and Azure SQL Database at Premium tier, Standard tier (S3 and above), and all VCore offerings tiers, in clustered columnstore indexes only)
  • binary [ ( n ) ]binary [ ( n ) ]
  • uniqueidentifier (Gilt für SQL Server 2014 (12.x)SQL Server 2014 (12.x) und höher)uniqueidentifier (Applies to SQL Server 2014 (12.x)SQL Server 2014 (12.x) and later)

Wenn die zugrunde liegende Tabelle eine Spalte enthält, die einen Datentyp aufweist, der für Columnstore-Indizes nicht unterstützt wird, müssen Sie diese Spalte aus dem nicht gruppierten Columnstore-Index ausschließen.If the underlying table has a column of a data type that is not supported for columnstore indexes, you must omit that column from the nonclustered columnstore index.

Spalten, die einen der folgenden Datentypen verwenden, können nicht in einem Columnstore-Index enthalten sein:Columns that use any of the following data types cannot be included in a columnstore index:

  • ntext, text und imagentext, text, and image
  • nvarchar(max), varchar(max) und varbinary(max) (Gilt für SQL Server 2016 (13.x)SQL Server 2016 (13.x) und frühere Versionen und nicht gruppierte Columnstore-Indizes)nvarchar(max), varchar(max), and varbinary(max) (Applies to SQL Server 2016 (13.x)SQL Server 2016 (13.x) and prior versions, and nonclustered columnstore indexes)
  • rowversion (und timestamp)rowversion (and timestamp)
  • sql_variantsql_variant
  • CLR-Typen (hierarchyid- und räumliche Typen)CLR types (hierarchyid and spatial types)
  • xmlxml
  • uniqueidentifier (gilt für SQL Server 2012 (11.x)SQL Server 2012 (11.x))uniqueidentifier (Applies to SQL Server 2012 (11.x)SQL Server 2012 (11.x))

Nicht gruppierte Columnstore-Indizes:Nonclustered columnstore indexes:

  • Kann nicht mehr als 1024 Spalten enthalten.Cannot have more than 1024 columns.
  • Kann nicht als einschränkungsbasierter Index erstellt werden.Cannot be created as a constraint-based index. Es ist möglich, dass Tabellen mit einem Columnstore-Index UNIQUE-, PRIMARY KEY- oder FOREIGN KEY-Einschränkungen enthalten.It is possible to have unique constraints, primary key constraints, and foreign key constraints on a table with a columnstore index. Einschränkungen werden immer mit einem Zeilenspeicherindex durchgesetzt.Constraints are always enforced with a row-store index. Sie können nie mit einem Columnstore-Index erzwungen werden, egal ob geclustert oder nicht.Constraints cannot be enforced with a columnstore (clustered or nonclustered) index.
  • Kann keine Sparsespalte enthalten.Cannot include a sparse column.
  • Kann nicht mithilfe der ALTER INDEX-Anweisung geändert werden.Cannot be changed by using the ALTER INDEX statement. Um den nicht gruppierten Index zu ändern, müssen Sie stattdessen den columnstore-Index löschen und neu erstellen.To change the nonclustered index, you must drop and re-create the columnstore index instead. Sie können einen Columnstore-Index mithilfe von ALTER INDEX deaktivieren und neu erstellen.You can use ALTER INDEX to disable and rebuild a columnstore index.
  • Kann nicht mit dem Schlüsselwort INCLUDE erstellt werden.Cannot be created by using the INCLUDE keyword.
  • Darf nicht das Schlüsselwort ASC oder das Schlüsselwort DESC zum Sortieren des Index enthalten.Cannot include the ASC or DESC keywords for sorting the index. Columnstore-Indizes werden gemäß den Komprimierungsalgorithmen sortiert.Columnstore indexes are ordered according to the compression algorithms. Durch die Sortierung würden viele der Leistungsvorteile entfernt werden.Sorting would eliminate many of the performance benefits.
  • Darf keine LOB-Spalten (Large Object) vom Typ nvarchar(max), varchar(max) bzw. varbinary(max) in gruppierten Columnstore-Indizes enthalten.Cannot include large object (LOB) columns of type nvarchar(max), varchar(max), and varbinary(max) in nonclustered column store indexes. LOB-Datentypen werden in gruppierten Columnstore-Indizes nur von Versionen ab SQL Server 2017 (14.x)SQL Server 2017 (14.x) und von der Azure SQL-Datenbank mit konfiguriertem Premium- und Standard-Tarif (S3 und höher) sowie allen Angebotstarifen unterstützt.Only clustered columnstore indexes support LOB types, beginning in SQL Server 2017 (14.x)SQL Server 2017 (14.x) version and Azure SQL Database configured at Premium tier, Standard tier (S3 and above), and all VCore offerings tiers tier. Frühere Versionen unterstützen LOB-Datentypen in gruppierten und nicht gruppierten Columnstore-Indizes nicht.Note, prior versions do not support LOB types in clustered and nonclustered columnstore indexes.

Hinweis

Ab SQL Server 2016 (13.x)SQL Server 2016 (13.x) können Sie einen nicht gruppierten Columnstore-Index für eine indizierte Sicht erstellen.Starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x), you can create a nonclustered columnstore index on an indexed view.

Columnstore-Indizes können mit den folgenden Features nicht kombiniert werden:Columnstore indexes cannot be combined with the following features:

  • Berechnete Spalten.Computed columns. Ab SQL Server 2017 darf ein gruppierter Columnstore-Index eine nicht persistierte berechnete Spalte enthalten.Starting with SQL Server 2017, a clustered columnstore index can contain a non-persisted computed column. In SQL Server 2017 dürfen gruppierte Columnstore-Indizes jedoch keine persistierten berechneten Spalten enthalten, und es können keine nicht gruppierten Indizes für berechnete Spalten erstellt werden.However, in SQL Server 2017, clustered columnstore indexes cannot contain persisted computed columns, and you cannot created nonclustered indexes on computed columns.
  • Seiten- und Zeilenkomprimierung und vardecimal-Speicherformat (ein Columnstore-Index ist bereits in einem anderen Format komprimiert)Page and row compression, and vardecimal storage format (A columnstore index is already compressed in a different format.)
  • ReplikationReplication
  • FilestreamFilestream

In einer Tabelle mit einem gruppierten Columnstore-Index können keine Cursor oder Trigger verwendet werden.You cannot use cursors or triggers on a table with a clustered columnstore index. Diese Einschränkung gilt nicht für nicht gruppierte Columnstore-Indizes; in einer Tabelle mit einem nicht gruppierten Columnstore-Index können Cursor und Trigger verwendet werden.This restriction does not apply to nonclustered columnstore indexes; you can use cursors and triggers on a table with a nonclustered columnstore index.

SQL Server 2014 (12.x)SQL Server 2014 (12.x)-spezifische EinschränkungenSQL Server 2014 (12.x)SQL Server 2014 (12.x) specific limitations
Diese Einschränkungen gelten nur für SQL Server 2014 (12.x)SQL Server 2014 (12.x).These limitations apply only to SQL Server 2014 (12.x)SQL Server 2014 (12.x). Mit diesem Release wurden aktualisierbare gruppierte Columnstore-Indizes eingeführt.In this release, we introduced updateable clustered columnstore indexes. Nicht gruppierte Columnstore-Indizes waren noch schreibgeschützt.Nonclustered columnstore indexes were still read-only.

  • Änderungsnachverfolgung.Change tracking. Im Zusammenhang mit nicht gruppierten Columnstore-Indizes (NCCI) kann Change Data Capture nicht verwendet werden, weil diese Indizes schreibgeschützt sind.You cannot use change tracking with nonclustered columnstore indexes (NCCI) because they are read-only. Für gruppierte Columnstore-Indizes (CCI) kann Change Data Capture verwendet werden.It does work for clustered columnstore indexes (CCI).
  • Change Data Capture.Change data capture. Im Zusammenhang mit nicht gruppierten Columnstore-Indizes (NCCI) kann Change Data Capture nicht verwendet werden, weil diese Indizes schreibgeschützt sind.You cannot use change data capture for nonclustered columnstore index (NCCI) because they are read-only. Für gruppierte Columnstore-Indizes (CCI) kann Change Data Capture verwendet werden.It does work for clustered columnstore indexes (CCI).
  • Lesbares sekundäres Replikat.Readable secondary. Auf einen gruppierten Columnstore-Index (CCI) kann nicht über ein lesbares sekundäres Replikat einer lesbaren Always On-Verfügbarkeitsgruppe zugegriffen werden.You cannot access a clustered columnstore index (CCI) from a readable secondary of an Always OnReadable availability group. Auf einen nicht gruppierten Columnstore-Index (NCCI) kann über ein lesbares sekundäres Replikat zugegriffen werden.You can access a nonclustered columnstore index (NCCI) from a readable secondary.
  • Mehrere aktive Resultsets (MARS).Multiple Active Result Sets (MARS). SQL Server 2014 (12.x)SQL Server 2014 (12.x) verwendet MARS für schreibgeschützte Verbindungen für Tabellen mit einem Columnstore-Index.uses MARS for read-only connections to tables with a columnstore index. SQL Server 2014 (12.x)SQL Server 2014 (12.x) unterstützt MARS jedoch nicht für gleichzeitige DML-Vorgänge (Datenbearbeitungssprache) für eine Tabelle mit einem Columnstore-Index.However, SQL Server 2014 (12.x)SQL Server 2014 (12.x) does not support MARS for concurrent data manipulation language (DML) operations on a table with a columnstore index. In diesem Fall beendet SQL ServerSQL Server die Verbindung und bricht die Transaktionen ab.When this occurs, SQL ServerSQL Server terminates the connections and aborts the transactions.
  • Nicht gruppierte Columnstore-Indizes können nicht für eine Ansicht oder indizierte Sicht erstellt werden.Nonclustered columnstore indexes cannot be created on a view or indexed view.

Informationen zu den Leistungsvorteilen und Einschränkungen von Columnstore-Indizes finden Sie unter Columnstore-Indizes: Übersicht.For information about the performance benefits and limitations of columnstore indexes, see Columnstore Indexes Overview.

MetadatenMetadata

Alle Spalten in einem Columnstore-Index werden in den Metadaten als eingeschlossene Spalten gespeichert.All of the columns in a columnstore index are stored in the metadata as included columns. Der Columnstore-Index weist keine Schlüsselspalten auf.The columnstore index does not have key columns. Diese Systemsichten enthalten Informationen zu Columnstore-Indizes.These system views provide information about columnstore indexes.

Beispiele zum Konvertieren einer Rowstore-Tabelle in ColumnstoreExamples for converting a rowstore table to columnstore

A.A. Konvertieren eines Heaps in einen gruppierten Columnstore-IndexConvert a heap to a clustered columnstore index

In diesem Beispiel wird eine Tabelle als Heap erstellt und anschließend in einen gruppierten Columnstore-Index mit dem Namen cci_Simple konvertiert.This example creates a table as a heap and then converts it to a clustered columnstore index named cci_Simple. Dadurch wird der Speicher für die gesamte Tabelle von rowstore in columnstore geändert.This changes the storage for the entire table from rowstore to columnstore.

CREATE TABLE SimpleTable(  
    ProductKey [int] NOT NULL,   
    OrderDateKey [int] NOT NULL,   
    DueDateKey [int] NOT NULL,   
    ShipDateKey [int] NOT NULL);  
GO  
CREATE CLUSTERED COLUMNSTORE INDEX cci_Simple ON SimpleTable;  
GO  

B.B. Konvertiert einen gruppierten Index in einen gruppierten Columnstore-Index mit demselben Namen.Convert a clustered index to a clustered columnstore index with the same name.

In diesem Beispiel wird eine Tabelle mit einem gruppierten Index erstellt. Anschließend wird die Syntax zum Konvertieren des gruppierten Indexes in einen gruppierten Columnstore-Index veranschaulicht.This example creates a table with clustered index, and then demonstrates the syntax of converting the clustered index to a clustered columnstore index. Dadurch wird der Speicher für die gesamte Tabelle von rowstore in columnstore geändert.This changes the storage for the entire table from rowstore to columnstore.

CREATE TABLE SimpleTable (  
    ProductKey [int] NOT NULL,   
    OrderDateKey [int] NOT NULL,   
    DueDateKey [int] NOT NULL,   
    ShipDateKey [int] NOT NULL);  
GO  
CREATE CLUSTERED INDEX cl_simple ON SimpleTable (ProductKey);  
GO  
CREATE CLUSTERED COLUMNSTORE INDEX cl_simple ON SimpleTable  
WITH (DROP_EXISTING = ON);  
GO  

C.C. Verarbeitung von nicht gruppierten Indizes beim Konvertieren einer Rowstore-Tabelle in einen Columnstore-Index.Handle nonclustered indexes when converting a rowstore table to a columnstore index.

In diesem Beispiel wird gezeigt, wie nicht gruppierte Indizes beim Konvertieren einer Rowstore-Tabelle in einen Columnstore-Index verarbeitet werden.This example shows how to handle nonclustered indexes when converting a rowstore table to a columnstore index. Ab SQL Server 2016 (13.x)SQL Server 2016 (13.x) ist keine spezielle Aktion erforderlich. SQL ServerSQL Server definiert die nicht gruppierten Indizes automatisch und erstellt sie neu im neuen gruppierten Columnstore-Index.Actually, beginning with SQL Server 2016 (13.x)SQL Server 2016 (13.x) no special action is required; SQL ServerSQL Server automatically defines and rebuilds the nonclustered indexes on the new clustered columnstore index.

Wenn Sie die nicht gruppierten Indizes löschen möchten, verwenden Sie vor dem Erstellen des Columnstore-Indexes die DROP INDEX-Anweisung.If you want to drop the nonclustered indexes, use the DROP INDEX statement prior to creating the columnstore index. Mit der DROP EXISTING-Option wird nur der konvertierte gruppierte Index gelöscht.The DROP EXISTING option only drops the clustered index that is being converted. Die nicht gruppierten Indizes werden nicht gelöscht.It does not drop the nonclustered indexes.

In SQL Server 2012 (11.x)SQL Server 2012 (11.x) und SQL Server 2014 (12.x)SQL Server 2014 (12.x) konnte für einen Columnstore-Index kein nicht gruppierter Index erstellt werden.In SQL Server 2012 (11.x)SQL Server 2012 (11.x) and SQL Server 2014 (12.x)SQL Server 2014 (12.x), you could not create a nonclustered index on a columnstore index. Im folgenden Beispiel wird gezeigt, dass in früheren Releases vor dem Erstellen des Columnstore-Indexes die nicht gruppierten Indizes gelöscht werden mussten.This example shows how in previous releases you need to drop the nonclustered indexes before creating the columnstore index.

--Create the table for use with this example.  
CREATE TABLE SimpleTable (  
    ProductKey [int] NOT NULL,   
    OrderDateKey [int] NOT NULL,   
    DueDateKey [int] NOT NULL,   
    ShipDateKey [int] NOT NULL);  
GO  
  
--Create two nonclustered indexes for use with this example  
CREATE INDEX nc1_simple ON SimpleTable (OrderDateKey);  
CREATE INDEX nc2_simple ON SimpleTable (DueDateKey);   
GO  
  
--SQL Server 2012 and SQL Server 2014: you need to drop the nonclustered indexes  
--in order to create the columnstore index.   
  
DROP INDEX SimpleTable.nc1_simple;  
DROP INDEX SimpleTable.nc2_simple;  
  
--Convert the rowstore table to a columnstore index.  
CREATE CLUSTERED COLUMNSTORE INDEX cci_simple ON SimpleTable;   
GO  

D.D. Konvertieren einer großen Faktentabelle von einem Rowstore in einen ColumnstoreConvert a large fact table from rowstore to columnstore

In diesem Beispiel wird erläutert, wie eine große Faktentabelle von einer Rowstore-Tabelle in eine Columnstore-Tabelle konvertiert wird.This example explains how to convert a large fact table from a rowstore table to a columnstore table.

So konvertieren Sie eine Rowstore-Tabelle in eine Columnstore-Tabelle:To convert a rowstore table to a columnstore table.

  1. Erstellen Sie zunächst eine kleine Tabelle, die für das Beispiel verwendet werden kann.First, create a small table to use in this example.

    --Create a rowstore table with a clustered index and a non-clustered index.  
    CREATE TABLE MyFactTable (  
        ProductKey [int] NOT NULL,  
        OrderDateKey [int] NOT NULL,  
         DueDateKey [int] NOT NULL,  
         ShipDateKey [int] NOT NULL )  
    )  
    WITH (  
        CLUSTERED INDEX ( ProductKey )  
    );  
    
    --Add a non-clustered index.  
    CREATE INDEX my_index ON MyFactTable ( ProductKey, OrderDateKey );  
    
  2. Löschen Sie alle nicht gruppierten Indizes aus der Rowstore-Tabelle.Drop all non-clustered indexes from the rowstore table.

    --Drop all non-clustered indexes  
    DROP INDEX my_index ON MyFactTable;  
    
  3. Löschen Sie den gruppierten Index.Drop the clustered index.

    • Führen Sie diesen Schritt nur aus, wenn Sie beim Konvertieren in einen gruppierten Columnstore-Index einen neuen Namen für den Index angeben möchten.Do this only if you want to specify a new name for the index when it is converted to a clustered columnstore index. Wenn Sie den gruppierten Index nicht löschen, weist der neue gruppierte Columnstore-Index den gleichen Namen auf.If you do not drop the clustered index, the new clustered columnstore index has the same name.

      Hinweis

      Der Indexname ist möglicherweise einprägsamer, wenn Sie einen eigenen Namen angeben.The name of the index might be easier to remember if you use your own name. Alle gruppierten Rowstore-Indizes weisen den Standardnamen auf, der ''ClusteredIndex_<GUID>'' lautet.All rowstore clustered indexes use the default name which is 'ClusteredIndex_<GUID>'.

    --Process for dropping a clustered index.  
    --First, look up the name of the clustered rowstore index.  
    --Clustered rowstore indexes always use the DEFAULT name 'ClusteredIndex_<GUID>'.  
    SELECT i.name   
    FROM sys.indexes i   
    JOIN sys.tables t  
    ON ( i.type_desc = 'CLUSTERED' ) WHERE t.name = 'MyFactTable';  
    
    --Drop the clustered rowstore index.  
    DROP INDEX ClusteredIndex_d473567f7ea04d7aafcac5364c241e09 ON MyDimTable;  
    
  4. Konvertieren Sie die Rowstore-Tabelle in eine Columnstore-Tabelle mit einem gruppierten Columnstore-Index.Convert the rowstore table to a columnstore table with a clustered columnstore index.

    --Option 1: Convert to columnstore and name the new clustered columnstore index MyCCI.  
    CREATE CLUSTERED COLUMNSTORE INDEX MyCCI ON MyFactTable;  
    
    --Option 2: Convert to columnstore and use the rowstore clustered   
    --index name for the columnstore clustered index name.  
    --First, look up the name of the clustered rowstore index.  
    SELECT i.name   
    FROM sys.indexes i  
    JOIN sys.tables t   
    ON ( i.type_desc = 'CLUSTERED' )  
    WHERE t.name = 'MyFactTable';  
    
    --Second, create the clustered columnstore index and   
    --Replace ClusteredIndex_d473567f7ea04d7aafcac5364c241e09  
    --with the name of your clustered index.  
    CREATE CLUSTERED COLUMNSTORE INDEX   
    ClusteredIndex_d473567f7ea04d7aafcac5364c241e09  
     ON MyFactTable  
    WITH DROP_EXISTING = ON;  
    

E.E. Konvertieren einer Columnstore-Tabelle in eine Rowstore-Tabelle mit einem gruppierten IndexConvert a columnstore table to a rowstore table with a clustered index

Verwenden Sie die CREATE INDEX-Anweisung mit der DROP_EXISTING-Option, um eine Columnstore-Tabelle in eine Rowstore-Tabelle mit einem gruppierten Index zu konvertieren.To convert a columnstore table to a rowstore table with a clustered index, use the CREATE INDEX statement with the DROP_EXISTING option.

CREATE CLUSTERED INDEX ci_MyTable   
ON MyFactTable  
WITH ( DROP EXISTING = ON );  

F.F. Konvertieren einer Columnstore-Tabelle in einen Rowstore-HeapConvert a columnstore table to a rowstore heap

Löschen Sie zum Konvertieren einer Columnstore-Tabelle in einen Rowstore-Heap einfach den gruppierten Columnstore-Index.To convert a columnstore table to a rowstore heap, simply drop the clustered columnstore index.

DROP INDEX MyCCI   
ON MyFactTable;  

G.G. Defragmentieren durch Neuerstellen des gesamten gruppierten Columnstore-IndexesDefragment by rebuilding the entire clustered columnstore index

Gilt für: SQL Server 2014 (12.x)SQL Server 2014 (12.x)Applies to: SQL Server 2014 (12.x)SQL Server 2014 (12.x)

Es gibt zwei Möglichkeiten, den gesamten gruppierten Columnstore-Index neu zu erstellen.There are two ways to rebuild the full clustered columnstore index. Sie können CREATE CLUSTERED COLUMNSTORE INDEX oder ALTER INDEX (Transact-SQL) und die REBUILD-Option verwenden.You can use CREATE CLUSTERED COLUMNSTORE INDEX, or ALTER INDEX (Transact-SQL) and the REBUILD option. Mit beiden Methoden werden die gleichen Ergebnisse erzielt.Both methods achieve the same results.

Hinweis

Ab SQL Server 2016 (13.x)SQL Server 2016 (13.x) können Sie ALTER INDEX...REORGANIZE verwenden, anstatt den gesamten Index mit diesen beispielhaften Methoden neu zu erstellen.Starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x), use ALTER INDEX...REORGANIZE instead of rebuilding with the methods described in this example.

--Determine the Clustered Columnstore Index name of MyDimTable.  
SELECT i.object_id, i.name, t.object_id, t.name   
FROM sys.indexes i   
JOIN sys.tables t  
ON (i.type_desc = 'CLUSTERED COLUMNSTORE')  
WHERE t.name = 'RowstoreDimTable';  
  
--Rebuild the entire index by using CREATE CLUSTERED INDEX.  
CREATE CLUSTERED COLUMNSTORE INDEX my_CCI   
ON MyFactTable  
WITH ( DROP_EXISTING = ON );  
  
--Rebuild the entire index by using ALTER INDEX and the REBUILD option.  
ALTER INDEX my_CCI  
ON MyFactTable  
REBUILD PARTITION = ALL  
WITH ( DROP_EXISTING = ON );  

Beispiele für nicht gruppierte Columnstore-IndizesExamples for nonclustered columnstore indexes

A.A. Erstellen eines Columnstore-Indexes als sekundärer Index für eine Rowstore-TabelleCreate a columnstore index as a secondary index on a rowstore table

In diesem Beispiel wird ein nicht gruppierter Columnstore-Index für eine Rowstore-Tabelle erstellt.This example creates a nonclustered columnstore index on a rowstore table. In diesem Fall kann nur ein Columnstore-Index erstellt werden.Only one columnstore index can be created in this situation. Der Columnstore-Index erfordert zusätzlichen Speicher, da er eine Kopie der Daten in der Rowstore-Tabelle enthält.The columnstore index requires extra storage since it contains a copy of the data in the rowstore table. In diesem Beispiel wird eine einfache Tabelle und ein gruppierter Index erstellt. Anschließend wird die Syntax zum Erstellen eines nicht gruppierten Columnstore-Indexes beschrieben.This example creates a simple table and a clustered index, and then demonstrates the syntax of creating a nonclustered columnstore index.

CREATE TABLE SimpleTable  
(ProductKey [int] NOT NULL,   
OrderDateKey [int] NOT NULL,   
DueDateKey [int] NOT NULL,   
ShipDateKey [int] NOT NULL);  
GO  
CREATE CLUSTERED INDEX cl_simple ON SimpleTable (ProductKey);  
GO  
CREATE NONCLUSTERED COLUMNSTORE INDEX csindx_simple  
ON SimpleTable  
(OrderDateKey, DueDateKey, ShipDateKey);  
GO  

B.B. Erstellen eines einfachen nicht gruppierten Columnstore-Indexes mit allen OptionenCreate a simple nonclustered columnstore index using all options

Im folgenden Beispiel wird die Syntax zum Erstellen eines nicht gruppierten Columnstore-Indexes unter Verwendung aller Optionen veranschaulicht.The following example demonstrates the syntax of creating a nonclustered columnstore index by using all options.

CREATE NONCLUSTERED COLUMNSTORE INDEX csindx_simple  
ON SimpleTable  
(OrderDateKey, DueDateKey, ShipDateKey)  
WITH (DROP_EXISTING =  ON,   
    MAXDOP = 2)  
ON "default"  
GO  

Ein komplexeres Beispiel mit partitionierten Tabellen finden Sie unter Columnstore-Indizes: Übersicht.For a more complex example using partitioned tables, see Columnstore Indexes Overview.

C.C. Erstellen eines nicht gruppierten Columnstore-Indexes mit einem gefilterten PrädikatCreate a nonclustered columnstore index with a filtered predicate

Im folgenden Beispiel wird ein gefilterter nicht gruppierter Columnstore-Index für die Production.BillOfMaterials-Tabelle in der AdventureWorks2012AdventureWorks2012-Datenbank erstellt.The following example creates a filtered nonclustered columnstore 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.

IF EXISTS (SELECT name FROM sys.indexes  
    WHERE name = N'FIBillOfMaterialsWithEndDate'   
    AND object_id = OBJECT_ID(N'Production.BillOfMaterials'))  
DROP INDEX FIBillOfMaterialsWithEndDate  
    ON Production.BillOfMaterials;  
GO  
CREATE NONCLUSTERED COLUMNSTORE INDEX "FIBillOfMaterialsWithEndDate"  
    ON Production.BillOfMaterials (ComponentID, StartDate)  
    WHERE EndDate IS NOT NULL;  

D.D. Ändern der Daten in einem nicht gruppierten Columnstore-IndexChange the data in a nonclustered columnstore index

Gilt für: SQL Server 2012 (11.x)SQL Server 2012 (11.x) bis SQL Server 2014 (12.x)SQL Server 2014 (12.x).Applies to: SQL Server 2012 (11.x)SQL Server 2012 (11.x) through SQL Server 2014 (12.x)SQL Server 2014 (12.x).

Wenn Sie einen nicht gruppierten Columnstore-Index für eine Tabelle erstellen, können Sie die Daten in dieser Tabelle nicht mehr direkt ändern.Once you create a nonclustered columnstore index on a table, you cannot directly modify the data in that table. Eine Abfrage mit INSERT, UPDATE, MERGE oder DELETE schlägt fehl und gibt eine Fehlermeldung zurück.A query with INSERT, UPDATE, DELETE, or MERGE fails and returns an error message. Um Daten in der Tabelle hinzuzufügen oder zu ändern, können Sie eine der folgenden Aktionen ausführen:To add or modify the data in the table, you can do one of the following:

  • Deaktivieren oder löschen Sie den Columnstore-Index.Disable or drop the columnstore index. Anschließend können Sie die Daten in der Tabelle aktualisieren.You can then update the data in the table. Wenn Sie den Columnstore-Index deaktivieren, können Sie den Columnstore-Index nach dem Aktualisieren der Daten neu erstellen.If you disable the columnstore index, you can rebuild the columnstore index when you finish updating the data. Beispiel:For example,

    ALTER INDEX mycolumnstoreindex ON mytable DISABLE;  
    -- update mytable --  
    ALTER INDEX mycolumnstoreindex on mytable REBUILD  
    
  • Laden Sie Daten in eine Stagingtabelle ohne Columnstore-Index.Load data into a staging table that does not have a columnstore index. Erstellen Sie einen Columnstore-Index für die Stagingtabelle.Build a columnstore index on the staging table. Wechseln Sie für die Stagingtabelle in eine leere Partition der Haupttabelle.Switch the staging table into an empty partition of the main table.

  • Wechseln Sie für eine Partition in der Tabelle mit dem Columnstore-Index in eine leere Stagingtabelle.Switch a partition from the table with the columnstore index into an empty staging table. Wenn die Stagingtabelle über einen Columnstore-Index verfügt, deaktivieren Sie den Columnstore-Index.If there is a columnstore index on the staging table, disable the columnstore index. Nehmen Sie die gewünschten Updates vor.Perform any updates. Erstellen bzw. erstellen Sie den Columnstore-Index neu.Build (or rebuild) the columnstore index. Wechseln Sie für die Stagingtabelle zurück in die (nun leere) Partition der Haupttabelle.Switch the staging table back into the (now empty) partition of the main table.

Beispiele: Azure SQL Data WarehouseAzure SQL Data Warehouse und Parallel Data WarehouseParallel Data Warehouse.Examples: Azure SQL Data WarehouseAzure SQL Data Warehouse and Parallel Data WarehouseParallel Data Warehouse

A.A. Ändern eines gruppierten Indexes in einen gruppierten Columnstore-IndexChange a clustered index to a clustered columnstore index

Mit der CREATE CLUSTERED COLUMNSTORE INDEX-Anweisung und DROP_EXISTING = ON haben Sie folgende Möglichkeiten:By using the CREATE CLUSTERED COLUMNSTORE INDEX statement with DROP_EXISTING = ON, you can:

  • Ändern eines gruppierten Indexes in einen gruppierten Columnstore-IndexChange a clustered index into a clustered columnstore index.

  • Neuerstellen eines gruppierten Columnstore-IndexesRebuild a clustered columnstore index.

In diesem Beispiel wird die xDimProduct-Tabelle als Rowstore-Tabelle mit einem gruppierten Index erstellt. Anschließend wird die Rowstore-Tabelle mit CREATE CLUSTERED COLUMNSTORE INDEX in eine Columnstore-Tabelle konvertiert.This example creates the xDimProduct table as a rowstore table with a clustered index, and then uses CREATE CLUSTERED COLUMNSTORE INDEX to change the table from a rowstore table to a columnstore table.

-- Uses AdventureWorks  
  
IF EXISTS (SELECT name FROM sys.tables  
    WHERE name = N'xDimProduct'  
    AND object_id = OBJECT_ID (N'xDimProduct'))  
DROP TABLE xDimProduct;  
  
--Create a distributed table with a clustered index.  
CREATE TABLE xDimProduct (ProductKey, ProductAlternateKey, ProductSubcategoryKey)  
WITH ( DISTRIBUTION = HASH(ProductKey),  
    CLUSTERED INDEX (ProductKey) )  
AS SELECT ProductKey, ProductAlternateKey, ProductSubcategoryKey FROM DimProduct;  
  
--Change the existing clustered index   
--to a clustered columnstore index with the same name.  
--Look up the name of the index before running this statement.  
CREATE CLUSTERED COLUMNSTORE INDEX <index_name>   
ON xdimProduct   
WITH ( DROP_EXISTING = ON );  

B.B. Neuerstellen eines gruppierten Columnstore-IndexesRebuild a clustered columnstore index

Aufbauend auf dem vorherigen Beispiel wird in diesem Beispiel der vorhandene gruppierte Columnstore-Index namens „cci_xDimProduct“ mit CREATE CLUSTERED COLUMNSTORE INDEX neu erstellt.Building on the previous example, this example uses CREATE CLUSTERED COLUMNSTORE INDEX to rebuild the existing clustered columnstore index called cci_xDimProduct.

--Rebuild the existing clustered columnstore index.  
CREATE CLUSTERED COLUMNSTORE INDEX cci_xDimProduct   
ON xdimProduct   
WITH ( DROP_EXISTING = ON );  

C.C. Ändern des Namens eines gruppierten Columnstore-IndexesChange the name of a clustered columnstore index

Um den Namen eines gruppierten Columnstore-Indexes zu ändern, löschen Sie den vorhandenen gruppierten Columnstore-Index. Erstellen Sie anschließend den Index mit einem neuen Namen neu.To change the name of a clustered columnstore index, drop the existing clustered columnstore index, and then recreate the index with a new name.

Es wird empfohlen, diesen Vorgang nur bei einer kleinen oder leeren Tabelle durchzuführen.We recommend only doing this operation with a small table or an empty table. Einen umfangreichen gruppierten Columnstore-Index zu löschen und mit einem anderen Namen neu zu erstellen, nimmt viel Zeit in Anspruch.It takes a long time to drop a large clustered columnstore index and rebuild with a different name.

In diesem Beispiel wird der gruppierte Columnstore-Index „cci_xDimProduct“ aus dem vorherigen Beispiel gelöscht. Anschließend wird der gruppierte Columnstore-Index mit dem Namen „mycci_xDimProduct“ neu erstellt.Using the cci_xDimProduct clustered columnstore index from the previous example, this example drops the cci_xDimProduct clustered columnstore index and then recreates the clustered columnstore index with the name mycci_xDimProduct.

--For illustration purposes, drop the clustered columnstore index.   
--The table continues to be distributed, but changes to a heap.  
DROP INDEX cci_xdimProduct ON xDimProduct;  
  
--Create a clustered index with a new name, mycci_xDimProduct.  
CREATE CLUSTERED COLUMNSTORE INDEX mycci_xDimProduct  
ON xdimProduct  
WITH ( DROP_EXISTING = OFF );  

D.D. Konvertieren einer Columnstore-Tabelle in eine Rowstore-Tabelle mit einem gruppierten IndexConvert a columnstore table to a rowstore table with a clustered index

Es kann vorkommen, dass ein gruppierter Columnstore-Index gelöscht und ein gruppierter Index erstellt werden soll.There might be a situation for which you want to drop a clustered columnstore index and create a clustered index. Dadurch wird die Tabelle im Rowstore-Format gespeichert.This stores the table in rowstore format. In diesem Beispiel wird eine Columnstore-Tabelle in eine Rowstore-Tabelle mit einem gruppierten Index mit demselben Namen konvertiert.This example converts a columnstore table to a rowstore table with a clustered index with the same name. Dabei gehen keine Daten verloren.None of the data is lost. Alle Daten werden in die Rowstore-Tabelle verschoben, und aus den aufgelisteten Spalten werden die Schlüsselspalten im gruppierten Index.All data goes to the rowstore table and the columns listed becomes the key columns in the clustered index.

--Drop the clustered columnstore index and create a clustered rowstore index.   
--All of the columns are stored in the rowstore clustered index.   
--The columns listed are the included columns in the index.  
CREATE CLUSTERED INDEX cci_xDimProduct    
ON xdimProduct (ProductKey, ProductAlternateKey, ProductSubcategoryKey, WeightUnitMeasureCode)  
WITH ( DROP_EXISTING = ON);  

E.E. Konvertieren einer Columnstore-Tabelle in einen Rowstore-HeapConvert a columnstore table back to a rowstore heap

Verwenden Sie DROP INDEX (SQL Server PDW), um den gruppierten Columnstore-Index zu verwerfen und die Tabelle in einen Rowstore-Heap zu konvertieren.Use DROP INDEX (SQL Server PDW) to drop the clustered columnstore index and convert the table to a rowstore heap. In diesem Beispiel wird die Tabelle „cci_xDimProduct“ in einen Rowstore-Heap konvertiert.This example converts the cci_xDimProduct table to a rowstore heap. Die Tabelle wird weiterhin verteilt, jedoch als Heap gespeichert.The table continues to be distributed, but is stored as a heap.

--Drop the clustered columnstore index. The table continues to be distributed, but changes to a heap.  
DROP INDEX cci_xdimProduct ON xdimProduct;