CREATE COLUMNSTORE INDEX (Transact-SQL)

Erstellt einen columnstore-Index für eine angegebene Tabelle. Bei einem speicheroptimierten xVelocity-columnstore-Index handelt es sich um einen Typ von komprimierten nicht gruppierten Indizes. Pro Tabelle ist nur ein columnstore-Index zulässig. Ein Index kann erstellt werden, bevor Daten in der Tabelle enthalten sind. Eine Tabelle mit einem columnstore-Index kann nicht aktualisiert werden. Informationen zum Verwenden von columnstore-Indizes finden Sie unter Columnstore-Indizes.

HinweisHinweis

Informationen zum Erstellen eines relationalen Index finden Sie unter CREATE INDEX (Transact-SQL). Informationen zum Erstellen eines XML-Index finden Sie unter CREATE XML INDEX (Transact-SQL). Informationen zum Erstellen eines räumlichen Index finden Sie unter CREATE SPATIAL INDEX (Transact-SQL).

Themenlink (Symbol) Transact-SQL-Syntaxkonventionen

Syntax

CREATE [ NONCLUSTERED ] COLUMNSTORE INDEX index_name 
    ON <object> ( column  [ ,...n ] )
    [ WITH ( <column_index_option> [ ,...n ] ) ]
    [ ON {
           { partition_scheme_name ( column_name ) } 
           | filegroup_name 
           | "default" 
         }
    ]
[ ; ]

<object> ::=
{
    [database_name. [schema_name ] . | schema_name . ]
     table_name
{

<column_index_option> ::=
{
      DROP_EXISTING = { ON | OFF }
    | MAXDOP = max_degree_of_parallelism
 }

Argumente

  • NONCLUSTERED
    Erstellt einen columnstore-Index, der die logische Reihenfolge einer Tabelle angibt. Gruppierte columnstore-Indizes werden nicht unterstützt.

  • COLUMNSTORE
    Gibt an, dass der Index ein columnstore-Index ist.

  • index_name
    Der Name des Index. Indexnamen müssen für eine Tabelle oder Sicht eindeutig sein, können aber innerhalb einer Datenbank mehrfach vorkommen. Indexnamen müssen den Regeln für Bezeichner entsprechen.

  • column
    Gibt die Spalten an, auf denen der Index basiert. Ein Columnstore-Index ist auf 1024 Spalten beschränkt.

  • ON partition_scheme_name**(column_name)**
    Gibt das Partitionsschema an, das die Dateigruppen definiert, denen die Partitionen eines partitionierten Index zugeordnet werden. Das Partitionsschema muss bereits durch Ausführen von CREATE PARTITION SCHEME in der Datenbank vorhanden sein. column_name gibt die Spalte an, auf deren Grundlage ein partitionierter Index partitioniert wird. Diese Spalte muss mit dem Datentyp, der Länge und der Genauigkeit des Arguments der Partitionierungsfunktion übereinstimmen, die partition_scheme_name verwendet. column_name ist nicht auf Spalten in der Indexdefinition beschränkt. Wenn Sie einen columnstore-Index partitionieren, fügt Database Engine (Datenbankmodul) die Partitionierungsspalte als Spalte des Index hinzu, wenn sie noch nicht angegeben ist.

    Wenn partition_scheme_name oder filegroup bei einer partitionierten Tabelle nicht angegeben werden, wird der Index in demselben Partitionsschema platziert und verwendet dieselbe Partitionsspalte wie die zugrunde liegende Tabelle.

    Weitere Informationen zum Partitionieren von Indizes finden Sie unter Partitionierte Tabellen und Indizes.

  • ON filegroup_name
    Erstellt den angegebenen Index für die angegebene Dateigruppe. Wenn kein Speicherort angegeben und die Tabelle oder Sicht nicht partitioniert ist, verwendet der Index dieselbe Dateigruppe wie die zugrunde liegende Tabelle oder Sicht. Die Dateigruppe muss bereits vorhanden sein.

  • ON "default"
    Erstellt den angegebenen Index für die Standarddateigruppe.

    Der Begriff default ist in diesem Kontext kein Schlüsselwort. Er ist ein Bezeichner für die Standarddateigruppe und muss begrenzt sein, wie in ON "default" oder ON [default]. Wenn "default" angegeben ist, muss die Option QUOTED_IDENTIFIER für die aktuelle Sitzung auf ON festgelegt sein. Dies ist die Standardeinstellung. Weitere Informationen finden Sie unter SET QUOTED_IDENTIFIER (Transact-SQL).

<object>::=

Gibt das vollqualifizierte oder nicht vollqualifizierte Objekt an, das indiziert werden soll.

  • database_name
    Der Name der Datenbank.

  • schema_name
    Der Name des Schemas, zu dem die Tabelle gehört.

  • table_name
    Der Name der Tabelle, die indiziert werden soll.

<column_index_option>::=

Gibt die Optionen an, die beim Erstellen des Columnstore-Index verwendet werden sollen.

  • DROP_EXISTING
    Gibt an, dass der benannte, bereits vorhandene Index gelöscht und neu erstellt wird. Der Standardwert ist OFF.

    • ON
      Der vorhandene Index wird gelöscht und neu erstellt. Der angegebene Indexname muss mit dem Namen eines derzeit vorhandenen Index übereinstimmen. Die Indexdefinition kann jedoch geändert werden. Sie können z. B. andere Spalten oder Indexoptionen angeben.
    • OFF
      Es wird ein Fehler angezeigt, wenn der angegebene Indexname bereits vorhanden ist. Der Indextyp kann nicht mithilfe von DROP_EXISTING geändert werden. In abwärtskompatibler Syntax ist WITH DROP_EXISTING gleichwertig mit WITH DROP_EXISTING = ON.
  • MAXDOP = max_degree_of_parallelism
    Überschreibt die Konfigurationsoption Konfigurieren der Serverkonfigurationsoption Max. Grad an Parallelität für die Dauer des Indexvorgangs. Mit MAXDOP können Sie die Anzahl der Prozessoren begrenzen, die bei der Ausführung paralleler Pläne verwendet werden. Maximal sind 64 Prozessoren zulässig.

    Mögliche Werte für max_degree_of_parallelism sind:

    • 1
      Unterdrückt das Generieren paralleler Pläne.

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

    • 0 (Standardwert)
      Verwendet abhängig von der aktuellen Systemarbeitsauslastung die tatsächliche Anzahl von Prozessoren oder weniger Prozessoren.

    Weitere Informationen finden Sie unter Konfigurieren von Parallelindexvorgängen.

    HinweisHinweis

    Parallele Indexvorgänge sind nicht in jeder Edition von Microsoft SQL Server verfügbar. Eine Liste der Funktionen, die von den Editionen von SQL Server unterstützt werden, finden Sie unter Von den SQL Server 2012-Editionen unterstützte Funktionen.

Hinweise

Indizes können für temporäre Tabellen erstellt werden. Wenn die Tabelle gelöscht oder die Sitzung beendet wird, werden die Indizes gelöscht.

Die allgemeinen Geschäftsdatentypen können in einem columnstore-Index enthalten sein. Die folgenden Datentypen können in einem columnstore-Index enthalten sein.

  • char und varchar

  • nchar und nvarchar (außer varchar(max) und nvarchar(max))

  • decimal (und numeric), außer mit einer höheren Genauigkeit als 18 Stellen

  • int, bigint, smallint und tinyint

  • float (und real)

  • bit

  • money und smallmoney

  • Alle Datums- und Uhrzeitdatentypen (außer datetimeoffset mit mehr Dezimalstellen als 2)

Die folgenden Datentypen können nicht in einem Columnstore-Index enthalten sein.

  • binary und varbinary

  • ntext, text und image

  • varchar(max) und nvarchar(max)

  • uniqueidentifier

  • rowversion (und timestamp)

  • sql_variant

  • decimal (und numeric) mit einer höheren Genauigkeit als 18 Stellen

  • datetimeoffset mit mehr Dezimalstellen als 2

  • CLR-Typen (hierarchyid und räumliche Typen)

  • xml

Grundlegende Einschränkungen

Ein Columnstore-Index:

  • Kann nicht mehr als 1024 Spalten enthalten.

  • Kann nicht gruppiert werden. Nur nicht gruppierte columnstore-Indizes sind verfügbar.

  • Kann kein eindeutiger Index sein.

  • Kann nicht für eine Sicht oder indizierte Sicht erstellt werden.

  • Kann keine Spalte mit geringer Dichte enthalten.

  • Kann nicht als Primärschlüssel oder Fremdschlüssel dienen.

  • Kann nicht mit der ALTER INDEX-Anweisung geändert werden. Stattdessen sollte der Columnstore-Index gelöscht und neu erstellt werden. (Sie können einen Columnstore-Index mithilfe von ALTER INDEX deaktivieren und neu erstellen.)

  • Kann nicht mit dem INCLUDE-Schlüsselwort erstellt werden.

  • Kann nicht das ASC-Schlüsselwort oder das DESC-Schlüsselwort zum Sortieren des Index enthalten. Columnstore-Indizes werden gemäß den Komprimierungsalgorithmen sortiert. Durch die Sortierung würden viele der Leistungsvorteile entfernt werden.

Columnstore-Indizes können nicht mit den folgenden Funktionen kombiniert werden:

  • Seiten- und Zeilenkomprimierung und vardecimal-Speicherformat (ein Columnstore-Index ist bereits in einem anderen Format komprimiert)

  • Replikation

  • Änderungsnachverfolgung

  • Change Data Capture

  • Filestream

Informationen zu den Leistungsvorteilen und Einschränkungen von Columnstore-Indizes finden Sie unter Columnstore-Indizes.

Berechtigungen

Erfordert die ALTER-Berechtigung für die Tabelle.

Beispiele

A.Erstellen eines einfachen nicht gruppierten Index

Im folgenden Beispiel wird eine einfache Tabelle mit einem gruppierten Index erstellt. Anschließend wird die Syntax für das Erstellen eines columnstore-Index veranschaulicht.

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.Erstellen eines einfachen nicht gruppierten Index mit allen Optionen

Im folgenden Beispiel wird eine einfache Tabelle mit einem gruppierten Index erstellt. Anschließend wird die Syntax für das Erstellen eines columnstore-Index veranschaulicht.

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.

Siehe auch

Verweis

sys.column_store_dictionaries (Transact-SQL)

sys.column_store_segments (Transact-SQL)

ALTER INDEX (Transact-SQL)

CREATE PARTITION FUNCTION (Transact-SQL)

CREATE PARTITION SCHEME (Transact-SQL)

DROP INDEX (Transact-SQL)

sys.indexes (Transact-SQL)

sys.index_columns (Transact-SQL)

Konzepte

Columnstore-Indizes

Columnstore-Indizes