Dela via


SKAPA COLUMNSTORE-INDEX (Transact-SQL)

gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL-databas i Microsoft Fabric

Konvertera en radlagringstabell till ett grupperat kolumnlagringsindex eller skapa ett icke-grupperat kolumnlagringsindex. Använd ett columnstore-index för att effektivt köra driftanalyser i realtid på en OLTP-arbetsbelastning, eller för att förbättra datakomprimering och frågeprestanda för datalagerarbetsbelastningar.

Följ Nyheter i kolumnlagringsindex för de senaste förbättringarna av den här funktionen.

  • Ordnade grupperade columnstore-index introducerades i SQL Server 2022 (16.x). Mer information finns i CREATE COLUMNSTORE INDEX. Information om tillgänglighet för ordnat columnstore-index finns i Columnstore-index: Översikt.

  • Från och med SQL Server 2016 (13.x) kan du skapa tabellen som ett grupperat kolumnlagringsindex. Det är inte längre nödvändigt att först skapa en radlagringstabell och sedan konvertera den till ett grupperat kolumnlagringsindex.

  • Information om designriktlinjer för columnstore-index finns i Columnstore-index – Designvägledning.

Transact-SQL syntaxkonventioner

Syntax

Syntax för Azure SQL Database och Azure SQL Managed Instance med uppdateringsprincipen Always-up-to-date:

-- 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 ] )
    [ 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
[;]

Versionstillgänglighet

Vissa av alternativen är inte tillgängliga i alla databasmotorversioner. Följande tabell visar versionerna när alternativen introduceras i klustrade kolumnarkiv och icke-illustrerade kolumnlagringsindex:

Alternativ KLUSTRADE 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)
UPPKOPPLAD SQL Server 2019 (15.x) SQL Server 2017 (14.x)
WHERE-sats Ej tillämpligt SQL Server 2016 (13.x)
ORDER-sats SQL Server 2016 (13.x) Ej tillämpligt

Alla alternativ är tillgängliga i Azure SQL Database och Azure SQL Managed Instance med uppdateringsprincipen Always-up-to-date.

Mer information om funktionstillgänglighet finns i Nyheter i kolumnlagringsindex.

Argument

SKAPA GRUPPERAT COLUMNSTORE-INDEX

Skapa ett grupperat columnstore-index där alla data komprimeras och lagras efter kolumn. Indexet innehåller alla kolumner i tabellen och lagrar hela tabellen. Om den befintliga tabellen är ett heap- eller klustrat index konverteras den till ett grupperat kolumnlagringsindex. Om tabellen redan lagras som ett grupperat kolumnlagringsindex tas det befintliga indexet bort och återskapas.

index_name

Anger namnet på det nya indexet.

Om tabellen redan har ett grupperat kolumnlagringsindex kan du ange samma namn som det befintliga indexet, eller så kan du använda alternativet SLÄPP BEFINTLIG för att ange ett nytt namn.

PÅ [ database_name. [ schema_name ] . | schema_name . ] table_name

Anger namnet på tabellen i en, två eller tre delar som ska lagras som ett grupperat kolumnlagringsindex. Om tabellen är en heap eller har ett grupperat index konverteras tabellen från ett radarkiv till ett kolumnarkiv. Om tabellen redan är ett kolumnarkiv återskapar den här instruktionen det klustrade kolumnlagringsindexet.

ORDER för klustrad kolumnlagring

Använd kolumnen column_store_order_ordinal i sys.index_columns för att fastställa ordningen på kolumnerna för ett grupperat kolumnlagringsindex. Kolumnlagringsordning underlättar segmenteliminering, särskilt med strängdata. Mer information finns i Prestandajustering med ordnade kolumnlagringsindex och Columnstore-index – Designvägledning.

Om du vill konvertera till ett ordnat grupperat kolumnlagringsindex måste det befintliga indexet vara ett grupperat kolumnlagringsindex. Använd alternativet DROP_EXISTING.

LOB-datatyper (max) längddatatyper) kan inte vara nyckeln till ett ordnat grupperat kolumnlagringsindex.

När du skapar ett ordnat grupperat columnstore-index använder du alternativet MAXDOP = 1 för sortering av högsta kvalitet, i utbyte mot en betydligt längre varaktighet för CREATE INDEX-instruktionen. Om du vill skapa indexet så snabbt som möjligt ska du inte begränsa MAXDOP. Den högsta kvaliteten på komprimering och sortering kan underlätta frågor i kolumnlagringsindexet.

Information om tillgänglighet för ordnat columnstore-index finns i Columnstore-index: Översikt.

WITH-alternativ

DROP_EXISTING = [OFF] | PÅ

DROP_EXISTING = ON anger att du vill släppa det befintliga indexet och skapa ett nytt kolumnlagringsindex.

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

Standardvärdet, DROP_EXISTING = OFF, förväntar sig att indexnamnet är samma som det befintliga namnet. Ett fel uppstår om det angivna indexnamnet redan finns.

MAXDOP = max_degree_of_parallelism

Det här alternativet kan åsidosätta den befintliga maximala graden av parallellitetsserverkonfiguration under indexåtgärden. Använd MAXDOP för att begränsa antalet processorer som används i en parallell plankörning. Maximalt är 64 processorer.

max_degree_of_parallelism värden kan vara:

  • 1, vilket innebär att förhindra parallell plangenerering.
  • >1, vilket innebär att begränsa det maximala antalet processorer som används i en parallell indexåtgärd till det angivna antalet, eller färre, baserat på den aktuella systemarbetsbelastningen. Till exempel när MAXDOP = 4 är antalet processorer som används 4 eller mindre.
  • 0 (standard), vilket innebär att använda det faktiska antalet processorer, eller färre, baserat på den aktuella systemarbetsbelastningen.
CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
WITH (MAXDOP = 2);

Mer information finns i Server-konfiguration: maximal grad av parallellitetoch Konfigurera parallella indexåtgärder.

COMPRESSION_DELAY = 0 | fördröjning [ MINUTER ]

För en diskbaserad tabell anger fördröjning det minsta antalet minuter som en deltaradgrupp i stängt tillstånd måste finnas kvar i deltaradgruppen. SQL Server kan sedan komprimera den till den komprimerade radgruppen. Eftersom diskbaserade tabeller inte spårar infognings- och uppdateringstider på enskilda rader tillämpar SQL Server fördröjningen på deltaradgrupper i stängt tillstånd.

Standardvärdet är 0 minuter.

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

Rekommendationer om när du ska använda COMPRESSION_DELAY finns i Komma igång med Columnstore för driftanalys i realtid.

DATA_COMPRESSION = COLUMNSTORE | COLUMNSTORE_ARCHIVE

Anger datakomprimeringsalternativet för den angivna tabellen, partitionsnumret eller partitionsintervallet. Alternativen är följande:

  • COLUMNSTORE är standard och anger att komprimera med den mest högpresterande kolumnlagringskomprimering. Det här alternativet är det vanliga valet.
  • COLUMNSTORE_ARCHIVE komprimerar tabellen eller partitionen ytterligare till en mindre storlek. Använd det här alternativet för situationer som arkivering, vilket kräver en mindre lagringsstorlek och har råd med mer tid för lagring och hämtning.
CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
WITH ( DATA_COMPRESSION = COLUMNSTORE_ARCHIVE );

Mer information om komprimering finns i Datakomprimering.

ONLINE = [ON | AV]
  • ON anger att kolumnlagringsindexet förblir online och tillgängligt, medan den nya kopian av indexet skapas.
  • OFF anger att indexet inte är tillgängligt för användning medan den nya kopian skapas.
CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
WITH ( ONLINE = ON );

PÅ-alternativ

Med dessa alternativ kan du ange alternativ för datalagring, till exempel ett partitionsschema, en specifik filgrupp eller standardfilgruppen. Om alternativet PÅ inte har angetts använder indexet inställningspartitionen eller filgruppsinställningarna för den befintliga tabellen.

partition_scheme_name ( column_name ) anger partitionsschemat för tabellen. Partitionsschemat måste redan finnas i databasen. Information om hur du skapar partitionsschemat finns i CREATE PARTITION SCHEME (Transact-SQL).

column_name anger den kolumn som ett partitionerat index partitioneras mot. Den här kolumnen måste matcha datatypen, längden och precisionen för argumentet för partitionsfunktionen som partition_scheme_name använder.

filegroup_name anger filgruppen för lagring av det klustrade kolumnlagringsindexet. Om ingen plats har angetts och tabellen inte är partitionerad använder indexet samma filgrupp som den underliggande tabellen eller vyn. Filgruppen måste redan finnas.

Om du vill skapa indexet i standardfilgruppen använder du "default" eller [default]. Om du anger "default"måste alternativet QUOTED_IDENTIFIER vara ON för den aktuella sessionen. QUOTED_IDENTIFIER är ON som standard. Mer information finns i SET QUOTED_IDENTIFIER (Transact-SQL).

SKAPA [NONCLUSTERED] COLUMNSTORE INDEX

Skapa ett icke-grupperat kolumnlagringsindex i en radlagringstabell som lagras som ett heap- eller klustrade index. Indexet kan ha ett filtrerat villkor och behöver inte inkludera alla kolumner i den underliggande tabellen. Kolumnlagringsindexet kräver tillräckligt med utrymme för att lagra en kopia av data. Du kan uppdatera indexet och det uppdateras när den underliggande tabellen ändras. Det icke-klustrade kolumnlagringsindexet i ett grupperat index möjliggör realtidsanalys.

index_name

Anger namnet på indexet. index_name måste vara unika i tabellen, men behöver inte vara unika i databasen. Indexnamn måste följa reglerna för identifierare.

( kolumn [ ,...n ] )

Anger vilka kolumner som ska lagras. Ett icke-grupperat columnstore-index är begränsat till 1 024 kolumner.

Varje kolumn måste ha en datatyp som stöds för kolumnlagringsindex. En lista över de datatyper som stöds finns i Begränsningar och begränsningar.

PÅ [ database_name. [ schema_name ] . | schema_name . ] table_name

Anger namnet på tabellen i en, två eller tre delar som innehåller indexet.

ORDER for nonclustered columnstore

Kolumnerna som anges i ORDER-satsen för ett icke-grupperat kolumnlagringsindex måste vara en delmängd av nyckelkolumnerna för indexet.

Använd kolumnen column_store_order_ordinal i sys.index_columns för att fastställa ordningen på kolumnerna för ett icke-grupperat kolumnlagringsindex. Kolumnlagringsordning underlättar segmenteliminering, särskilt med strängdata. Mer information finns i Prestandajustering med ordnade kolumnlagringsindex och Columnstore-index – Designvägledning. Design- och prestandaöverväganden i dessa artiklar gäller vanligtvis både klustrade och icke-grupperade kolumnlagringsindex.

LOB-datatyper (max) längddatatyper) kan inte vara nyckeln till ett ordnat icke-grupperat kolumnlagringsindex.

När du skapar ett ordnat icke-grupperat kolumnlagringsindex använder du MAXDOP = 1 alternativ för sortering av högsta kvalitet, i utbyte mot en betydligt längre varaktighet för CREATE INDEX-instruktionen. Om du vill skapa indexet så snabbt som möjligt ska du inte begränsa MAXDOP. Den högsta kvaliteten på komprimering och sortering kan underlätta frågor i kolumnlagringsindexet.

Information om tillgänglighet för ordnat columnstore-index finns i Ordnad kolumnindextillgänglighet.

WITH-alternativ

DROP_EXISTING = [OFF] | PÅ

DROP_EXISTING = ON Det befintliga indexet tas bort och återskapas. Det angivna indexnamnet måste vara samma som ett befintligt index. Indexdefinitionen kan dock ändras. Du kan till exempel ange olika kolumner eller indexalternativ.

DROP_EXISTING = AV
Ett fel visas om det angivna indexnamnet redan finns. Indextypen kan inte ändras med hjälp av DROP_EXISTING. I bakåtkompatibel syntax motsvarar WITH DROP_EXISTING WITH DROP_EXISTING = ON.

MAXDOP = max_degree_of_parallelism

Åsidosätter konfigurationen av Server: maximal grad av parallellitet konfigurationsalternativ under indexåtgärden. Använd MAXDOP för att begränsa antalet processorer som används i en parallell plankörning. Maximalt är 64 processorer.

max_degree_of_parallelism värden kan vara:

  • 1, vilket innebär att förhindra parallell plangenerering.
  • >1, vilket innebär att begränsa det maximala antalet processorer som används i en parallell indexåtgärd till det angivna antalet, eller färre, baserat på den aktuella systemarbetsbelastningen. Till exempel när MAXDOP = 4 är antalet processorer som används 4 eller mindre.
  • 0 (standard), vilket innebär att det faktiska antalet processorer eller färre används baserat på den aktuella systemarbetsbelastningen.

Mer information finns i Konfigurera parallella indexåtgärder.

Not

Parallella indexåtgärder är inte tillgängliga i varje version av Microsoft SQL Server. En lista över funktioner som stöds av versionerna av SQL Server finns i Utgåvor och funktioner som stöds i SQL Server 2022.

ONLINE = [ON | AV]
  • ON anger att kolumnlagringsindexet förblir online och tillgängligt, medan den nya kopian av indexet skapas.
  • OFF anger att indexet inte är tillgängligt för användning medan den nya kopian skapas. I ett icke-grupperat index förblir bastabellen tillgänglig. Endast det icke-illustrerade kolumnlagringsindexet används inte för att uppfylla frågor förrän det nya indexet har slutförts.
CREATE COLUMNSTORE INDEX ncci ON Sales.OrderLines (StockItemID, Quantity, UnitPrice, TaxRate)
WITH ( ONLINE = ON );
COMPRESSION_DELAY = 0 | fördröjning [ MINUTER ]

Anger en lägre gräns för hur länge en rad ska finnas kvar i en deltaradgrupp innan den är berättigad till migrering till en komprimerad radgrupp. Du kan till exempel säga att om en rad är oförändrad i 120 minuter är den raden berättigad till komprimering till kolumnformat.

För ett kolumnlagringsindex för diskbaserade tabeller spåras inte den tid då en rad infogades eller uppdaterades. I stället används den stängda delta rowgroup-tiden som proxy för raden. Standardvaraktigheten är 0 minuter. En rad migreras till kolumnlagring efter att 1 miljon rader ackumulerats i deltaradgruppen och markerats som stängd.

DATA_COMPRESSION

Anger datakomprimeringsalternativet för den angivna tabellen, partitionsnumret eller partitionsintervallet. Gäller endast för kolumnlagringsindex, inklusive både icke-grupperade och klustrade. Alternativen är följande:

  • COLUMNSTORE är standard och anger att komprimera med den mest högpresterande kolumnlagringskomprimering. Det här alternativet är det vanliga valet.
  • COLUMNSTORE_ARCHIVE komprimerar tabellen eller partitionen ytterligare till en mindre storlek. Du kan använda det här alternativet för arkivering eller för andra situationer som kräver en mindre lagringsstorlek och har råd med mer tid för lagring och hämtning.

Mer information om komprimering finns i Datakomprimering.

WHERE <filter_expression> [ AND <filter_expression> ]

Det här alternativet kallas filterpredikat och anger vilka rader som ska inkluderas i indexet. SQL Server skapar filtrerad statistik på dataraderna i det filtrerade indexet.

Filterpredikatet använder enkel jämförelselogik. Jämförelser som använder NULL literaler tillåts inte med jämförelseoperatorerna. Använd operatorerna IS NULL och IS NOT NULL i stället.

Här följer några exempel på filterpredikat för tabellen Production.BillOfMaterials:

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

Mer information om filtrerade index finns i Skapa filtrerade index.

PÅ-alternativ

Följande alternativ anger de filgrupper där indexet skapas.

partition_scheme_name ( column_name )

Anger partitionsschemat som definierar de filgrupper som partitionerna i ett partitionerat index mappas till. Partitionsschemat måste finnas i databasen genom att köra CREATE PARTITION SCHEME.

column_name anger den kolumn som ett partitionerat index partitioneras mot. Den här kolumnen måste matcha datatypen, längden och precisionen för argumentet för partitionsfunktionen som partition_scheme_name använder. column_name är inte begränsat till kolumnerna i indexdefinitionen. När du partitionerar ett kolumnlagringsindex lägger Databasmotorn till partitioneringskolumnen som en kolumn i indexet, om den inte redan har angetts.

Om tabellen är partitionerad och partition_scheme_name eller filgrupp inte anges placeras indexet i samma partitionsschema och använder samma partitioneringskolumn som den underliggande tabellen.

Ett columnstore-index i en partitionerad tabell måste vara partitionsjusterat. Mer information om partitionering av index finns i Partitionerade tabeller och index.

filegroup_name

Anger ett filgruppsnamn som indexet ska skapas på. Om filegroup_name inte har angetts och tabellen inte är partitionerad använder indexet samma filgrupp som den underliggande tabellen. Filgruppen måste redan finnas.

"standard"

Skapar det angivna indexet för standardfilgruppen.

Termen standard i den här kontexten är inte ett nyckelord. Det är en identifierare för standardfilgruppen och måste avgränsas, som i ON "default" eller ON [default]. Om "default" anges måste alternativet QUOTED_IDENTIFIER vara PÅ för den aktuella sessionen, vilket är standardinställningen. Mer information finns i SET QUOTED_IDENTIFIER.

Behörigheter

Kräver ALTER-behörighet i tabellen.

Anmärkningar

Du kan skapa ett kolumnlagringsindex i en tillfällig tabell. När tabellen tas bort eller sessionen slutar tas även indexet bort.

I Fabric SQL-databasen speglas inte tabeller med grupperade kolumnlagringsindex till Fabric OneLake-.

Filtrerade index

Ett filtrerat index är ett optimerat, icke-grupperat index som passar för frågor som väljer en liten procentandel rader från en tabell. Den använder ett filterpredikat för att indexera en del av data i tabellen. Ett väldesignat filtrerat index kan förbättra frågeprestanda, minska lagringskostnaderna och minska underhållskostnaderna.

Obligatoriska SET-alternativ för filtrerade index

SET-alternativen i den obligatoriska värdekolumnen krävs när något av följande villkor inträffar:

  • Du skapar ett filtrerat index.
  • En INSERT-, UPDATE-, DELETE- eller MERGE-åtgärd ändrar data i ett filtrerat index.
  • Frågeoptimeraren använder det filtrerade indexet för att skapa frågeplanen.
SET-alternativ Obligatoriskt värde Standardservervärde Standardvärde för OLE DB och ODBC Standardvärde för DB-Library
ANSI_NULLS BORT
ANSI_PADDING BORT
ANSI_WARNINGS 1 BORT
ARITHABORT BORT BORT
CONCAT_NULL_YIELDS_NULL BORT
NUMERIC_ROUNDABORT BORT BORT BORT BORT
QUOTED_IDENTIFIER BORT

1 Inställningen ANSI_WARNINGS till ON anger implicit ARITHABORT till PÅ när databaskompatibilitetsnivån är inställd på 90 eller senare. Om databaskompatibilitetsnivån är inställd på 80 eller tidigare måste du uttryckligen ange alternativet ARITHABORT till PÅ.

Om SET-alternativen är felaktiga kan följande villkor inträffa:

  • Det filtrerade indexet skapas inte.

  • Databasmotorn genererar ett fel och återställer INSERT-, UPDATE-, DELETE- eller MERGE-instruktioner som ändrar data i indexet.

  • Frågeoptimeraren tar inte hänsyn till indexet i körningsplanen för några Transact-SQL-instruktioner.

Mer information om filtrerade index finns i Skapa filtrerade index.

Begränsningar och begränsningar

Varje kolumn i ett kolumnlagringsindex måste vara av någon av följande vanliga affärsdatatyper:

  • datetimeoffset [ ( n ) ] ]
  • datetime2 [ ( n ) ] ]
  • datetime
  • smalldatetime
  • datum
  • tid [ ( n ) ] ]
  • float [ ( n ) ]
  • verkliga [ ( n ) ] ]
  • decimal [ ( precision [ , skala ] ) ] ]
  • numeriska [ ( precision [ , skala ] ) ] ]
  • pengar
  • smallmoney
  • bigint
  • int
  • liten
  • pytteliten
  • bit
  • nvarchar [ ( n ) ]
  • nvarchar(max)1
  • nchar [ ( n ) ] ]
  • varchar [ ( n ) ]
  • varchar(max)1
  • char [ ( n ) ]
  • varbinary [ ( n ) ] ]
  • varbinary(max)1
  • binär [ ( n ) ] ]
  • uniqueidentifier2

1 gäller för SQL Server 2017 (14.x) och Azure SQL Database på Premium-nivå, Standardnivå (S3 och senare) och alla VCore-erbjudandenivåer, endast i grupperade kolumnlagringsindex.

2 gäller för SQL Server 2014 (12.x) och senare versioner.

Om den underliggande tabellen har en kolumn av en datatyp som inte stöds för kolumnlagringsindex måste du utelämna den kolumnen från det icke-illustrerade kolumnlagringsindexet.

Stora objektdata (LOB) som är större än 8 kilobyte lagras utanför rad, LOB-lagring, med bara en pekare till den fysiska plats som lagras i kolumnsegmentet. Storleken på de lagrade data rapporteras inte i sys.column_store_segments, sys.column_store_dictionarieseller sys.dm_db_column_store_row_group_physical_stats.

Kolumner som använder någon av följande datatyper kan inte ingå i ett kolumnlagringsindex:

  • ntext, textoch bild
  • nvarchar(max), varchar(max)och varbinary(max)1
  • rowversion (och tidsstämpel)
  • sql_variant
  • CLR-typer (hierarkiid och rumsliga typer)
  • XML-
  • uniqueidentifier2

1 gäller för SQL Server 2016 (13.x) och tidigare versioner samt icke-illustrerade kolumnlagringsindex.

2 gäller för SQL Server 2012 (11.x).

Icke-illustrerade kolumnlagringsindex:

  • Det går inte att ha fler än 1 024 kolumner.
  • Det går inte att skapa som ett begränsningsbaserat index. Det är möjligt att ha unika begränsningar, primära nyckelbegränsningar och begränsningar för sekundärnyckel i en tabell med ett kolumnlagringsindex. Begränsningar tillämpas alltid med ett radlagringsindex. Begränsningar kan inte tillämpas med ett kolumnlagringsindex (grupperat eller icke-grupperat).
  • Det går inte att inkludera en gles kolumn.
  • Det går inte att ändra med alter index-instruktionen. Om du vill ändra det icke-illustrerade indexet måste du släppa och återskapa kolumnlagringsindexet i stället. Du kan använda ALTER INDEX för att inaktivera och återskapa ett kolumnlagringsindex.
  • Det går inte att skapa med nyckelordet INCLUDE.
  • Kan ange nyckelorden ASC eller DESC i listan med indexkolumner för ett icke-grupperat kolumnlagringsindex i Azure SQL Database, SQL Database i Microsoft Fabric och Azure SQL Managed Instance med Princip för uppdateringalltidup-to- datum. Mer information finns i Prestandajustering med ordnade columnstore-index.
    • Det går inte att ta med nyckelorden ASC eller DESC i listan med indexkolumner i andra produkter. Kolumnlagringsindex sorteras enligt komprimeringsalgoritmerna.
  • Det går inte att inkludera LOB-kolumner av typen nvarchar(max), varchar(max)och varbinary(max) i icke-illustrerade kolumnlagringsindex. Endast grupperade kolumnlagringsindex stöder LOB-typer, från och med SQL Server 2017 -versionen (14.x), Azure SQL Database (konfigurerad på Premium-nivå, Standardnivå (S3 och senare) och alla vCore-erbjudandenivåer). Tidigare versioner stöder inte LOB-typer i grupperade och icke-grupperade kolumnlagringsindex.
  • Från och med SQL Server 2016 (13.x) kan du skapa ett icke-grupperat kolumnlagringsindex i en indexerad vy.

Columnstore-index kan inte kombineras med följande funktioner:

  • Beräknade kolumner. Från och med SQL Server 2017 (14.x) kan ett grupperat kolumnlagringsindex innehålla en icke-bevarad beräknad kolumn. I SQL Server 2017 (14.x) kan dock klustrade kolumnlagringsindex inte innehålla beständiga beräknade kolumner och du kan inte skapa icke-illustrerade index på beräknade kolumner.
  • Sid- och radkomprimering och vardecimalt lagringsformat. (Ett kolumnlagringsindex har redan komprimerats i ett annat format.)
  • Replikering med grupperade kolumnlagringsindex. Icke-grupperade columnstore-index stöds. Mer information finns i sp_addarticle.
  • Filström.

Du kan inte använda markörer eller utlösare i en tabell med ett grupperat kolumnlagringsindex. Den här begränsningen gäller inte för icke-illustrerade kolumnlagringsindex. Du kan använda markörer och utlösare i en tabell med ett icke-grupperat kolumnlagringsindex.

SQL Server 2014 (12.x) specifika begränsningar:

Följande begränsningar gäller endast för SQL Server 2014 (12.x). I den här versionen kan du använda uppdateringsbara, klustrade columnstore-index. Icke-illustrerade kolumnlagringsindex är fortfarande skrivskyddade.

  • Ändringsspårning. Du kan inte använda ändringsspårning med kolumnlagringsindex.
  • Ändra datainsamling. Den här funktionen kan inte aktiveras i tabeller med ett grupperat columnstore-index. Från och med SQL Server 2016 (13.x) kan ändringsdatainsamling aktiveras i tabeller med ett icke-illustrerat kolumnlagringsindex.
  • Läsbar sekundär. Du kan inte komma åt ett grupperat kolumnlagringsindex (CCI) från en läsbar sekundär i en AlwaysOn-läsbar tillgänglighetsgrupp. Du kan komma åt ett NCCI (nonclustered columnstore index) från en läsbar sekundär.
  • Flera aktiva resultatuppsättningar (MARS). SQL Server 2014 (12.x) använder den här funktionen för skrivskyddade anslutningar till tabeller med ett kolumnlagringsindex. SQL Server 2014 (12.x) stöder dock inte den här funktionen för samtidiga DML-åtgärder (datamanipuleringsspråk) i en tabell med ett kolumnlagringsindex. Om du försöker använda funktionen för detta ändamål avslutar SQL Server anslutningarna och avbryter transaktionerna.
  • Det går inte att skapa icke-illustrerade kolumnlagringsindex i en vy eller i en indexerad vy.

Information om prestandafördelar och begränsningar för kolumnlagringsindex finns i Columnstore-index: Översikt.

Metadata

Alla kolumner i ett kolumnlagringsindex lagras i metadata som inkluderade kolumner. Kolumnlagringsindexet har inga nyckelkolumner. Följande systemvyer innehåller information om kolumnlagringsindex:

Exempel: konvertera tabell från radlagring till kolumnarkiv

A. Konvertera en heap till ett grupperat kolumnlagringsindex

Det här exemplet skapar en tabell som en heap och konverterar den sedan till ett grupperat columnstore-index med namnet cci_Simple. När du skapar det klustrade kolumnlagringsindexet ändras lagringen för hela tabellen från radlagring till kolumnarkiv.

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. Konvertera ett grupperat index till ett grupperat kolumnlagringsindex med samma namn

Det här exemplet skapar en tabell med klustrat index och visar sedan syntaxen för att konvertera det klustrade indexet till ett grupperat kolumnlagringsindex. När du skapar det klustrade kolumnlagringsindexet ändras lagringen för hela tabellen från radlagring till kolumnarkiv.

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. Hantera icke-illustrerade index när du konverterar en radlagringstabell till ett columnstore-index

Det här exemplet visar hur du hanterar icke-illustrerade index när du konverterar en radlagringstabell till ett kolumnlagringsindex. Från och med SQL Server 2016 (13.x) krävs ingen särskild åtgärd. SQL Server definierar och återskapar automatiskt de icke-grupperade indexen på det nya klustrade kolumnlagringsindexet.

Om du vill släppa de icke-grupperade indexen använder du DROP INDEX-instruktionen innan du skapar kolumnlagringsindexet. Alternativet DROP EXISTING släpper bara det klustrade index som konverteras. Den släpper inte de icke-illustrerade indexen.

I SQL Server 2012 (11.x) och SQL Server 2014 (12.x) kan du inte skapa ett icke-illustrerat index i ett kolumnlagringsindex.

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

Endast för SQL Server 2012 (11.x) och SQL Server 2014 (12.x) måste du släppa de icke-illustrerade indexen för att skapa kolumnlagringsindexet.

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. Konvertera en stor faktatabell från radarkiv till kolumnarkiv

Det här exemplet förklarar hur du konverterar en stor faktatabell från en radlagringstabell till en kolumnlagringstabell.

  1. Skapa en liten tabell som ska användas i det här exemplet.

    --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. Ta bort alla icke-grupperade index från radlagringstabellen. Du kanske vill skript ut indexen för att återskapa dem senare.

    --Drop all nonclustered indexes
    DROP INDEX my_index ON dbo.MyFactTable;
    
  3. Konvertera radlagringstabellen till en kolumnlagringstabell med ett grupperat columnstore-index.

    Leta först upp namnet på det befintliga klustrade radlagringsindexet. I steg 1 anger vi namnet på indexet till IDX_CL_MyFactTable. Om indexnamnet inte angavs fick det ett automatiskt genererat unikt indexnamn. Du kan hämta det automatiskt genererade namnet med följande exempelfråga:

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

    Alternativ 1: Ta bort det befintliga klustrade indexet IDX_CL_MyFactTableoch konvertera MyFactTable till columnstore. Ändra namnet på det nya klustrade kolumnlagringsindexet.

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

    Alternativ 2: Konvertera till columnstore och återanvänd det befintliga klustrade indexnamnet för radlagring.

    --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. Konvertera en kolumnlagringstabell till en radlagringstabell med ett grupperat index

Om du vill konvertera en kolumnlagringstabell till en radlagringstabell med ett grupperat index använder du create index-instruktionen med alternativet DROP_EXISTING.

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

F. Konvertera en kolumnlagringstabell till en radlagringshög

Om du vill konvertera en kolumnlagringstabell till en radlagringshög släpper du det klustrade kolumnlagringsindexet. Detta rekommenderas vanligtvis inte, men vissa kan ha smala användningsområden. Mer information om heaps finns i Heaps (tabeller utan klustrade index).

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

G. Defragmentering genom att ordna om kolumnlagringsindexet

Det finns två sätt att underhålla det klustrade kolumnlagringsindexet. Från och med SQL Server 2016 (13.x) använder du ALTER INDEX...REORGANIZE i stället för REBUILD. Mer information finns i Columnstore index rowgroup. I tidigare versioner av SQL Server kan du använda CREATE CLUSTERED COLUMNSTORE INDEX med DROP_EXISTING=ON eller ALTER INDEX (Transact-SQL) och alternativet REBUILD. Båda metoderna uppnådde samma resultat.

Börja med att bestämma namnet på det klustrade kolumnlagringsindexet i 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';

Ta bort fragmentering genom att utföra en REORGANIZE på kolumnlagringsindexet.

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

Exempel för icke-illustrerade kolumnlagringsindex

A. Skapa ett columnstore-index som ett sekundärt index i en radlagringstabell

I det här exemplet skapas ett icke-grupperat kolumnlagringsindex i en radlagringstabell. Endast ett kolumnlagringsindex kan skapas i den här situationen. Kolumnlagringsindexet kräver extra lagringsutrymme eftersom det innehåller en kopia av data i radlagringstabellen. I det här exemplet skapas en enkel tabell och ett rowstore-grupperat index och visar sedan syntaxen för att skapa ett icke-grupperat kolumnlagringsindex.

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. Skapa ett grundläggande icke-grupperat kolumnlagringsindex med hjälp av alla alternativ

I följande exempel visas syntaxen för att skapa ett icke-grupperat kolumnlagringsindex i standardfilgruppen och anger maxgraderna för parallellitet (MAXDOP) som 2.

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

C. Skapa ett icke-grupperat kolumnlagringsindex med ett filtrerat predikat

I följande exempel skapas ett filtrerat, icke-grupperat kolumnarkivindex i Production.BillOfMaterials-tabellen i AdventureWorks2022 exempeldatabas. Filterpredikatet kan innehålla kolumner som inte är nyckelkolumner i det filtrerade indexet. Predikatet i det här exemplet väljer bara de rader där EndDate inte är NULL.

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

D. Ändra data i ett icke-grupperat kolumnlagringsindex

Gäller för: SQL Server 2012 (11.x) via SQL Server 2014 (12.x).

I SQL Server 2014 (12.x) och tidigare versioner kan du inte direkt ändra data i tabellen när du har skapat ett icke-grupperat kolumnlagringsindex på en tabell. En fråga med INSERT, UPDATE, DELETE eller MERGE misslyckas och returnerar ett felmeddelande. Här följer alternativ som du kan använda för att lägga till eller ändra data i tabellen:

  • Inaktivera eller släpp kolumnlagringsindexet. Du kan sedan uppdatera data i tabellen. Om du inaktiverar columnstore-indexet kan du återskapa kolumnlagringsindexet när du har uppdaterat data. Till exempel:

    ALTER INDEX mycolumnstoreindex ON dbo.mytable DISABLE;
    
    -- update the data in mytable as necessary
    ALTER INDEX mycolumnstoreindex on dbo.mytable REBUILD;
    
  • Läs in data i en mellanlagringstabell som inte har något kolumnlagringsindex. Skapa ett columnstore-index i mellanlagringstabellen. Växla mellanlagringstabellen till en tom partition i huvudtabellen.

  • Växla en partition från tabellen med kolumnlagringsindexet till en tom mellanlagringstabell. Om det finns ett columnstore-index i mellanlagringstabellen inaktiverar du kolumnlagringsindexet. Utför eventuella uppdateringar. Skapa (eller återskapa) kolumnlagringsindexet. Växla tillbaka mellanlagringstabellen till partitionen (nu tom) i huvudtabellen.

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

A. Ändra ett grupperat index till ett grupperat kolumnlagringsindex

Genom att använda instruktionen CREATE CLUSTERED COLUMNSTORE INDEX med DROP_EXISTING = ON kan du:

  • Ändra ett grupperat index till ett grupperat kolumnlagringsindex.

  • Återskapa ett grupperat columnstore-index.

I det här exemplet skapas den xDimProduct tabellen som en radlagringstabell med ett grupperat index. I exemplet används CREATE CLUSTERED COLUMNSTORE INDEX för att ändra tabellen från en radlagringstabell till en kolumnlagringstabell.

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

Leta upp namnet på det klustrade index som skapas automatiskt för den nya tabellen i systemmetadata med hjälp av sys.indexes. Till exempel:

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

Nu kan du välja att:

  1. Släpp det befintliga klustrade kolumnlagringsindexet med ett automatiskt skapat namn och skapa sedan ett nytt grupperat kolumnlagringsindex med ett användardefinierat namn.
  2. Släpp och ersätt det befintliga indexet med ett grupperat kolumnlagringsindex och behåll samma systemgenererade namn, till exempel ClusteredIndex_1bd8af8797f7453182903cc68df48541.

Till exempel:

--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. Återskapa ett grupperat columnstore-index

Det här exemplet bygger på föregående exempel och använder CREATE CLUSTERED COLUMNSTORE INDEX för att återskapa det befintliga klustrade kolumnlagringsindexet, som kallas cci_xDimProduct.

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

C. Ändra namnet på ett grupperat kolumnlagringsindex

Om du vill ändra namnet på ett grupperat kolumnlagringsindex släpper du det befintliga klustrade kolumnlagringsindexet och återskapar sedan indexet med ett nytt namn.

Vi rekommenderar att du begränsar den här åtgärden till en liten eller tom tabell. Det tar lång tid att släppa ett stort, klustrat kolumnlagringsindex och återskapa med ett annat namn.

Det här exemplet refererar till det cci_xDimProduct klustrade kolumnlagringsindexet från föregående exempel. Det här exemplet tar bort det cci_xDimProduct klustrade kolumnlagringsindexet och återskapar sedan det klustrade kolumnlagringsindexet med namnet 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. Konvertera en kolumnlagringstabell till en radlagringstabell med ett grupperat index

Det kan finnas en situation där du vill släppa ett grupperat columnstore-index och skapa ett grupperat index. När du släpper ett grupperat kolumnlagringsindex ändras tabellen till radlagringsformatet. I det här exemplet konverteras en kolumnlagringstabell till en radlagringstabell med ett grupperat index med samma namn. Inga data går förlorade. Alla data går till radlagringstabellen och de listade kolumnerna blir nyckelkolumnerna i det klustrade indexet.

--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. Konvertera en columnstore-tabell tillbaka till en radlagringshög

Använd DROP INDEX för att släppa det klustrade kolumnlagringsindexet och konvertera tabellen till en radlagringshög. I det här exemplet konverteras tabellen cci_xDimProduct till en radlagringshög. Tabellen fortsätter att distribueras, men lagras som en heap.

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

F. Skapa ett ordnat grupperat columnstore-index i en tabell utan index

Ett osorterat kolumnlagringsindex omfattar alla kolumner som standard, utan att behöva ange en kolumnlista. Med ett ordnat kolumnlagringsindex kan du ange ordningen på kolumnerna. Listan behöver inte innehålla alla kolumner.

Mer information finns i Prestandajustering med ordnade columnstore-index.

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

G. Konvertera ett grupperat columnstore-index till ett ordnat grupperat columnstore-index

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

H. Lägg till en kolumn i ordningen för ett ordnat grupperat kolumnlagringsindex

Du kan ange en ordning för kolumnerna i ett kolumnlagringsindex. Det ursprungliga sorterade, klustrade kolumnlagringsindexet beställdes endast på den SHIPDATE kolumnen. I följande exempel läggs kolumnen PRODUCTKEY till i ordningen. Information om tillgänglighet för ordnat columnstore-index finns i Columnstore-index: Översikt.

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

Jag. Ändra ordningstalet för ordnade kolumner

Det ursprungliga sorterade, klustrade kolumnlagringsindexet beställdes på SHIPDATE, PRODUCTKEY. I följande exempel ändras ordningen till PRODUCTKEY, SHIPDATE. Information om tillgänglighet för ordnat columnstore-index finns i Columnstore-index: Översikt.

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

J. Skapa ett ordnat grupperat columnstore-index

Du kan skapa ett grupperat columnstore-index med beställningsnycklar. När du skapar ett ordnat grupperat columnstore-index bör du använda frågetipset MAXDOP = 1 för högsta sorteringskvalitet och kortaste varaktighet. Information om tillgänglighet för ordnat columnstore-index finns i Columnstore-index: Översikt.

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