Freigeben über


ERSTELLEN SIE COLUMNSTORE-INDEX (Transact-SQL)

Gilt für:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL-Datenbank in Microsoft Fabric

Konvertieren Sie eine Rowstore-Tabelle in einen gruppierten Columnstore-Index, oder erstellen Sie einen nicht gruppierten Spaltenspeicherindex. Verwenden Sie einen Columnstore-Index, um echtzeitbasierte Betriebsanalysen auf einer OLTP-Workload effizient auszuführen oder um die Datenkomprimierung und Abfrageleistung für Data Warehouse-Workloads zu verbessern.

Folgen Sie den Neuerungen in columnstore-Indizes für die neuesten Verbesserungen dieses Features.

Transact-SQL-Syntaxkonventionen

Syntax

Syntax für Azure SQL-Datenbank und Azure SQL Managed InstanceAUTD:

-- Create a clustered columnstore index on disk-based table.
CREATE CLUSTERED COLUMNSTORE INDEX index_name
    ON { database_name.schema_name.table_name | schema_name.table_name | table_name }
    [ ORDER (column [ , ...n ] ) ]
    [ WITH ( <with_option> [ , ...n ] ) ]
    [ ON <on_option> ]
[ ; ]

-- Create a nonclustered columnstore index on a disk-based table.
CREATE [ NONCLUSTERED ]  COLUMNSTORE INDEX index_name
    ON { database_name.schema_name.table_name | schema_name.table_name | table_name }
        ( column  [ , ...n ] )
    [ ORDER (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 für SQL Server:

-- Create a clustered columnstore index on disk-based table.
CREATE CLUSTERED COLUMNSTORE INDEX index_name
    ON { database_name.schema_name.table_name | schema_name.table_name | table_name }
    [ WITH ( <with_option> [ , ...n ] ) ]
    [ ORDER (column [ , ...n ] ) ]
    [ ON <on_option> ]
[ ; ]

-- Create a nonclustered columnstore index on a disk-based table.
CREATE [ NONCLUSTERED ]  COLUMNSTORE INDEX index_name
    ON { database_name.schema_name.table_name | schema_name.table_name | table_name }
        ( column  [ , ...n ] )
    [ ORDER (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 für Azure Synapse Analytics and Analytics Platform System (PDW):

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

Verfügbarkeit der Version

Einige der Optionen sind in allen Datenbankmodulversionen nicht verfügbar. In der folgenden Tabelle sind die Versionen aufgeführt, wenn die Optionen in gruppierten Columnstore- und nicht gruppierten Spaltenspeicherindizes eingeführt werden:

Option CLUSTERED NONCLUSTERED
COMPRESSION_DELAY SQL Server 2016 (13.x) SQL Server 2016 (13.x)
DATA_COMPRESSION SQL Server 2016 (13.x) SQL Server 2016 (13.x)
ONLINE SQL Server 2019 (15.x) SQL Server 2017 (14.x)
WHERE-Klausel N/A SQL Server 2016 (13.x)
ORDER-Klausel SQL Server 2016 (13.x) SQL Server 2025 (17.x)

Alle Optionen sind in Azure SQL-Datenbank und azure SQL Managed InstanceAUTD verfügbar.

Weitere Details zur Verfügbarkeit von Features finden Sie unter Neuigkeiten in Columnstore-Indizes.

Arguments

CLUSTERED COLUMNSTORE INDEX ERSTELLEN

Erstellen Sie einen gruppierten Spaltenspeicherindex, in dem alle Daten komprimiert und nach Spalte gespeichert werden. Der Index enthält alle Spalten in der Tabelle und speichert die gesamte Tabelle. Wenn es sich bei der vorhandenen Tabelle um einen Heap oder gruppierten Index handelt, wird sie in einen gruppierten Spaltenspeicherindex konvertiert. Wenn die Tabelle bereits als Gruppierter Spaltenspeicherindex gespeichert ist, wird der vorhandene Index gelöscht und neu erstellt.

Important

In der SQL-Datenbank in Fabric muss ein gruppierter Spaltenspeicherindex innerhalb desselben Batches oder derselben Transaktion wie die Tabelle erstellt werden, zu der sie gehört. Das Hinzufügen eines gruppierten Spaltenspeicherindexes zu einer Tabelle, nachdem sie bereits erstellt wurde, kann zu folgendem Fehler führen:

Msg 35354, Level 16, State 1, Line 63, The statement failed because a clustered columnstore index cannot be created on a table enabled for Change Feed. Consider disabling Change Feed and then creating the clustered columnstore index.

index_name

Gibt den Namen für den neuen Index an.

Wenn die Tabelle bereits über einen gruppierten Spaltenspeicherindex verfügt, können Sie denselben Namen wie der vorhandene Index angeben, oder Sie können die OPTION DROP EXISTING verwenden, um einen neuen Namen anzugeben.

AUF [ database_name. [ schema_name ] . | schema_name . ] table_name

Gibt den 1-, zwei- oder dreiteiligen Namen der Tabelle an, die als Gruppierter Spaltenspeicherindex gespeichert werden soll. Wenn es sich bei der Tabelle um einen Heap oder einen gruppierten Index handelt, wird die Tabelle aus einem Zeilenspeicher in einen Spaltenspeicher konvertiert. Wenn die Tabelle bereits ein Columnstore ist, erstellt diese Anweisung den Gruppierten Spaltenspeicherindex neu.

ORDER für gruppierten Spaltenspeicher

Verwenden Sie die column_store_order_ordinal Spalte in sys.index_columns , um die Reihenfolge der Spalten für einen gruppierten Spaltenspeicherindex zu bestimmen. Spaltenspeicher-Sortierungshilfen bei der Segmententfernung, insbesondere bei Zeichenfolgendaten. Weitere Informationen finden Sie unter Leistungsoptimierung mit sortierten Columnstore-Indizes und Columnstore-Indizes – Entwurfsanleitungen.

Um in einen geordneten gruppierten Columnstore-Index zu konvertieren, muss der vorhandene Index ein gruppierter Spaltenspeicherindex sein. Verwenden Sie die DROP_EXISTING-Option.

Lob-Datentypen (die Datentypen der maximalen Länge) können nicht der Schlüssel eines sortierten gruppierten Spaltenspeicherindexes sein.

Verwenden Sie beim Erstellen eines gruppierten Columnstore-Index die MAXDOP = 1 Option für die höchste Qualität der Sortierung im Austausch für eine wesentlich längere Dauer der CREATE INDEX Anweisung. Um den Index so schnell wie möglich zu erstellen, beschränken Sie MAXDOP nicht. Die höchste Qualität der Komprimierung und Sortierung kann Abfragen im Spaltenspeicherindex unterstützen.

Die Verfügbarkeit des sortierten Columnstore-Index finden Sie unter Columnstore-Indizes: Übersicht.

WITH-Optionen

DROP_EXISTING = [OFF] | AUF

DROP_EXISTING = ON Gibt an, den vorhandenen Index abzulegen und einen neuen Spaltenspeicherindex zu erstellen.

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

Der Standardwert , DROP_EXISTING = OFF, erwartet, dass der Indexname mit dem vorhandenen Namen identisch ist. Wenn der angegebene Indexname bereits vorhanden ist, tritt ein Fehler auf.

MAXDOP = max_degree_of_parallelism

Diese Option kann die vorhandene maximale Parallelitätsserverkonfiguration während des Indexvorgangs außer Kraft setzen. Verwenden Sie MAXDOP, um die Anzahl der Prozessoren zu begrenzen, die in einer parallelen Planausführung verwendet werden. Das Maximum beträgt 64 Prozessoren.

max_degree_of_parallelism Werte können folgende Werte sein:

  • 1, was bedeutet, die parallele Plangenerierung zu unterdrücken.
  • >1, was bedeutet, die maximale Anzahl von Prozessoren, die in einem parallelen Indexvorgang verwendet werden, auf die angegebene Anzahl oder weniger auf der Grundlage der aktuellen Systemauslastung einzuschränken. Wenn z. B. MAXDOP = 4 ist, beträgt die Anzahl der verwendeten Prozessoren 4 oder weniger.
  • 0 (Standard), was bedeutet, dass die tatsächliche Anzahl der Prozessoren auf der Grundlage der aktuellen Systemauslastung verwendet werden soll.
CREATE CLUSTERED COLUMNSTORE INDEX cci
    ON Sales.OrderLines WITH (MAXDOP = 2);

Weitere Informationen finden Sie unter Serverkonfiguration: max. Grad der Parallelität und Konfigurieren von parallelen Indexvorgängen.

COMPRESSION_DELAY = 0 | Delay [ MINUTES ]

Bei einer datenträgerbasierten Tabelle gibt die Verzögerung die Mindestanzahl von Minuten an, die eine Delta-Zeilengruppe im geschlossenen Zustand in der Delta-Zeilengruppe verbleiben muss. SQL Server kann sie dann in die komprimierte Zeilengruppe komprimieren. Da datenträgerbasierte Tabellen keine Einfüge- und Aktualisierungszeiten für einzelne Zeilen nachverfolgen, wendet SQL Server die Verzögerung auf Delta-Zeilengruppen im geschlossenen Zustand an.

Die Standardeinstellung beträgt 0 Minuten.

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

Empfehlungen für die Verwendung von COMPRESSION_DELAY finden Sie unter "Erste Schritte mit Columnstore-Indizes für Echtzeit-Betriebsanalysen".

DATA_COMPRESSION = COLUMNSTORE | COLUMNSTORE_ARCHIVE

Gibt die Datenkomprimierungsoption für die angegebene Tabelle, Partitionsnummer oder den Bereich von Partitionen an. Die Optionen sind wie folgt:

  • COLUMNSTORE ist der Standardwert und gibt an, mit der leistungsstärksten Spaltenspeicherkomprimierung zu komprimieren. Diese Option ist die typische Wahl.
  • COLUMNSTORE_ARCHIVE komprimiert die Tabelle oder Partition weiter auf eine kleinere Größe. Verwenden Sie diese Option für Situationen wie die Archivierung, die eine kleinere Speichergröße erfordert und mehr Zeit für Speicher und Abruf leisten kann.
CREATE CLUSTERED COLUMNSTORE INDEX cci
    ON Sales.OrderLines WITH (DATA_COMPRESSION = COLUMNSTORE_ARCHIVE);

Weitere Informationen zur Komprimierung finden Sie unter Datenkomprimierung.

ONLINE = [ON | AUS]
  • ON Gibt an, dass der Columnstore-Index online und verfügbar bleibt, während die neue Kopie des Index erstellt wird.
  • OFF Gibt an, dass der Index nicht für die Verwendung verfügbar ist, während die neue Kopie erstellt wird.
CREATE CLUSTERED COLUMNSTORE INDEX cci
    ON Sales.OrderLines WITH (ONLINE = ON);

EIN-Optionen

Mit diesen Optionen können Sie Optionen für die Datenspeicherung angeben, z. B. ein Partitionsschema, eine bestimmte Dateigruppe oder die Standarddateigruppe. Wenn die ON-Option nicht angegeben ist, verwendet der Index die Einstellungspartitions- oder Dateigruppeneinstellungen der vorhandenen Tabelle.

partition_scheme_name ( column_name ) gibt das Partitionsschema für die Tabelle an. Das Partitionsschema muss bereits in der Datenbank vorhanden sein. Informationen zum Erstellen des Partitionsschemas finden Sie unter CREATE PARTITION SCHEME.

column_name gibt die Spalte an, für die ein partitioniertes Index partitioniert wird. Diese Spalte muss mit dem Datentyp, der Länge und der Genauigkeit des Arguments der Partitionsfunktion übereinstimmen, die partition_scheme_name verwendet.

filegroup_name gibt die Dateigruppe zum Speichern des Gruppierten Spaltenspeicherindex an. Wenn kein Speicherort angegeben ist und die Tabelle nicht partitioniert ist, verwendet der Index dieselbe Dateigruppe wie die zugrunde liegende Tabelle oder Ansicht. Die Dateigruppe muss bereits vorhanden sein.

Um den Index für die Standarddateigruppe zu erstellen, verwenden "default" Oder [default]. Wenn Sie angeben "default", muss die QUOTED_IDENTIFIER Option für die aktuelle Sitzung sein ON . QUOTED_IDENTIFIER ist standardmäßig ON. Weitere Informationen finden Sie unter SET QUOTED_IDENTIFIER.

[nicht gruppiert] spaltenspeicherindex erstellen

Erstellen Sie einen nicht gruppierten Columnstore-Index in einer Rowstore-Tabelle, die als Heap oder gruppierter Index gespeichert ist. Der Index kann eine gefilterte Bedingung aufweisen und muss nicht alle Spalten der zugrunde liegenden Tabelle enthalten. Der Spaltenspeicherindex benötigt genügend Speicherplatz, um eine Kopie der Daten zu speichern. Sie können den Index aktualisieren und aktualisiert werden, wenn die zugrunde liegende Tabelle geändert wird. Der nicht gruppierte Columnstore-Index in einem gruppierten Index ermöglicht Echtzeitanalysen.

index_name

Gibt den Namen des Indexes an. index_name muss innerhalb der Tabelle eindeutig sein, muss aber nicht innerhalb der Datenbank eindeutig sein. Indexnamen müssen den Regeln für Bezeichner entsprechen.

( Spalte [ ,... n ] )

Gibt die zu speichernden Spalten an. Ein nicht gruppierter Spaltenspeicherindex ist auf 1.024 Spalten beschränkt.

Jede Spalte muss einen unterstützten Datentyp für Spaltenspeicherindizes aufweisen. Eine Liste der unterstützten Datentypen finden Sie unter "Einschränkungen und Einschränkungen ".

AUF [ database_name. [ schema_name ] . | schema_name . ] table_name

Gibt den 1-, zwei- oder dreiteiligen Namen der Tabelle an, die den Index enthält.

ORDER für nicht gruppierten Columnstore

Die in der ORDER Klausel für einen nicht gruppierten Columnstore-Index angegebenen Spalten müssen eine Teilmenge der Schlüsselspalten für den Index sein.

Verwenden Sie die column_store_order_ordinal Spalte in sys.index_columns , um die Reihenfolge der Spalten für einen nicht gruppierten Spaltenspeicherindex zu bestimmen. Spaltenspeicher-Sortierungshilfen bei der Segmententfernung, insbesondere bei Zeichenfolgendaten. Weitere Informationen finden Sie unter Leistungsoptimierung mit sortierten Columnstore-Indizes und Columnstore-Indizes – Entwurfsanleitungen. Entwurfs- und Leistungsüberlegungen in diesen Artikeln gelten in der Regel sowohl für gruppierte als auch für nicht gruppierte Spaltenspeicherindizes.

Lob-Datentypen (die Datentypen der maximalen Länge) können nicht der Schlüssel eines sortierten nicht gruppierten Spaltenspeicherindex sein.

Verwenden Sie beim Erstellen eines geordneten, nicht gruppierten Columnstore-Index die MAXDOP = 1 Optionen für die sortierung höchster Qualität im Austausch für eine wesentlich längere Dauer der CREATE INDEX Anweisung. Wenn Sie den Index so schnell wie möglich erstellen möchten, beschränken MAXDOPSie sich nicht. Die höchste Qualität der Komprimierung und Sortierung kann Abfragen im Spaltenspeicherindex unterstützen.

Informationen zur Verfügbarkeit des geordneten Spaltenspeicherindexes finden Sie unter Verfügbarkeit des geordneten Spaltenspeicherindexes.

WITH-Optionen

DROP_EXISTING = { OFF | ON }

  • DROP_EXISTING = EIN

    Der vorhandene Index wird gelöscht und neu erstellt. Der angegebene Indexname muss mit einem derzeit vorhandenen Index identisch sein; Die Indexdefinition kann jedoch geändert werden. Sie können z. B. unterschiedliche Spalten oder Indexoptionen angeben.

  • DROP_EXISTING = AUS

    Wenn der angegebene Indexname bereits vorhanden ist, wird ein Fehler angezeigt. Der Indextyp kann nicht mithilfe von DROP_EXISTING geändert werden. In abwärtskompatibler Syntax entspricht WITH DROP_EXISTING with DROP_EXISTING = ON.

MAXDOP = max_degree_of_parallelism

Überschreibt die Serverkonfiguration: maximale Parallelitätskonfigurationsoption während des Indexvorgangs. Verwenden Sie MAXDOP, um die Anzahl der Prozessoren zu begrenzen, die in einer parallelen Planausführung verwendet werden. Das Maximum beträgt 64 Prozessoren.

max_degree_of_parallelism Werte können folgende Werte sein:

  • 1, was bedeutet, die parallele Plangenerierung zu unterdrücken.
  • >1, was bedeutet, die maximale Anzahl von Prozessoren, die in einem parallelen Indexvorgang verwendet werden, auf die angegebene Anzahl oder weniger auf der Grundlage der aktuellen Systemauslastung einzuschränken. Wenn z. B. MAXDOP = 4 ist, beträgt die Anzahl der verwendeten Prozessoren 4 oder weniger.
  • 0 (Standard), was bedeutet, die tatsächliche Anzahl von Prozessoren oder weniger basierend auf der aktuellen Systemauslastung zu verwenden.

Weitere Informationen finden Sie unter Konfigurieren von parallelen Indexvorgängen.

Note

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

ONLINE = [ON | AUS]
  • ON Gibt an, dass der Columnstore-Index online und verfügbar bleibt, während die neue Kopie des Index erstellt wird.
  • OFF Gibt an, dass der Index nicht für die Verwendung verfügbar ist, während die neue Kopie erstellt wird. In einem nicht gruppierten Index bleibt die Basistabelle verfügbar. Nur der nicht gruppierte Spaltenspeicherindex wird nicht verwendet, um Abfragen zu erfüllen, bis der neue Index abgeschlossen ist.
CREATE COLUMNSTORE INDEX ncci
    ON Sales.OrderLines(StockItemID, Quantity, UnitPrice, TaxRate) WITH (ONLINE = ON);
COMPRESSION_DELAY = 0 | Delay [ MINUTES ]

Gibt eine untere Grenze an, wie lange eine Zeile in einer Delta-Zeilengruppe verbleiben soll, bevor sie für die Migration zu einer komprimierten Zeilengruppe berechtigt ist. Angenommen, wenn eine Zeile 120 Minuten unverändert ist, ist diese Zeile für die Komprimierung in das Spaltenspeicherformat berechtigt.

Bei einem Spaltenspeicherindex auf datenträgerbasierten Tabellen wird der Zeitpunkt, zu dem eine Zeile eingefügt oder aktualisiert wurde, nicht nachverfolgt. Stattdessen wird die geschlossene Zeit der Delta-Zeilengruppe als Proxy für die Zeile verwendet. Die Standarddauer beträgt 0 Minuten. Eine Zeile wird nach 1 Millionen Zeilen in die Delta-Zeilengruppe migriert und als geschlossen markiert.

DATA_COMPRESSION

Gibt die Datenkomprimierungsoption für die angegebene Tabelle, Partitionsnummer oder den Bereich von Partitionen an. Gilt nur für Spaltenspeicherindizes, einschließlich nicht gruppierter und gruppierter Indizes. Die Optionen sind wie folgt:

  • COLUMNSTORE ist der Standardwert und gibt an, mit der leistungsstärksten Spaltenspeicherkomprimierung zu komprimieren. Diese Option ist die typische Wahl.
  • COLUMNSTORE_ARCHIVE komprimiert die Tabelle oder Partition weiter auf eine kleinere Größe. Sie können diese Option für die Archivierung oder für andere Situationen verwenden, die eine kleinere Speichergröße erfordern und mehr Zeit für Speicher und Abruf leisten können.

Weitere Informationen zur Komprimierung finden Sie unter Datenkomprimierung.

WO <filter_expression> [ UND <filter_expression> ]

Als Filter-Prädikat bezeichnet, gibt diese Option an, welche Zeilen in den Index aufgenommen werden sollen. SQL Server erstellt gefilterte Statistiken zu den Datenzeilen im gefilterten Index.

Das Filter-Prädikat verwendet einfache Vergleichslogik. Vergleiche, die Literale verwenden NULL , sind mit den Vergleichsoperatoren nicht zulässig. Verwenden Sie stattdessen die IS NULL Operatoren.IS NOT NULL

Hier sind einige Beispiele für Filter-Prädikate für die Production.BillOfMaterials Tabelle:

  • WHERE StartDate > '20000101' AND EndDate <= '20000630'
  • WHERE ComponentID IN (533, 324, 753)
  • WHERE StartDate IN ('20000404', '20000905') AND EndDate IS NOT NULL

Anleitungen zu gefilterten Indizes finden Sie unter Erstellen gefilterter Indizes.

EIN-Optionen

Die folgenden Optionen geben die Dateigruppen an, für die der Index erstellt wird.

partition_scheme_name ( column_name )

Gibt das Partitionsschema an, das die Dateigruppen definiert, auf die die Partitionen eines partitionierten Index zugeordnet werden. Das Partitionsschema muss innerhalb der Datenbank vorhanden sein, indem DAS CREATE PARTITION SCHEME ausgeführt wird.

column_name gibt die Spalte an, für die ein partitioniertes Index partitioniert wird. Diese Spalte muss mit dem Datentyp, der Länge und der Genauigkeit des Arguments der Partitionsfunktion übereinstimmen, die partition_scheme_name verwendet. column_name ist nicht auf die Spalten in der Indexdefinition beschränkt. Beim Partitionieren eines Columnstore-Indexes fügt das Datenbankmodul die Partitionierungsspalte als Spalte des Indexes hinzu, falls sie noch nicht angegeben ist.

Wenn die Tabelle partitioniert ist und partition_scheme_name oder Dateigruppe nicht angegeben werden, wird der Index im selben Partitionsschema platziert und verwendet dieselbe Partitionsspalte wie die zugrunde liegende Tabelle.

Ein Spaltenspeicherindex für eine partitionierte Tabelle muss partitioniert ausgerichtet sein. Weitere Informationen zum Partitionieren von Indizes finden Sie unter Partitionierte Tabellen und Indizes.

filegroup_name

Gibt einen Dateinamen an, für den der Index erstellt werden soll. Wenn filegroup_name nicht angegeben ist und die Tabelle nicht partitioniert ist, verwendet der Index dieselbe Dateigruppe wie die zugrunde liegende Tabelle. Die Dateigruppe muss bereits vorhanden sein.

"default"

Erstellt den angegebenen Index in der Standarddateigruppe.

Der Ausdrucksstandard ist in diesem Kontext kein Schlüsselwort. Es handelt sich um einen Bezeichner für die Standarddateigruppe und muss wie in ON "default" oder ON [default]. Wenn "default" angegeben, muss die Option QUOTED_IDENTIFIER für die aktuelle Sitzung aktiviert sein, bei der es sich um die Standardeinstellung handelt. Weitere Informationen finden Sie unter SET QUOTED_IDENTIFIER.

Permissions

Erfordert die Ändern-Berechtigung an der Tabelle.

Remarks

Sie können einen Spaltenspeicherindex für eine temporäre Tabelle erstellen. Wenn die Tabelle abgelegt oder die Sitzung beendet wird, wird der Index ebenfalls gelöscht.

In der Fabric SQL-Datenbank werden Tabellen mit gruppierten Columnstore-Indizes nicht in Fabric OneLake gespiegelt.

Gefilterte Indizes

Ein gefilterter Index ist ein optimierter, nicht gruppierter Index, der für Abfragen geeignet ist, die einen kleinen Prozentsatz von Zeilen aus einer Tabelle auswählen. Es verwendet ein Filter-Prädikat, um einen Teil der Daten in der Tabelle zu indizieren. Ein gut gestalteter gefilterter Index kann die Abfrageleistung verbessern, die Speicherkosten reduzieren und Wartungskosten reduzieren.

Erforderliche SET-Optionen für gefilterte Indizes

Die SET-Optionen in der erforderlichen Wertspalte sind erforderlich, wenn eine der folgenden Bedingungen auftritt:

  • Sie erstellen einen gefilterten Index.
  • Ein INSERT-, UPDATE-, DELETE- oder MERGE-Vorgang ändert die Daten in einem gefilterten Index.
  • Der Abfrageoptimierer verwendet den gefilterten Index, um den Abfrageplan zu erstellen.
SET-Optionen Erforderlicher Wert Standardwert des Servers Standardmäßiger OLE DB- und ODBC-Wert Standardwert für DB-Library
ANSI_NULLS ON ON ON OFF
ANSI_PADDING ON ON ON OFF
ANSI_WARNINGS 1 ON ON ON OFF
ARITHABORT ON ON OFF OFF
CONCAT_NULL_YIELDS_NULL ON ON ON OFF
NUMERIC_ROUNDABORT OFF OFF OFF OFF
QUOTED_IDENTIFIER ON ON ON OFF

1 Festlegen ANSI_WARNINGS auf ON implizit ARITHABORT auf EIN, wenn die Datenbankkompatibilitätsebene auf 90 oder höher festgelegt ist. Wenn die Datenbankkompatibilitätsebene auf 80 oder früher festgelegt ist, müssen Sie die ARITHABORT-Option explizit auf EIN festlegen.

Wenn die SET-Optionen falsch sind, können die folgenden Bedingungen auftreten:

  • Der gefilterte Index wird nicht erstellt.

  • Das Datenbankmodul generiert einen Fehler und setzt INSERT-, UPDATE-, DELETE- oder MERGE-Anweisungen zurück, die Daten im Index ändern.

  • Der Abfrageoptimierer berücksichtigt nicht den Index im Ausführungsplan für Transact-SQL-Anweisungen.

Weitere Informationen zu gefilterten Indizes finden Sie unter Erstellen gefilterter Indizes.

Einschränkungen

Jede Spalte in einem Spaltenspeicherindex muss einen der folgenden allgemeinen Geschäftsdatentypen aufweisen:

  • Datetimeoffset [ ( n ) ]
  • datetime2 [ ( n ) ]
  • datetime
  • smalldatetime
  • date
  • Zeit [ ( n ) ]
  • float [ (n ) ]
  • real [ ( n ) ]
  • Dezimalzahl [ ( Genauigkeit [ , Skalierung ] )
  • numerisch [ ( Genauigkeit [ , Skalierung ] )
  • money
  • smallmoney
  • bigint
  • int
  • smallint
  • tinyint
  • bit
  • nvarchar [ ( n ) ]
  • nvarchar(max)1
  • nchar [ ( n ) ]
  • Varchar [ ( n ) ]
  • varchar(max)1
  • char [ ( n ) ]
  • Varbinär [ ( n ) ]
  • varbinary(max)1
  • binär [ ( n ) ]
  • uniqueidentifier2

1 Gilt für SQL Server 2017 (14.x) und Azure SQL-Datenbank auf Premium-Ebene, Standardebene (S3 und höher) und alle vCore-Angebotsebenen nur in gruppierten Spaltenspeicherindizes.

2 Gilt für SQL Server 2014 (12.x) und höhere Versionen.

Wenn die zugrunde liegende Tabelle eine Spalte eines Datentyps aufweist, der für Spaltenspeicherindizes nicht unterstützt wird, müssen Sie diese Spalte aus dem nicht gruppierten Columnstore-Index weglassen.

Große Objektdaten (LOB), die größer als 8 KB sind, werden in außerhalb des Zeilenspeichers gespeichert, lob storage, mit nur einem Zeiger auf den physischen Speicherort, der im Spaltensegment gespeichert ist. Die Größe der gespeicherten Daten wird nicht in sys.column_store_segments, sys.column_store_dictionaries oder sys.dm_db_column_store_row_group_physical_stats gemeldet.

Spalten, die einen der folgenden Datentypen verwenden, können nicht in einen Spaltenspeicherindex eingeschlossen werden:

  • ntext, Text und Bild
  • nvarchar(max),varchar(max) und varbinär(max)1
  • rowversion (und Timestamp)
  • sql_variant
  • CLR-Typen (hierarchieid und räumliche Typen)
  • xml
  • uniqueidentifier2

1 Gilt für SQL Server 2016 (13.x) und frühere Versionen und nicht gruppierte Spaltenspeicherindizes.

2 Gilt für SQL Server 2012 (11.x).

Nicht gruppierte Spaltenspeicherindizes:

  • Darf nicht mehr als 1.024 Spalten enthalten.
  • Kann nicht als einschränkungsbasierter Index erstellt werden. Es ist möglich, eindeutige Einschränkungen, Primärschlüsseleinschränkungen und Fremdschlüsseleinschränkungen für eine Tabelle mit einem Spaltenspeicherindex zu haben. Einschränkungen werden immer mit einem Zeilenspeicherindex erzwungen. Einschränkungen können nicht mit einem Spaltenspeicherindex (gruppiert oder nicht gruppiert) erzwungen werden.
  • Es kann keine spalte mit geringem Text eingeschlossen werden.
  • Kann nicht mithilfe der ALTER INDEX-Anweisung geändert werden. Um den nicht gruppierten Index zu ändern, müssen Sie stattdessen den Spaltenspeicherindex ablegen und erneut erstellen. Sie können ALTER INDEX verwenden, um einen Spaltenspeicherindex zu deaktivieren und neu zu erstellen.
  • Kann nicht mithilfe des INCLUDE-Schlüsselworts erstellt werden.
  • Die Schlüsselwörter in ASC der Liste der Indexspalten können nicht angegeben DESC werden. Columnstore-Indizes werden entsprechend den Komprimierungsalgorithmen sortiert.
  • In Azure SQL Database können SQL-Datenbanken in Microsoft Fabric, Azure SQL Managed InstanceAUTD und SQL Server 2025 (17.x) durch Einbindung der Klausel ORDER geordnet werden. Weitere Informationen finden Sie unter Leistungsoptimierung mit geordneten Columnstore-Indizes.
  • Lobspalten vom Typ "nvarchar(max)", "varchar(max)" und "varbinary(max)" können nicht in nicht gruppierte Columnstore-Indizes eingeschlossen werden. Nur gruppierte Columnstore-Indizes unterstützen branchenspezifische Typen, beginnend mit der SQL Server 2017 (14.x)-Version, der Azure SQL-Datenbank (konfiguriert auf Premium-Ebene, Standardebene (S3 und höher) und allen vCore-Angebotsebenen. In früheren Versionen werden branchenspezifische Typen in gruppierten und nicht gruppierten Spaltenspeicherindizes nicht unterstützt.
  • Ab SQL Server 2016 (13.x) können Sie einen nicht gruppierten Spaltenspeicherindex in einer indizierten Ansicht erstellen.

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

  • Berechnete Spalten. Ab SQL Server 2017 (14.x) kann ein gruppierter Spaltenspeicherindex eine nicht persistente berechnete Spalte enthalten. In SQL Server 2017 (14.x) können gruppierte Spaltenspeicherindizes jedoch keine gespeicherten berechneten Spalten enthalten, und Sie können keine nicht gruppierten Indizes für berechnete Spalten erstellen.
  • Seiten- und Zeilenkomprimierung und das Vardecimal-Speicherformat . (Ein Spaltenspeicherindex ist bereits in einem anderen Format komprimiert.)
  • Replikation mit gruppierten Columnstore-Indizes. Nicht gruppierte Spaltenspeicherindizes werden unterstützt. Weitere Informationen finden Sie unter sp_addarticle.
  • Filestream.

Sie können keine Cursor oder Trigger für eine Tabelle mit einem gruppierten Spaltenspeicherindex verwenden. Diese Einschränkung gilt nicht für nicht gruppierte Spaltenspeicherindizes. Sie können Cursor und Trigger für eine Tabelle mit einem nicht gruppierten Spaltenspeicherindex verwenden.

Spezifische Einschränkungen für SQL Server 2014 (12.x):

Die folgenden Einschränkungen gelten nur für SQL Server 2014 (12.x). In dieser Version können Sie aktualisierbare, gruppierte Spaltenspeicherindizes verwenden. Nicht gruppierte Spaltenspeicherindizes sind weiterhin schreibgeschützt.

  • Änderungsnachverfolgung. Sie können die Änderungsnachverfolgung nicht mit Spaltenspeicherindizes verwenden.
  • Ändern der Datenerfassung. Dieses Feature kann für Tabellen mit einem gruppierten Spaltenspeicherindex nicht aktiviert werden. Ab SQL Server 2016 (13.x) kann die Datenerfassung für Tabellen mit einem nicht gruppierten Spaltenspeicherindex aktiviert werden.
  • Lesbar sekundär. Sie können nicht über eine lesbare sekundäre Sekundärseite einer alwaysOn-lesbaren Verfügbarkeitsgruppe auf einen gruppierten Columnstore-Index (CCI) zugreifen. Sie können auf einen nicht gruppierten Columnstore-Index (NCCI) aus einem lesbaren sekundären Index zugreifen.
  • Mehrere aktive Resultsets (MARS). SQL Server 2014 (12.x) verwendet dieses Feature für schreibgeschützte Verbindungen mit Tabellen mit einem Columnstore-Index. Sql Server 2014 (12.x) unterstützt dieses Feature jedoch nicht für gleichzeitige DML-Vorgänge (Data Manipulation Language) für eine Tabelle mit einem Spaltenspeicherindex. Wenn Sie versuchen, das Feature für diesen Zweck zu verwenden, beendet SQL Server die Verbindungen und bricht die Transaktionen ab.
  • Nicht gruppierte Spaltenspeicherindizes können nicht in einer Ansicht oder indizierten Ansicht erstellt werden.

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

Metadata

Alle Spalten in einem Columnstore-Index werden in den Metadaten als eingeschlossene Spalten gespeichert. Der Columnstore-Index hat keine Schlüsselspalten. Die folgenden Systemansichten enthalten Informationen zu Spaltenspeicherindizes:

Beispiele: Konvertieren einer Tabelle aus "rowstore" in "columnstore"

A. Konvertieren eines Heaps in einen gruppierten Spaltenspeicherindex

In diesem Beispiel wird eine Tabelle als Heap erstellt und anschließend in einen gruppierten Spaltenspeicherindex mit dem Namen cci_Simplekonvertiert. Die Erstellung des gruppierten Columnstore-Index ändert den Speicher für die gesamte Tabelle von Rowstore in Columnstore.

CREATE TABLE dbo.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 dbo.SimpleTable;
GO

B. Konvertieren eines gruppierten Indexes in einen gruppierten Columnstore-Index mit demselben Namen

In diesem Beispiel wird eine Tabelle mit gruppiertem Index erstellt und anschließend die Syntax der Konvertierung des gruppierten Indexes in einen gruppierten Columnstore-Index veranschaulicht. Die Erstellung des gruppierten Columnstore-Index ändert den Speicher für die gesamte Tabelle von Rowstore in Columnstore.

CREATE TABLE dbo.SimpleTable2
(
    ProductKey INT NOT NULL,
    OrderDateKey INT NOT NULL,
    DueDateKey INT NOT NULL,
    ShipDateKey INT NOT NULL
);
GO

CREATE CLUSTERED INDEX cl_simple
    ON dbo.SimpleTable2(ProductKey);
GO

CREATE CLUSTERED COLUMNSTORE INDEX cl_simple
    ON dbo.SimpleTable2 WITH (DROP_EXISTING = ON);
GO

C. Behandeln von nicht gruppierten Indizes beim Konvertieren einer Rowstore-Tabelle in einen Columnstore-Index

In diesem Beispiel wird gezeigt, wie nicht gruppierte Indizes behandelt werden, wenn Sie eine Rowstore-Tabelle in einen Columnstore-Index konvertieren. Ab SQL Server 2016 (13.x) ist keine spezielle Aktion erforderlich. SQL Server definiert und erstellt die nicht gruppierten Indizes automatisch im neuen gruppierten Spaltenspeicherindex neu.

Wenn Sie die nicht gruppierten Indizes ablegen möchten, verwenden Sie die DROP INDEX-Anweisung, bevor Sie den Columnstore-Index erstellen. Die DROP EXISTING-Option legt nur den gruppierten Index ab, der konvertiert wird. Die nicht gruppierten Indizes werden nicht abgelegt.

In SQL Server 2012 (11.x) und SQL Server 2014 (12.x) können Sie keinen nicht gruppierten Index für einen Spaltenspeicherindex erstellen.

--Create the table for use with this example.
CREATE TABLE dbo.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 dbo.SimpleTable(OrderDateKey);
CREATE INDEX nc2_simple ON dbo.SimpleTable(DueDateKey);
GO

Nur für SQL Server 2012 (11.x) und SQL Server 2014 (12.x) müssen Sie die nicht gruppierten Indizes ablegen, um den Spaltenspeicherindex zu erstellen.

DROP INDEX dbo.SimpleTable.nc1_simple;
DROP INDEX dbo.SimpleTable.nc2_simple;

--Convert the rowstore table to a columnstore index.
CREATE CLUSTERED COLUMNSTORE INDEX cci_simple
    ON dbo.SimpleTable;
GO

D. Konvertieren einer großen Faktentabelle aus rowstore in columnstore

In diesem Beispiel wird erläutert, wie eine große Faktentabelle aus einer Rowstore-Tabelle in eine Columnstore-Tabelle konvertiert wird.

  1. Erstellen Sie eine kleine Tabelle, die in diesem Beispiel verwendet werden soll.

    --Create a rowstore table with a clustered index and a nonclustered index.
    CREATE TABLE dbo.MyFactTable
    (
        ProductKey INT NOT NULL,
        OrderDateKey INT NOT NULL,
        DueDateKey INT NOT NULL,
        ShipDateKey INT NOT NULL INDEX IDX_CL_MyFactTable CLUSTERED (ProductKey)
    );
    
    --Add a nonclustered index.
    CREATE INDEX my_index
        ON dbo.MyFactTable(ProductKey, OrderDateKey);
    
  2. Legen Sie alle nicht gruppierten Indizes aus der Rowstore-Tabelle ab. Möglicherweise möchten Sie die Indizes erstellen, um sie später erneut zu erstellen.

    --Drop all nonclustered indexes
    DROP INDEX my_index
        ON dbo.MyFactTable;
    
  3. Konvertieren Sie die Rowstore-Tabelle in eine Columnstore-Tabelle mit einem gruppierten Spaltenspeicherindex.

    Suchen Sie zunächst nach dem Namen des vorhandenen gruppierten Rowstore-Indexes. In Schritt 1 legen wir den Namen des Indexes auf IDX_CL_MyFactTable. Wenn der Indexname nicht angegeben wurde, erhält er einen automatisch generierten eindeutigen Indexnamen. Sie können den automatisch generierten Namen mit der folgenden Beispielabfrage abrufen:

    SELECT i.object_id,
           i.name,
           t.object_id,
           t.name
    FROM sys.indexes AS i
         INNER JOIN sys.tables AS t
             ON i.object_id = t.object_id
    WHERE i.type_desc = 'CLUSTERED'
          AND t.name = 'MyFactTable';
    

    Option 1: Legen Sie den vorhandenen gruppierten Index IDX_CL_MyFactTableab, und konvertieren Sie in MyFactTable den Spaltenspeicher. Ändern Sie den Namen des neuen gruppierten Spaltenspeicherindex.

    --Drop the clustered rowstore index.
    DROP INDEX [IDX_CL_MyFactTable]
        ON dbo.MyFactTable;
    GO
    
    --Create a new clustered columnstore index with the name MyCCI.
    CREATE CLUSTERED COLUMNSTORE INDEX IDX_CCL_MyFactTable
        ON dbo.MyFactTable;
    GO
    

    Option 2: In Columnstore konvertieren und den vorhandenen Clusterindexnamen des Rowstores wiederverwenden.

    --Create the clustered columnstore index,
    --replacing the existing rowstore clustered index of the same name
    CREATE CLUSTERED COLUMNSTORE INDEX [IDX_CL_MyFactTable]
        ON dbo.MyFactTable WITH (DROP_EXISTING = ON);
    

E. Konvertieren einer Columnstore-Tabelle in eine Rowstore-Tabelle mit einem gruppierten Index

Wenn Sie eine Columnstore-Tabelle in eine Rowstore-Tabelle mit einem gruppierten Index konvertieren möchten, verwenden Sie die CREATE INDEX-Anweisung mit der Option DROP_EXISTING.

CREATE CLUSTERED INDEX [IDX_CL_MyFactTable]
    ON dbo.[MyFactTable](ProductKey) WITH (DROP_EXISTING = ON);

F. Konvertieren einer Columnstore-Tabelle in einen Rowstore-Heap

Wenn Sie eine Columnstore-Tabelle in einen Rowstore-Heap konvertieren möchten, legen Sie den Gruppierten Spaltenspeicherindex ab. Dies wird in der Regel nicht empfohlen, kann aber einige schmale Verwendungen haben. Weitere Informationen zu Heaps finden Sie unter Heaps (Tabellen ohne gruppierte Indizes).For more information about heaps, see Heaps (tables without clustered indexes).

DROP INDEX [IDX_CL_MyFactTable]
    ON dbo.[MyFactTable];

G. Defragment durch Neuorganisieren des Columnstore-Indexes

Es gibt zwei Möglichkeiten, den Gruppierten Spaltenspeicherindex beizubehalten. Verwenden Sie ab SQL Server 2016 (13.x) ALTER INDEX...REORGANIZE anstelle von NEUERSTELLUNG. Weitere Informationen finden Sie unter Columnstore-Indexzeilengruppe. In früheren Versionen von SQL Server können Sie CREATE CLUSTERED COLUMNSTORE INDEX mit DROP_EXISTING=ON oder ALTER INDEX und der OPTION "NEUERSTELLUNG" verwenden. Beide Methoden haben die gleichen Ergebnisse erzielt.

Bestimmen Sie zunächst den Indexnamen des gruppierten Spaltenspeichers in MyFactTable.

SELECT i.object_id,
       i.name,
       t.object_id,
       t.name
FROM sys.indexes AS i
     INNER JOIN sys.tables AS t
         ON i.object_id = t.object_id
WHERE i.type_desc = 'CLUSTERED COLUMNSTORE'
      AND t.name = 'MyFactTable';

Entfernen Sie Fragmentierung, indem Sie eine REORGANIZE im Columnstore-Index ausführen.

--Rebuild the entire index by using ALTER INDEX and the REBUILD option.
ALTER INDEX IDX_CL_MyFactTable
    ON dbo.[MyFactTable] REORGANIZE;

Beispiele für nicht gruppierte Spaltenspeicherindizes

A. Erstellen eines Columnstore-Indexes als sekundärer Index in einer Rowstore-Tabelle

In diesem Beispiel wird ein nicht gruppierter Columnstore-Index in einer Rowstore-Tabelle erstellt. In dieser Situation kann nur ein Spaltenspeicherindex erstellt werden. Der Spaltenspeicherindex erfordert zusätzlichen Speicher, da er eine Kopie der Daten in der Rowstore-Tabelle enthält. In diesem Beispiel wird eine einfache Tabelle und ein gruppierter Zeilenspeicherindex erstellt. Anschließend wird die Syntax des Erstellens eines nicht gruppierten Spaltenspeicherindex veranschaulicht.

CREATE TABLE dbo.SimpleTable
(
    ProductKey INT NOT NULL,
    OrderDateKey INT NOT NULL,
    DueDateKey INT NOT NULL,
    ShipDateKey INT NOT NULL
);
GO

CREATE CLUSTERED INDEX cl_simple
    ON dbo.SimpleTable(ProductKey);
GO

CREATE NONCLUSTERED COLUMNSTORE INDEX csindx_simple
    ON dbo.SimpleTable(OrderDateKey, DueDateKey, ShipDateKey);
GO

B. Erstellen eines einfachen nicht gruppierten Columnstore-Index mithilfe aller Optionen

Im folgenden Beispiel wird die Syntax des Erstellens eines nicht gruppierten Columnstore-Indexes für die DEFAULT-Dateigruppe veranschaulicht, wobei der maximale Grad an Parallelität (MAXDOP) als 2 angegeben wird.

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

C. Erstellen eines nicht gruppierten Columnstore-Indexes mit einem gefilterten Prädikat

Im folgenden Beispiel wird ein gefilterter, nicht gruppierter Spaltenspeicherindex für die Tabelle in der Production.BillOfMaterialsAdventureWorks2025 Beispieldatenbank erstellt. Das Filter-Prädikat kann Spalten enthalten, die keine Schlüsselspalten im gefilterten Index sind. Das Prädikat in diesem Beispiel markiert nur die Zeilen, bei denen EndDate es sich nicht um NULL handelt.

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. Ändern der Daten in einem nicht gruppierten Spaltenspeicherindex

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

Nachdem Sie in SQL Server 2014 (12.x) und früheren Versionen einen nicht gruppierten Spaltenspeicherindex für eine Tabelle erstellt haben, können Sie die Daten in dieser Tabelle nicht direkt ändern. Eine Abfrage mit INSERT, UPDATE, DELETE oder MERGE schlägt fehl und gibt eine Fehlermeldung zurück. Hier sind Optionen, mit denen Sie die Daten in der Tabelle hinzufügen oder ändern können:

  • Deaktivieren oder ablegen Sie den Spaltenspeicherindex. Anschließend können Sie die Daten in der Tabelle aktualisieren. Wenn Sie den Columnstore-Index deaktivieren, können Sie den Columnstore-Index neu erstellen, wenn Sie die Aktualisierung der Daten abgeschlossen haben. Beispiel:

    ALTER INDEX mycolumnstoreindex
        ON dbo.mytable DISABLE;
    
    -- update the data in mytable as necessary
    ALTER INDEX mycolumnstoreindex
        ON dbo.mytable REBUILD;
    
  • Laden Sie Daten in eine Stagingtabelle, die keinen Spaltenspeicherindex enthält. Erstellen Sie einen Columnstore-Index in der Stagingtabelle. Verschieben Sie die Stagingtabelle in eine leere Partition der Haupttabelle.

  • Verschieben Sie eine Partition aus der Tabelle, die den Columnstore-Index enthält, in eine leere Stagingtabelle. Wenn in der Stagingtabelle ein Columnstore-Index vorhanden ist, deaktivieren Sie den Columnstore-Index. Führen Sie alle Aktualisierungen aus. Erstellen (oder neu erstellen) Sie den Columnstore-Index. Verschieben Sie die Stagingtabelle zurück in die (jetzt leere) Partition der Haupttabelle.

Beispiele: Azure Synapse Analytics, Analytics Platform System (PDW)

A. Ändern eines gruppierten Indexes in einen gruppierten Spaltenspeicherindex

Mithilfe der CREATE CLUSTERED COLUMNSTORE INDEX-Anweisung mit DROP_EXISTING = ON können Sie:

  • Ändern Sie einen gruppierten Index in einen gruppierten Columnstore-Index.

  • Erstellen Sie einen gruppierten Spaltenspeicherindex neu.

In diesem Beispiel wird die xDimProduct Tabelle als Rowstore-Tabelle mit einem gruppierten Index erstellt. Anschließend wird im Beispiel CREATE CLUSTERED COLUMNSTORE INDEX verwendet, um die Tabelle aus einer Rowstore-Tabelle in eine Columnstore-Tabelle zu ändern.

-- 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;

Suchen Sie anhand der Systemmetadaten automatisch den Namen des gruppierten Indexes, der für die neue Tabelle in den Systemmetadaten sys.indexeserstellt wurde. Beispiel:

SELECT i.object_id,
       i.name,
       t.object_id,
       t.name,
       i.type_desc
FROM sys.indexes AS i
     INNER JOIN sys.tables AS t
         ON i.object_id = t.object_id
WHERE i.type_desc = 'CLUSTERED'
      AND t.name = 'xdimProduct';

Jetzt können Sie folgendes auswählen:

  1. Legen Sie den vorhandenen gruppierten Spaltenspeicherindex mit einem automatisch erstellten Namen ab, und erstellen Sie dann einen neuen gruppierten Spaltenspeicherindex mit einem benutzerdefinierten Namen.
  2. Legen Sie den vorhandenen Index durch einen gruppierten Columnstore-Index ab, und ersetzen Sie denselben vom System generierten Namen, z ClusteredIndex_1bd8af8797f7453182903cc68df48541. B. .

Beispiel:

--1. DROP the existing clustered columnstore index with an automatically-created name, for example:
DROP INDEX ClusteredIndex_1bd8af8797f7453182903cc68df48541
    ON xdimProduct;
GO

CREATE CLUSTERED COLUMNSTORE INDEX [<new_index_name>]
    ON xdimProduct;
GO

--Or,
--2. Change the existing clustered index to a clustered columnstore index with the same name.
CREATE CLUSTERED COLUMNSTORE INDEX [ClusteredIndex_1bd8af8797f7453182903cc68df48541]
    ON xdimProduct WITH (DROP_EXISTING = ON);
GO

B. Neuerstellen eines gruppierten Spaltenspeicherindexes

Basierend auf dem vorherigen Beispiel wird in diesem Beispiel CREATE CLUSTERED COLUMNSTORE INDEX verwendet, um den vorhandenen gruppierten Spaltenspeicherindex neu zu erstellen, der aufgerufen wird cci_xDimProduct.

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

C. Ändern des Namens eines gruppierten Spaltenspeicherindexes

Wenn Sie den Namen eines gruppierten Spaltenspeicherindex ändern möchten, legen Sie den vorhandenen gruppierten Spaltenspeicherindex ab, und erstellen Sie dann den Index mit einem neuen Namen neu.

Es wird empfohlen, diesen Vorgang auf eine kleine oder leere Tabelle zu beschränken. Es dauert lange, einen großen, gruppierten Spaltenspeicherindex abzulegen und mit einem anderen Namen neu zu erstellen.

In diesem Beispiel wird auf den cci_xDimProduct Gruppierten Columnstore-Index aus dem vorherigen Beispiel verwiesen. In diesem Beispiel wird der cci_xDimProduct Gruppierte Columnstore-Index abgelegt, und anschließend wird der Gruppierte Spaltenspeicherindex mit dem Namen mycci_xDimProductneu erstellt.

--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. Konvertieren einer Columnstore-Tabelle in eine Rowstore-Tabelle mit einem gruppierten Index

Es kann eine Situation geben, für die Sie einen gruppierten Spaltenspeicherindex ablegen und einen gruppierten Index erstellen möchten. Wenn Sie einen gruppierten Columnstore-Index ablegen, wird die Tabelle in das Rowstore-Format geändert. In diesem Beispiel wird eine Columnstore-Tabelle in eine Rowstore-Tabelle mit einem gruppierten Index mit demselben Namen konvertiert. Keine der Daten geht verloren. Alle Daten werden zur Rowstore-Tabelle, und die aufgelisteten Spalten werden zu den Schlüsselspalten im gruppierten 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. Konvertieren einer Columnstore-Tabelle zurück in einen Rowstore-Heap

Verwenden Sie DROP INDEX , um den Gruppierten Spaltenspeicherindex abzulegen und die Tabelle in einen Rowstore-Heap zu konvertieren. In diesem Beispiel wird die cci_xDimProduct Tabelle in einen Rowstore-Heap konvertiert. Die Tabelle wird weiterhin verteilt, aber als Heap gespeichert.

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

F. Erstellen eines gruppierten Spaltenspeicherindexes für eine Tabelle ohne Index

Ein ungeordneter Spaltenspeicherindex deckt standardmäßig alle Spalten ab, ohne eine Spaltenliste angeben zu müssen. Mit einem sortierten Spaltenspeicherindex können Sie die Reihenfolge der Spalten angeben. Die Liste muss nicht alle Spalten enthalten.

Weitere Informationen finden Sie unter Leistungsoptimierung mit geordneten Columnstore-Indizes.

CREATE CLUSTERED COLUMNSTORE INDEX cci
    ON Sales.OrderLines ORDER(SHIPDATE);

G. Konvertieren eines gruppierten Spaltenspeicherindex in einen sortierten gruppierten Spaltenspeicherindex

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

H. Hinzufügen einer Spalte zur Reihenfolge eines gruppierten Spaltenspeicherindexes

Sie können eine Reihenfolge für die Spalten in einem Columnstore-Index angeben. Der ursprüngliche sortierte, gruppierte Spaltenspeicherindex wurde nur für die SHIPDATE Spalte sortiert. Im folgenden Beispiel wird der Sortierung die PRODUCTKEY Spalte hinzugefügt. Die Verfügbarkeit des sortierten Columnstore-Index finden Sie unter Columnstore-Indizes: Übersicht.

CREATE CLUSTERED COLUMNSTORE INDEX cci
    ON Sales.OrderLines ORDER(SHIPDATE, PRODUCTKEY) WITH (DROP_EXISTING = ON);

I. Ändern der Ordnungszahl sortierter Spalten

Der ursprüngliche sortierte, gruppierte Spaltenspeicherindex wurde sortiert am SHIPDATE, PRODUCTKEY. Im folgenden Beispiel wird die Sortierung in PRODUCTKEY, SHIPDATE. Die Verfügbarkeit des sortierten Columnstore-Index finden Sie unter Columnstore-Indizes: Übersicht.

CREATE CLUSTERED COLUMNSTORE INDEX cci
    ON Sales.OrderLines ORDER(PRODUCTKEY, SHIPDATE) WITH (DROP_EXISTING = ON);

J. Erstellen eines gruppierten Spaltenspeicherindexes

Sie können einen gruppierten Columnstore-Index mit Sortierschlüsseln erstellen. Beim Erstellen eines gruppierten Spaltenspeicherindexes sollten Sie den Abfragehinweis MAXDOP = 1 auf maximale Sortierqualität und kürzeste Dauer anwenden. Die Verfügbarkeit des sortierten Columnstore-Index finden Sie unter Columnstore-Indizes: Übersicht.

CREATE CLUSTERED COLUMNSTORE INDEX [OrderedCCI]
    ON dbo.FactResellerSalesPartCategoryFull ORDER(EnglishProductSubcategoryName, EnglishProductName) WITH (MAXDOP = 1, DROP_EXISTING = ON);