Delen via


CREATE COLUMNSTORE INDEX (Transact-SQL)

van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL-database in Microsoft Fabric

Converteer een rowstore-tabel naar een geclusterde columnstore-index of maak een niet-geclusterde columnstore-index. Gebruik een columnstore-index om realtime operationele analyses efficiënt uit te voeren op een OLTP-workload of om gegevenscompressie en queryprestaties voor datawarehousingworkloads te verbeteren.

Volg Wat is er nieuw in columnstore-indexen voor de nieuwste verbeteringen in deze functie.

Transact-SQL syntaxisconventies

Syntaxis

Syntaxis voor Azure SQL Database en Azure SQL Managed Instance met het Always-up-to-date update policy:

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

Syntaxis voor 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 ] )
    [ 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 )

Syntaxis voor Azure Synapse Analytics en 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
[;]

Beschikbaarheid van versie

Sommige opties zijn niet beschikbaar in alle versies van de database-engine. In de volgende tabel ziet u de versies wanneer de opties worden geïntroduceerd in geclusterde columnstore- en niet-geclusterde columnstore-indexen:

Optie GECLUSTERDE NIET-GECLUSTERD
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-component N.V.T SQL Server 2016 (13.x)
ORDER-component SQL Server 2016 (13.x) N.V.T

Alle opties zijn beschikbaar in Azure SQL Database en Azure SQL Managed Instance met het Always-up-to-date update policy.

Zie Wat is er nieuw in columnstore-indexenvoor meer informatie over de beschikbaarheid van functies.

Argumenten

GECLUSTERDE COLUMNSTORE-INDEX MAKEN

Maak een geclusterde columnstore-index waarin alle gegevens worden gecomprimeerd en opgeslagen per kolom. De index bevat alle kolommen in de tabel en slaat de hele tabel op. Als de bestaande tabel een heap- of geclusterde index is, wordt deze geconverteerd naar een geclusterde columnstore-index. Als de tabel al is opgeslagen als een geclusterde columnstore-index, wordt de bestaande index verwijderd en opnieuw opgebouwd.

index_name

Hiermee geeft u de naam voor de nieuwe index.

Als de tabel al een geclusterde columnstore-index heeft, kunt u dezelfde naam opgeven als de bestaande index, of u kunt de optie DROP EXISTING gebruiken om een nieuwe naam op te geven.

AAN [ database_name. [ schema_name ] . | schema_name . ] table_name

Hiermee geeft u de een-, twee- of driedelige naam van de tabel op die moet worden opgeslagen als een geclusterde columnstore-index. Als de tabel een heap is of een geclusterde index heeft, wordt de tabel geconverteerd van een rowstore naar een columnstore. Als de tabel al een columnstore is, wordt met deze instructie de geclusterde columnstore-index opnieuw opgebouwd.

ORDER voor gegroepeerde columnstore

Gebruik de kolom column_store_order_ordinal in sys.index_columns om de volgorde van de kolommen voor een geclusterde columnstore-index te bepalen. Columnstore bestelhulpmiddelen met segmentverwijdering, met name met tekenreeksgegevens. Zie Prestaties afstemmen met geordende columnstore-indexen en Columnstore-indexen - Ontwerprichtlijnenvoor meer informatie.

Als u wilt converteren naar een geordende geclusterde columnstore-index, moet de bestaande index een geclusterde columnstore-index zijn. Gebruik de optie DROP_EXISTING.

LOB-gegevenstypen (de maximale lengtegegevenstypen) kunnen niet de sleutel zijn van een geordende geclusterde columnstore-index.

Wanneer u een geordende geclusterde columnstore-index maakt, gebruikt u de optie MAXDOP = 1 voor het sorteren van de hoogste kwaliteit, in ruil voor een aanzienlijk langere duur van de CREATE INDEX instructie. Als u de index zo snel mogelijk wilt maken, beperkt u MAXDOP niet. De hoogste kwaliteit van compressie en sortering kan helpen bij query's op de columnstore-index.

Zie Columnstore-indexen voor de beschikbaarheid van geordende columnstore-indexen: Overzicht.

MET opties

DROP_EXISTING = [UIT] | OP

DROP_EXISTING = ON geeft aan om de bestaande index te verwijderen en een nieuwe columnstore-index te maken.

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

De standaardwaarde, DROP_EXISTING = UIT, verwacht dat de indexnaam gelijk is aan de bestaande naam. Er treedt een fout op als de opgegeven indexnaam al bestaat.

MAXDOP = max_degree_of_parallelism

Met deze optie kan de bestaande maximale mate van parallelle serverconfiguratie tijdens de indexbewerking worden overschreven. Gebruik MAXDOP om het aantal processors dat wordt gebruikt in een parallelle uitvoering van een plan te beperken. Het maximum is 64 processors.

max_degree_of_parallelism waarden kunnen het volgende zijn:

  • 1, wat betekent dat parallelle plangeneratie wordt onderdrukt.
  • >1, wat betekent dat het maximum aantal processors dat in een parallelle indexbewerking wordt gebruikt, beperkt tot het opgegeven aantal, of minder, op basis van de huidige systeemworkload. Wanneer MAXDOP = 4, is het aantal gebruikte processors bijvoorbeeld 4 of minder.
  • 0 (standaard), wat betekent dat het werkelijke aantal processors of minder moet worden gebruikt op basis van de huidige systeemworkload.
CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
WITH (MAXDOP = 2);

Zie Serverconfiguratie: maximale mate van parallelle uitvoeringen Parallelle indexbewerkingen configurerenvoor meer informatie.

COMPRESSION_DELAY = 0 | vertraging [ MINUTEN ]

Voor een tabel op basis van een schijf geeft vertraging het minimum aantal minuten aangeeft dat een deltarijgroep met de gesloten status in de deltarijgroep moet blijven. SQL Server kan deze vervolgens comprimeren in de gecomprimeerde rijgroep. Omdat op schijven gebaseerde tabellen geen invoeg- en updatetijden voor afzonderlijke rijen bijhouden, past SQL Server de vertraging toe op deltarijgroepen in de gesloten status.

De standaardwaarde is 0 minuten.

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

Zie Aan de slag met Columnstore voor realtime operationele analysesvoor aanbevelingen voor het gebruik van COMPRESSION_DELAY.

DATA_COMPRESSION = COLUMNSTORE | COLUMNSTORE_ARCHIVE

Hiermee geeft u de optie voor gegevenscompressie voor de opgegeven tabel, partitienummer of bereik van partities. De opties zijn als volgt:

  • COLUMNSTORE is de standaardinstelling en geeft aan om te comprimeren met de meest presterende columnstore-compressie. Deze optie is de gebruikelijke keuze.
  • COLUMNSTORE_ARCHIVE de tabel of partitie verder comprimeert naar een kleiner formaat. Gebruik deze optie voor situaties zoals archivering, waarvoor een kleinere opslaggrootte is vereist en meer tijd kan worden geboden voor opslag en ophalen.
CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
WITH ( DATA_COMPRESSION = COLUMNSTORE_ARCHIVE );

Zie Gegevenscompressievoor meer informatie over compressie.

ONLINE = [AAN | UIT]
  • ON geeft aan dat de columnstore-index online en beschikbaar blijft, terwijl de nieuwe kopie van de index wordt gebouwd.
  • OFF geeft aan dat de index niet beschikbaar is voor gebruik terwijl de nieuwe kopie wordt gebouwd.
CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
WITH ( ONLINE = ON );

AAN-opties

Met deze opties kunt u opties opgeven voor gegevensopslag, zoals een partitieschema, een specifieke bestandsgroep of de standaardbestandsgroep. Als de optie AAN niet is opgegeven, gebruikt de index de instellingenpartitie of bestandsgroepinstellingen van de bestaande tabel.

partition_scheme_name (column_name) geeft het partitieschema voor de tabel op. Het partitieschema moet al bestaan in de database. Zie CREATE PARTITION SCHEME (Transact-SQL)om het partitieschema te maken.

column_name geeft de kolom aan waarmee een gepartitioneerde index wordt gepartitioneerd. Deze kolom moet overeenkomen met het gegevenstype, de lengte en de precisie van het argument van de partitiefunctie die partition_scheme_name gebruikt.

filegroup_name geeft de bestandsgroep op voor het opslaan van de geclusterde columnstore-index. Als er geen locatie is opgegeven en de tabel niet is gepartitioneerd, gebruikt de index dezelfde bestandsgroep als de onderliggende tabel of weergave. De bestandsgroep moet al bestaan.

Als u de index voor de standaardbestandsgroep wilt maken, gebruikt u "default" of [default]. Als u "default"opgeeft, moet de optie QUOTED_IDENTIFIER worden ON voor de huidige sessie. QUOTED_IDENTIFIER is standaard ON. Zie set QUOTED_IDENTIFIER (Transact-SQL)voor meer informatie.

COLUMNSTORE-INDEX MAKEN [NIET GECLUSTERD]

Maak een niet-geclusterde columnstore-index in een rowstore-tabel die is opgeslagen als een heap- of geclusterde index. De index kan een gefilterde voorwaarde hebben en hoeft niet alle kolommen van de onderliggende tabel op te nemen. De columnstore-index vereist voldoende ruimte om een kopie van de gegevens op te slaan. U kunt de index bijwerken en deze wordt bijgewerkt wanneer de onderliggende tabel wordt gewijzigd. De niet-geclusterde columnstore-index op een geclusterde index maakt realtime analyse mogelijk.

index_name

Hiermee geeft u de naam van de index. index_name moet uniek zijn binnen de tabel, maar hoeft niet uniek te zijn binnen de database. Indexnamen moeten voldoen aan de regels van id's.

( kolom [ ,...n ] )

Hiermee geeft u de kolommen op die moeten worden opgeslagen. Een niet-geclusterde columnstore-index is beperkt tot 1024 kolommen.

Elke kolom moet van een ondersteund gegevenstype zijn voor columnstore-indexen. Zie beperkingen en beperkingen voor een lijst met de ondersteunde gegevenstypen.

AAN [ database_name. [ schema_name ] . | schema_name . ] table_name

Hiermee geeft u de een-, twee- of driedelige naam van de tabel die de index bevat.

ORDER voor niet-geclusterde columnstore

De kolommen die zijn opgegeven in de ORDER-component voor een niet-geclusterde columnstore-index, moeten een subset van de sleutelkolommen voor de index zijn.

Gebruik de column_store_order_ordinal kolom in sys.index_columns om de volgorde van de kolommen voor een niet-geclusterde columnstore-index te bepalen. Columnstore bestelhulpmiddelen met segmentverwijdering, met name met tekenreeksgegevens. Zie Prestaties afstemmen met geordende columnstore-indexen en Columnstore-indexen - Ontwerprichtlijnenvoor meer informatie. Ontwerp- en prestatieoverwegingen in deze artikelen zijn doorgaans van toepassing op zowel geclusterde als niet-geclusterde columnstore-indexen.

LOB-gegevenstypen (de maximale lengtegegevenstypen) kunnen niet de sleutel zijn van een geordende niet-geclusterde columnstore-index.

Wanneer u een geordende niet-geclusterde columnstore-index maakt, gebruikt u de MAXDOP = 1 opties voor sorteren van de hoogste kwaliteit, in ruil voor een aanzienlijk langere duur van de CREATE INDEX-instructie. Als u de index zo snel mogelijk wilt maken, beperkt u MAXDOPniet. De hoogste kwaliteit van compressie en sortering kan helpen bij query's op de columnstore-index.

Zie Beschikbaarheid van geordende kolomindexenvoor geordende beschikbaarheid van columnstore-indexen.

MET opties

DROP_EXISTING = [UIT] | OP

DROP_EXISTING = AAN De bestaande index wordt verwijderd en opnieuw opgebouwd. De opgegeven indexnaam moet hetzelfde zijn als een bestaande index; De indexdefinitie kan echter worden gewijzigd. U kunt bijvoorbeeld verschillende kolommen of indexopties opgeven.

DROP_EXISTING = UIT
Er wordt een fout weergegeven als de opgegeven indexnaam al bestaat. Het indextype kan niet worden gewijzigd met behulp van DROP_EXISTING. In achterwaarts compatibele syntaxis is WITH DROP_EXISTING gelijk aan WITH DROP_EXISTING = ON.

MAXDOP = max_degree_of_parallelism

Overschrijft de Server-configuratie: maximale mate van parallelle uitvoering configuratieoptie tijdens de indexbewerking. Gebruik MAXDOP om het aantal processors dat wordt gebruikt in een parallelle uitvoering van een plan te beperken. Het maximum is 64 processors.

max_degree_of_parallelism waarden kunnen het volgende zijn:

  • 1, wat betekent dat parallelle plangeneratie wordt onderdrukt.
  • >1, wat betekent dat het maximum aantal processors dat in een parallelle indexbewerking wordt gebruikt, beperkt tot het opgegeven aantal, of minder, op basis van de huidige systeemworkload. Wanneer MAXDOP = 4, is het aantal gebruikte processors bijvoorbeeld 4 of minder.
  • 0 (standaard), wat betekent dat het werkelijke aantal processors of minder moet worden gebruikt op basis van de huidige systeemworkload.

Zie Parallelle indexbewerkingen configurerenvoor meer informatie.

Notitie

Parallelle indexbewerkingen zijn niet beschikbaar in elke editie van Microsoft SQL Server. Zie -edities en ondersteunde functies van SQL Server 2022voor een lijst met functies die worden ondersteund door de edities van SQL Server.

ONLINE = [AAN | UIT]
  • ON geeft aan dat de columnstore-index online en beschikbaar blijft, terwijl de nieuwe kopie van de index wordt gebouwd.
  • OFF geeft aan dat de index niet beschikbaar is voor gebruik terwijl de nieuwe kopie wordt gebouwd. In een niet-geclusterde index blijft de basistabel beschikbaar. Alleen de niet-geclusterde columnstore-index wordt niet gebruikt om te voldoen aan query's totdat de nieuwe index is voltooid.
CREATE COLUMNSTORE INDEX ncci ON Sales.OrderLines (StockItemID, Quantity, UnitPrice, TaxRate)
WITH ( ONLINE = ON );
COMPRESSION_DELAY = 0 | vertraging [ MINUTEN ]

Hiermee geeft u een ondergrens op voor hoe lang een rij in een deltarijgroep moet blijven voordat deze in aanmerking komt voor migratie naar een gecomprimeerde rijgroep. U kunt bijvoorbeeld zeggen dat als een rij gedurende 120 minuten ongewijzigd blijft, die rij in aanmerking komt voor comprimeren in kolomopslagindeling.

Voor een columnstore-index op schijftabellen wordt het tijdstip waarop een rij is ingevoegd of bijgewerkt, niet bijgehouden. In plaats daarvan wordt de gesloten tijd van de deltarijgroep gebruikt als proxy voor de rij. De standaardduur is 0 minuten. Een rij wordt gemigreerd naar kolomopslag na 1 miljoen rijen in de deltarijgroep en wordt gemarkeerd als gesloten.

DATA_COMPRESSION

Hiermee geeft u de optie voor gegevenscompressie voor de opgegeven tabel, partitienummer of bereik van partities. Alleen van toepassing op columnstore-indexen, inclusief niet-geclusterde en geclusterde indexen. De opties zijn als volgt:

  • COLUMNSTORE is de standaardinstelling en geeft aan om te comprimeren met de meest presterende columnstore-compressie. Deze optie is de gebruikelijke keuze.
  • COLUMNSTORE_ARCHIVE de tabel of partitie verder comprimeert naar een kleiner formaat. U kunt deze optie gebruiken voor archivering of voor andere situaties die een kleinere opslaggrootte vereisen en meer tijd voor opslag en ophalen kunnen veroorloven.

Zie Gegevenscompressievoor meer informatie over compressie.

WHERE <filter_expression> [ AND <filter_expression> ]

Met deze optie wordt een filterpredicaat genoemd. Deze optie geeft aan welke rijen moeten worden opgenomen in de index. SQL Server maakt gefilterde statistieken op de gegevensrijen in de gefilterde index.

Het filterpredicaat maakt gebruik van eenvoudige vergelijkingslogica. Vergelijkingen die gebruikmaken van NULL letterlijke waarden zijn niet toegestaan met de vergelijkingsoperatoren. Gebruik in plaats daarvan de operators IS NULL en IS NOT NULL.

Hier volgen enkele voorbeelden van filterpredicaten voor de Production.BillOfMaterials tabel:

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

Zie Gefilterde indexen makenvoor hulp bij gefilterde indexen.

AAN-opties

Met de volgende opties geeft u de bestandsgroepen op waarop de index wordt gemaakt.

partition_scheme_name ( column_name )

Hiermee geeft u het partitieschema op waarmee de bestandsgroepen worden gedefinieerd waarop de partities van een gepartitioneerde index worden toegewezen. Het partitieschema moet in de database bestaan door PARTITIESCHEMA MAKEN uit te voeren.

column_name geeft de kolom aan waarmee een gepartitioneerde index wordt gepartitioneerd. Deze kolom moet overeenkomen met het gegevenstype, de lengte en de precisie van het argument van de partitiefunctie die partition_scheme_name gebruikt. column_name is niet beperkt tot de kolommen in de indexdefinitie. Wanneer u een columnstore-index partitioneert, voegt Database Engine de partitioneringskolom toe als een kolom van de index, als deze nog niet is opgegeven.

Als de tabel is gepartitioneerd en partition_scheme_name of bestandsgroep niet zijn opgegeven, wordt de index in hetzelfde partitieschema geplaatst en wordt dezelfde partitiekolom gebruikt als de onderliggende tabel.

Een columnstore-index op een gepartitioneerde tabel moet worden uitgelijnd. Zie Gepartitioneerde tabellen en indexenvoor meer informatie over partitioneringsindexen.

filegroup_name

Hiermee geeft u een bestandsnaam op waarop de index moet worden gemaakt. Als filegroup_name niet is opgegeven en de tabel niet is gepartitioneerd, gebruikt de index dezelfde bestandsgroep als de onderliggende tabel. De bestandsgroep moet al bestaan.

"standaard"

Hiermee maakt u de opgegeven index voor de standaardbestandsgroep.

De standaardterm is in deze context geen trefwoord. Het is een id voor de standaardbestandsgroep en moet worden gescheiden, zoals in ON "default" of ON [default]. Als "default" is opgegeven, moet de optie QUOTED_IDENTIFIER ingeschakeld zijn voor de huidige sessie. Dit is de standaardinstelling. Zie SET QUOTED_IDENTIFIERvoor meer informatie.

Machtigingen

Vereist ALTER-machtiging voor de tabel.

Opmerkingen

U kunt een columnstore-index maken voor een tijdelijke tabel. Wanneer de tabel wordt verwijderd of de sessie wordt beëindigd, wordt de index ook verwijderd.

In Fabric SQL Database worden tabellen met geclusterde columnstore-indexen niet gespiegeld naar Fabric OneLake.

Gefilterde indexen

Een gefilterde index is een geoptimaliseerde, niet-geclusterde index die geschikt is voor query's die een klein percentage rijen uit een tabel selecteren. Er wordt een filterpredicaat gebruikt om een deel van de gegevens in de tabel te indexeren. Een goed ontworpen gefilterde index kan de queryprestaties verbeteren, de opslagkosten verlagen en de onderhoudskosten verlagen.

Vereiste SET-opties voor gefilterde indexen

De SET-opties in de kolom vereiste waarden zijn vereist wanneer een van de volgende voorwaarden voorkomt:

  • U maakt een gefilterde index.
  • Met een bewerking INSERT, UPDATE, DELETE of MERGE worden de gegevens in een gefilterde index gewijzigd.
  • De queryoptimalisatie gebruikt de gefilterde index om het queryplan te produceren.
OPTIES INSTELLEN Vereiste waarde Standaardserverwaarde Standaard-OLE DB- en ODBC-waarde Standaardwaarde voor DB-Library
ANSI_NULLS OP OP OP AF
ANSI_PADDING OP OP OP AF
ANSI_WARNINGS 1 OP OP OP AF
ARITHABORT OP OP AF AF
CONCAT_NULL_YIELDS_NULL OP OP OP AF
NUMERIC_ROUNDABORT AF AF AF AF
QUOTED_IDENTIFIER OP OP OP AF

1 Instelling ANSI_WARNINGS op ON wordt impliciet ingesteld op AAN wanneer het compatibiliteitsniveau van de database is ingesteld op 90 of hoger. Als het compatibiliteitsniveau van de database is ingesteld op 80 of eerder, moet u de optie ARITHABORT expliciet instellen op AAN.

Als de opties SET onjuist zijn, kunnen de volgende voorwaarden optreden:

  • De gefilterde index wordt niet gemaakt.

  • De database-engine genereert een fout en rolt INSERT-, UPDATE-, DELETE- of MERGE-instructies terug die gegevens in de index wijzigen.

  • De queryoptimalisatie beschouwt de index in het uitvoeringsplan niet voor Transact-SQL instructies.

Zie Gefilterde indexen makenvoor meer informatie over gefilterde indexen.

Beperkingen en beperkingen

Elke kolom in een columnstore-index moet een van de volgende algemene zakelijke gegevenstypen hebben:

  • datetimeoffset [ ( n ) ]
  • datetime2 [ ( n ) ]
  • datum/tijd-
  • smalldatetime-
  • datum
  • tijd [ ( n ) ]
  • float [ ( n ) ]
  • echte [ ( n ) ]
  • decimale [ ( precisie [ , ] ) ]
  • numerieke [ ( precisie [ , schaal ] ] ]
  • geld
  • smallmoney
  • grote
  • kleine
  • kleine
  • bit
  • nvarchar [ ( n ) ]
  • nvarchar(max)1
  • nchar [ ( n ) ]
  • varchar [ ( n ) ]
  • varchar(max)1
  • teken [ ( n ) ]
  • varbinaire [ ( n ) ]
  • varbinary(max)1
  • binaire [ ( n ) ]
  • uniqueidentifier2

1 Van toepassing op SQL Server 2017 (14.x) en Azure SQL Database op Premium-laag, Standard-laag (S3 en hoger) en alle vCore-aanbiedingslagen, alleen in geclusterde columnstore-indexen.

2 Van toepassing op SQL Server 2014 (12.x) en latere versies.

Als de onderliggende tabel een kolom bevat van een gegevenstype dat niet wordt ondersteund voor columnstore-indexen, moet u die kolom weglaten uit de niet-geclusterde columnstore-index.

Grote objectgegevens (LOB) die groter zijn dan 8 kilobytes, worden opgeslagen in off-row, LOB-opslag, met alleen een aanwijzer naar de fysieke locatie die is opgeslagen in het kolomsegment. De grootte van de opgeslagen gegevens wordt niet gerapporteerd in sys.column_store_segments, sys.column_store_dictionariesof sys.dm_db_column_store_row_group_physical_stats.

Kolommen die gebruikmaken van een van de volgende gegevenstypen kunnen niet worden opgenomen in een columnstore-index:

  • tekst, tekst en afbeelding
  • nvarchar(max), varchar(max)en varbinary(max)1
  • rowversion (en tijdstempel)
  • sql_variant
  • CLR-typen (hiërarchie-id en ruimtelijke typen)
  • xml--
  • uniqueidentifier2

1 van toepassing op SQL Server 2016 (13.x) en eerdere versies, en niet-geclusterde columnstore-indexen.

2 Van toepassing op SQL Server 2012 (11.x).

niet-geclusterde columnstore-indexen:

  • Er mogen niet meer dan 1024 kolommen zijn.
  • Kan niet worden gemaakt als een index op basis van beperkingen. Het is mogelijk om unieke beperkingen, primaire-sleutelbeperkingen en refererende-sleutelbeperkingen voor een tabel met een columnstore-index te hebben. Beperkingen worden altijd afgedwongen met een rijarchiefindex. Beperkingen kunnen niet worden afgedwongen met een columnstore-index (geclusterd of niet-geclusterd).
  • Kan geen sparse-kolom opnemen.
  • Kan niet worden gewijzigd met behulp van de instructie ALTER INDEX. Als u de niet-geclusterde index wilt wijzigen, moet u in plaats daarvan de columnstore-index verwijderen en opnieuw maken. U kunt ALTER INDEX gebruiken om een columnstore-index uit te schakelen en opnieuw op te bouwen.
  • Kan niet worden gemaakt met het sleutelwoord INCLUDE.
  • Kan de ASC of DESC trefwoorden opgeven in de lijst met indexkolommen voor een niet-geclusterde columnstore-index in Azure SQL Database, SQL-database in Microsoft Fabric en Azure SQL Managed Instance met het Always-up-to-date updatebeleid. Zie Prestaties afstemmen met geordende columnstore-indexenvoor meer informatie.
    • Kan de ASC of DESC trefwoorden niet opnemen in de lijst met indexkolommen in andere producten. Columnstore-indexen worden gerangschikt op basis van de compressiealgoritmen.
  • Kan geen LOB-kolommen van het type nvarchar(max), varchar(max)en varbinary(max) in niet-geclusterde columnstore-indexen. Alleen geclusterde columnstore-indexen ondersteunen LOB-typen, vanaf de VERSIE van SQL Server 2017 (14.x), Azure SQL Database (geconfigureerd op Premium-laag, Standard-laag (S3 en hoger) en alle vCore-aanbiedingslagen. Eerdere versies bieden geen ondersteuning voor LOB-typen in geclusterde en niet-geclusterde columnstore-indexen.
  • Vanaf SQL Server 2016 (13.x) kunt u een niet-geclusterde columnstore-index maken in een geïndexeerde weergave.

Columnstore-indexen kunnen niet worden gecombineerd met de volgende functies:

  • Berekende kolommen. Vanaf SQL Server 2017 (14.x) kan een geclusterde columnstore-index een niet-persistente berekende kolom bevatten. In SQL Server 2017 (14.x) kunnen geclusterde columnstore-indexen echter geen persistente berekende kolommen bevatten en kunt u geen niet-geclusterde indexen maken voor berekende kolommen.
  • Compressie van pagina's en rijen en de vardecimale opslagindeling. (Een columnstore-index is al gecomprimeerd in een andere indeling.)
  • Replicatie met geclusterde columnstore-indexen. Niet-geclusterde columnstore-indexen worden ondersteund. Zie sp_addarticlevoor meer informatie.
  • Filestream.

U kunt geen cursors of triggers gebruiken in een tabel met een geclusterde columnstore-index. Deze beperking geldt niet voor niet-geclusterde columnstore-indexen. U kunt cursors en triggers in een tabel gebruiken met een niet-geclusterde columnstore-index.

specifieke beperkingen voor SQL Server 2014 (12.x):

De volgende beperkingen gelden alleen voor SQL Server 2014 (12.x). In deze release kunt u updatebare, geclusterde columnstore-indexen gebruiken. Niet-geclusterde columnstore-indexen zijn nog steeds alleen-lezen.

  • Wijzigingen bijhouden. U kunt wijzigingen bijhouden met columnstore-indexen niet gebruiken.
  • Gegevens vastleggen wijzigen. Deze functie kan niet worden ingeschakeld voor tabellen met een geclusterde columnstore-index. Vanaf SQL Server 2016 (13.x) kan het vastleggen van gegevens worden ingeschakeld voor tabellen met een niet-geclusterde columnstore-index.
  • Leesbare secundaire. U hebt geen toegang tot een geclusterde columnstore-index (CCI) vanaf een leesbare secundaire van een AlwaysOn leesbare beschikbaarheidsgroep. U hebt toegang tot een niet-geclusterde columnstore-index (NCCI) vanaf een leesbare secundaire.
  • Meerdere actieve resultatensets (MARS). SQL Server 2014 (12.x) gebruikt deze functie voor alleen-lezenverbindingen met tabellen met een columnstore-index. SQL Server 2014 (12.x) biedt echter geen ondersteuning voor deze functie voor gelijktijdige DML-bewerkingen (Data Manipulat Language) in een tabel met een columnstore-index. Als u de functie voor dit doel probeert te gebruiken, beëindigt SQL Server de verbindingen en annuleert u de transacties.
  • Niet-geclusterde columnstore-indexen kunnen niet worden gemaakt in een weergave of geïndexeerde weergave.

Zie Columnstore-indexen voor informatie over de prestatievoordelen en beperkingen van columnstore-indexen: Overzicht.

Metagegevens

Alle kolommen in een columnstore-index worden opgeslagen in de metagegevens als opgenomen kolommen. De columnstore-index heeft geen sleutelkolommen. De volgende systeemweergaven bieden informatie over columnstore-indexen:

Voorbeelden: tabel converteren van rowstore naar columnstore

Een. Een heap converteren naar een geclusterde columnstore-index

In dit voorbeeld wordt een tabel gemaakt als een heap en vervolgens geconverteerd naar een geclusterde columnstore-index met de naam cci_Simple. Het maken van de geclusterde columnstore-index wijzigt de opslag voor de hele tabel van 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. Een geclusterde index converteren naar een geclusterde columnstore-index met dezelfde naam

In dit voorbeeld wordt een tabel met geclusterde index gemaakt en wordt vervolgens de syntaxis gedemonstreerd van het converteren van de geclusterde index naar een geclusterde columnstore-index. Het maken van de geclusterde columnstore-index wijzigt de opslag voor de hele tabel van 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. Niet-geclusterde indexen verwerken bij het converteren van een rowstore-tabel naar een columnstore-index

In dit voorbeeld ziet u hoe u niet-geclusterde indexen verwerkt wanneer u een rowstore-tabel converteert naar een columnstore-index. Vanaf SQL Server 2016 (13.x) is er geen speciale actie vereist. SQL Server definieert en herbouwt automatisch de niet-geclusterde indexen op de nieuwe, geclusterde columnstore-index.

Als u de niet-geclusterde indexen wilt verwijderen, gebruikt u de INSTRUCTIE DROP INDEX voordat u de columnstore-index maakt. Met de optie DROP EXISTING wordt alleen de geclusterde index verwijderd die wordt geconverteerd. De niet-geclusterde indexen worden niet verwijderd.

In SQL Server 2012 (11.x) en SQL Server 2014 (12.x) kunt u geen niet-geclusterde index maken in een columnstore-index.

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

Alleen voor SQL Server 2012 (11.x) en SQL Server 2014 (12.x) moet u de niet-geclusterde indexen verwijderen om de columnstore-index te maken.

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. Een grote feitentabel converteren van rowstore naar columnstore

In dit voorbeeld wordt uitgelegd hoe u een grote feitentabel converteert van een rowstore-tabel naar een columnstore-tabel.

  1. Maak een kleine tabel die in dit voorbeeld moet worden gebruikt.

    --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. Verwijder alle niet-geclusterde indexen uit de tabel rowstore. Mogelijk wilt u de indexen om ze later opnieuw te maken.

    --Drop all nonclustered indexes
    DROP INDEX my_index ON dbo.MyFactTable;
    
  3. Converteer de rowstore-tabel naar een columnstore-tabel met een geclusterde columnstore-index.

    Zoek eerst de naam van de bestaande geclusterde rowstore-index op. In stap 1 stellen we de naam van de index in op IDX_CL_MyFactTable. Als de indexnaam niet is opgegeven, krijgt deze een automatisch gegenereerde unieke indexnaam. U kunt de automatisch gegenereerde naam ophalen met de volgende voorbeeldquery:

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

    Optie 1: Verwijder de bestaande geclusterde index IDX_CL_MyFactTableen converteer MyFactTable naar columnstore. Wijzig de naam van de nieuwe geclusterde columnstore-index.

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

    Optie 2: Converteren naar columnstore en de bestaande geclusterde indexnaam van rowstore opnieuw gebruiken.

    --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. Een columnstore-tabel converteren naar een rowstore-tabel met een geclusterde index

Als u een columnstore-tabel wilt converteren naar een rowstore-tabel met een geclusterde index, gebruikt u de instructie CREATE INDEX met de optie DROP_EXISTING.

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

F. Een columnstore-tabel converteren naar een rowstore-heap

Als u een columnstore-tabel wilt converteren naar een rowstore-heap, zet u de geclusterde columnstore-index neer. Dit wordt meestal niet aanbevolen, maar sommige kunnen smalle toepassingen hebben. Zie Heaps (tabellen zonder geclusterde indexen)voor meer informatie over heaps.

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

G. Defragmenteren door de columnstore-index te herstructureren

Er zijn twee manieren om de geclusterde columnstore-index te onderhouden. Gebruik vanaf SQL Server 2016 (13.x) ALTER INDEX...REORGANIZE in plaats van REBUILD. Zie Columnstore-indexrijgroepvoor meer informatie. In eerdere versies van SQL Server kunt u CLUSTERED COLUMNSTORE INDEX maken met DROP_EXISTING=AAN of ALTER INDEX (Transact-SQL) en de optie REBUILD. Beide methoden hebben dezelfde resultaten bereikt.

Begin met het bepalen van de naam van de geclusterde columnstore-index in MyFactTable.

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

Verwijder fragmentatie door een REORGANIZE uit te voeren op de columnstore-index.

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

Voorbeelden voor niet-geclusterde columnstore-indexen

Een. Een columnstore-index maken als een secundaire index in een rowstore-tabel

In dit voorbeeld wordt een niet-geclusterde columnstore-index gemaakt in een rowstore-tabel. In deze situatie kan slechts één columnstore-index worden gemaakt. Voor de columnstore-index is extra opslagruimte vereist, omdat deze een kopie van de gegevens in de tabel rowstore bevat. In dit voorbeeld wordt een eenvoudige tabel en een geclusterde rijopslagindex gemaakt en wordt vervolgens de syntaxis gedemonstreerd van het maken van een niet-geclusterde columnstore-index.

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. Een eenvoudige niet-geclusterde columnstore-index maken met behulp van alle opties

In het volgende voorbeeld ziet u de syntaxis van het maken van een niet-geclusterde columnstore-index voor de STANDAARD-bestandsgroep, waarbij de maximale mate van parallelle uitvoering (MAXDOP) wordt opgegeven als 2.

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

C. Een niet-geclusterde columnstore-index maken met een gefilterd predicaat

In het volgende voorbeeld wordt een gefilterde, niet-geclusterde columnstore-index gemaakt in de Production.BillOfMaterials tabel in de AdventureWorks2022 voorbeelddatabase. Het filterpredicaat kan kolommen bevatten die geen sleutelkolommen in de gefilterde index zijn. Het predicaat in dit voorbeeld selecteert alleen de rijen waarin EndDate niet null is.

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. De gegevens in een niet-geclusterde columnstore-index wijzigen

Van toepassing op: SQL Server 2012 (11.x) tot en met SQL Server 2014 (12.x).

In SQL Server 2014 (12.x) en eerdere versies, nadat u een niet-geclusterde columnstore-index voor een tabel hebt gemaakt, kunt u de gegevens in die tabel niet rechtstreeks wijzigen. Een query met INSERT, UPDATE, DELETE of MERGE mislukt en retourneert een foutbericht. Hier volgen opties die u kunt gebruiken om de gegevens in de tabel toe te voegen of te wijzigen:

  • Schakel de columnstore-index uit of zet deze neer. Vervolgens kunt u de gegevens in de tabel bijwerken. Als u de columnstore-index uitschakelt, kunt u de columnstore-index opnieuw opbouwen wanneer u klaar bent met het bijwerken van de gegevens. Bijvoorbeeld:

    ALTER INDEX mycolumnstoreindex ON dbo.mytable DISABLE;
    
    -- update the data in mytable as necessary
    ALTER INDEX mycolumnstoreindex on dbo.mytable REBUILD;
    
  • Laad gegevens in een faseringstabel die geen columnstore-index heeft. Bouw een columnstore-index in de faseringstabel. Schakel de faseringstabel over naar een lege partitie van de hoofdtabel.

  • Schakel een partitie van de tabel met de columnstore-index over naar een lege faseringstabel. Als er een columnstore-index in de faseringstabel is, schakelt u de columnstore-index uit. Voer eventuele updates uit. Bouw de columnstore-index (of bouw deze opnieuw). Zet de faseringstabel weer in de (nu lege) partitie van de hoofdtabel.

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

Een. Een geclusterde index wijzigen in een geclusterde columnstore-index

Met de instructie CREATE CLUSTERED COLUMNSTORE INDEX met DROP_EXISTING = AAN kunt u het volgende doen:

  • Wijzig een geclusterde index in een geclusterde columnstore-index.

  • Bouw een geclusterde columnstore-index opnieuw.

In dit voorbeeld wordt de xDimProduct tabel gemaakt als een rowstore-tabel met een geclusterde index. Vervolgens wordt in het voorbeeld CREATE CLUSTERED COLUMNSTORE INDEX gebruikt om de tabel te wijzigen van een rowstore-tabel in een columnstore-tabel.

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

Zoek de naam van de geclusterde index automatisch op voor de nieuwe tabel in de systeemmetagegevens, met behulp van sys.indexes. Bijvoorbeeld:

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

U kunt er nu voor kiezen om het volgende te doen:

  1. Verwijder de bestaande geclusterde columnstore-index met een automatisch gemaakte naam en maak vervolgens een nieuwe geclusterde columnstore-index met een door de gebruiker gedefinieerde naam.
  2. Verwijder en vervang de bestaande index door een geclusterde columnstore-index, waarbij dezelfde door het systeem gegenereerde naam behouden blijft, zoals ClusteredIndex_1bd8af8797f7453182903cc68df48541.

Bijvoorbeeld:

--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. Een geclusterde columnstore-index herbouwen

Verderop in het vorige voorbeeld wordt in dit voorbeeld CREATE CLUSTERED COLUMNSTORE INDEX gebruikt om de bestaande geclusterde columnstore-index, genaamd cci_xDimProduct, opnieuw te bouwen.

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

C. De naam van een geclusterde columnstore-index wijzigen

Als u de naam van een geclusterde columnstore-index wilt wijzigen, zet u de bestaande geclusterde columnstore-index neer en maakt u de index opnieuw met een nieuwe naam.

U wordt aangeraden deze bewerking te beperken tot een kleine of lege tabel. Het duurt lang om een grote, geclusterde columnstore-index te verwijderen en opnieuw te bouwen met een andere naam.

In dit voorbeeld wordt verwezen naar de cci_xDimProduct geclusterde columnstore-index uit het vorige voorbeeld. In dit voorbeeld wordt de cci_xDimProduct geclusterde columnstore-index verwijderd en wordt vervolgens de geclusterde columnstore-index opnieuw gemaakt met de naam 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. Een columnstore-tabel converteren naar een rowstore-tabel met een geclusterde index

Er kan een situatie zijn waarin u een geclusterde columnstore-index wilt verwijderen en een geclusterde index wilt maken. Wanneer u een geclusterde columnstore-index neer zet, wordt de tabel gewijzigd in de rowstore-indeling. In dit voorbeeld wordt een columnstore-tabel geconverteerd naar een rowstore-tabel met een geclusterde index met dezelfde naam. Geen van de gegevens gaat verloren. Alle gegevens gaan naar de tabel rowstore en de vermelde kolommen worden de belangrijkste kolommen in de geclusterde 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. Een columnstore-tabel terug converteren naar een rowstore-heap

Gebruik DROP INDEX om de geclusterde columnstore-index te verwijderen en de tabel te converteren naar een rijopslag-heap. In dit voorbeeld wordt de cci_xDimProduct tabel geconverteerd naar een rijopslag-heap. De tabel blijft gedistribueerd, maar wordt opgeslagen als een heap.

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

F. Een geordende geclusterde columnstore-index maken in een tabel zonder index

Een niet-geordende columnstore-index omvat standaard alle kolommen, zonder dat u een kolomlijst hoeft op te geven. Met een geordende columnstore-index kunt u de volgorde van de kolommen opgeven. De lijst hoeft niet alle kolommen op te nemen.

Zie Prestaties afstemmen met geordende columnstore-indexenvoor meer informatie.

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

G. Een geclusterde columnstore-index converteren naar een geordende geclusterde columnstore-index

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

H. Een kolom toevoegen aan de volgorde van een geordende geclusterde columnstore-index

U kunt een volgorde opgeven voor de kolommen in een columnstore-index. De oorspronkelijke geordende, geclusterde columnstore-index is alleen op de SHIPDATE kolom geordend. In het volgende voorbeeld wordt de kolom PRODUCTKEY toegevoegd aan de volgorde. Zie Columnstore-indexen voor de beschikbaarheid van geordende columnstore-indexen: Overzicht.

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

Ik. De rangorde van geordende kolommen wijzigen

De oorspronkelijke geordende, geclusterde columnstore-index is geordend op SHIPDATE, PRODUCTKEY. In het volgende voorbeeld wordt de volgorde gewijzigd in PRODUCTKEY, SHIPDATE. Zie Columnstore-indexen voor de beschikbaarheid van geordende columnstore-indexen: Overzicht.

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

J. Een geordende geclusterde columnstore-index maken

U kunt een geclusterde columnstore-index maken met bestelsleutels. Wanneer u een geordende geclusterde columnstore-index maakt, moet u de queryhint toepassen MAXDOP = 1 voor de maximale kwaliteit van de sortering en de kortste duur. Zie Columnstore-indexen voor de beschikbaarheid van geordende columnstore-indexen: Overzicht.

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