Condividi tramite


CREATE COLUMNSTORE INDEX (Transact-SQL)

Si applica a:SQL ServerAzure SQL DatabaseIstanza gestita di Azure SQLAzure Synapse AnalyticsPiattaforma di analisi (PDW)Database SQL in Microsoft Fabric

Convertire una tabella rowstore in un indice columnstore cluster o creare un indice columnstore non cluster. Usare un indice columnstore per eseguire in modo efficiente analisi operativa in tempo reale in un carico di lavoro OLTP o per migliorare la compressione dei dati e le prestazioni delle query per i carichi di lavoro di data warehousing.

Per i miglioramenti più recenti a questa funzionalità, vedere Novità degli indici columnstore .

  • Gli indici columnstore cluster ordinati sono stati introdotti in SQL Server 2022 (16.x). Per altre informazioni, vedere CREATE COLUMNSTORE INDEX. Per la disponibilità degli indici Columnstore ordinati, vedere indici Columnstore: Panoramica.

  • A partire da SQL Server 2016 (13.x), è possibile creare la tabella come indice columnstore cluster. Non è più necessario creare prima una tabella rowstore e quindi convertirla in un indice columnstore cluster.

  • Per informazioni sulle linee guida per la progettazione degli indici columnstore, vedere Indicazioni sulla progettazione degli indici columnstore.

Convenzioni relative alla sintassi Transact-SQL

Sintassi

Sintassi per il database SQL di Azure eAUTD di Istanza gestita di SQL di Azure:

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

Sintassi per SQL Server:

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

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

<with_option> ::=
      DROP_EXISTING = { ON | OFF } -- default is OFF
    | MAXDOP = max_degree_of_parallelism
    | ONLINE = { ON | OFF }
    | COMPRESSION_DELAY  = { 0 | delay [ MINUTES ] }
    | DATA_COMPRESSION = { COLUMNSTORE | COLUMNSTORE_ARCHIVE }
      [ ON PARTITIONS ( { partition_number_expression | range } [ , ...n ] ) ]

<on_option>::=
      partition_scheme_name ( column_name )
    | filegroup_name
    | "default"

<filter_expression> ::=
      column_name IN ( constant [ , ...n ]
    | column_name { IS | IS NOT | = | <> | != | > | >= | !> | < | <= | !< } constant )

Sintassi per 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
[;]

Disponibilità della versione

Alcune delle opzioni non sono disponibili in tutte le versioni del motore di database. La tabella seguente illustra le versioni in cui vengono introdotte le opzioni negli indici columnstore cluster e columnstore non cluster:

Opzione raggruppato NON CLUSTER
COMPRESSION_DELAY SQL Server 2016 (13.x) SQL Server 2016 (13.x)
Compressione_dati SQL Server 2016 (13.x) SQL Server 2016 (13.x)
IN LINEA SQL Server 2019 (15.x) SQL Server 2017 (14.x)
Clausola WHERE Non disponibile SQL Server 2016 (13.x)
Clausola ORDER SQL Server 2016 (13.x) Anteprima di SQL Server 2025 (17.x)

Tutte le opzioni sono disponibili nel database SQL di Azure enell'AUTD di Istanza gestita di SQL di Azure.

Per altri dettagli sulla disponibilità delle funzionalità, vedere Novità negli indici columnstore.

Argomenti

CREARE UN INDICE COLUMNSTORE CLUSTER

Creare un indice columnstore cluster in cui tutti i dati vengono compressi e archiviati per colonna. L'indice include tutte le colonne della tabella e archivia l'intera tabella. Se la tabella esistente è un heap o un indice cluster, viene convertita in un indice columnstore cluster. Se la tabella è già archiviata come indice columnstore cluster, l'indice esistente viene eliminato e ricompilato.

Importante

Nel database SQL in Fabric è necessario creare un indice columnstore cluster all'interno dello stesso batch o transazione a cui appartiene la tabella a cui appartiene. L'aggiunta di un indice columnstore cluster a una tabella dopo che è già stata creata può generare l'errore seguente:

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

index_name

Specifica il nome del nuovo indice.

Se la tabella ha già un indice columnstore cluster, è possibile specificare lo stesso nome dell'indice esistente oppure usare l'opzione DROP EXISTING per specificare un nuovo nome.

ON [ database_name. [ schema_name ]. | schema_name . ] table_name

Specifica il nome di una, due o tre parti della tabella da archiviare come indice columnstore cluster. Se la tabella è un heap o ha un indice cluster, la tabella viene convertita da un rowstore a un columnstore. Se la tabella è già un columnstore, questa istruzione ricompila l'indice columnstore cluster.

ORDER per columnstore cluster

Usare la column_store_order_ordinal colonna in sys.index_columns per determinare l'ordine delle colonne per un indice columnstore cluster. L'ordinamento columnstore facilita l'eliminazione dei segmenti, in particolare con i dati stringa. Per altre informazioni, vedere Ottimizzazione delle prestazioni con indici columnstore ordinati e indici Columnstore - Linee guida per la progettazione.

Per eseguire la conversione in un indice columnstore cluster ordinato, l'indice esistente deve essere un indice columnstore cluster. Usare l'opzione DROP_EXISTING.

I tipi di dati LOB (tipi di dati di lunghezza massima) non possono essere la chiave di un indice columnstore cluster ordinato.

Quando si crea un indice columnstore cluster ordinato, usare l'opzione MAXDOP = 1 per l'ordinamento di qualità più elevata, in cambio di una durata significativamente più lunga dell'istruzione CREATE INDEX . Per creare l'indice il più velocemente possibile, non limitare MAXDOP. La massima qualità di compressione e ordinamento può aiutare le query sull'indice columnstore.

Per la disponibilità degli indici Columnstore ordinati, vedere indici Columnstore: Panoramica.

Opzioni WITH

DROP_EXISTING = [OFF] | SU

DROP_EXISTING = ON specifica di eliminare l'indice esistente e di creare un nuovo indice columnstore.

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

Il valore predefinito, DROP_EXISTING = OFF, prevede che il nome dell'indice corrisponda al nome esistente. Se il nome di indice specificato esiste già, si verifica un errore.

MAXDOP = max_degree_of_parallelism

Questa opzione può eseguire l'override della configurazione del server di massimo grado di parallelismo esistente durante l'operazione sull'indice. Usare MAXDOP per limitare il numero di processori usati in un'esecuzione di piano parallela. Il massimo è 64 processori.

max_degree_of_parallelism valori possono essere:

  • 1, ovvero eliminare la generazione di piani paralleli.
  • >1, ovvero limitare il numero massimo di processori usati in un'operazione di indice parallela al numero specificato, o meno, in base al carico di lavoro di sistema corrente. Ad esempio, quando MAXDOP = 4, il numero di processori usati è 4 o minore.
  • 0 (impostazione predefinita), ovvero usare il numero effettivo di processori, o meno, in base al carico di lavoro del sistema corrente.
CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
WITH (MAXDOP = 2);

Per altre informazioni, vedere Configurazione del server: max degree of parallelism e Configure Parallel Index Operations.For more information, see Server configuration: max degree of parallelism, and Configure Parallel Index Operations.

COMPRESSION_DELAY = 0 | delay [ MINUTES ]

Per una tabella basata su disco, il ritardo specifica il numero minimo di minuti che un rowgroup differenziale nello stato chiuso deve rimanere nel rowgroup differenziale. SQL Server può quindi comprimerlo nel rowgroup compresso. Poiché le tabelle basate su disco non tengono traccia dei tempi di inserimento e aggiornamento nelle singole righe, SQL Server applica il ritardo ai rowgroup differenziali nello stato chiuso.

Il valore predefinito è 0 minuti.

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

Per consigli su quando usare COMPRESSION_DELAY, vedere Introduzione a Columnstore per l'analisi operativa in tempo reale.

DATA_COMPRESSION = COLUMNSTORE | COLUMNSTORE_ARCHIVE

Specifica l'opzione di compressione dei dati per la tabella, il numero di partizione o l'intervallo di partizioni specificati. Le opzioni sono le seguenti:

  • COLUMNSTORE è l'impostazione predefinita e specifica di comprimere con la compressione columnstore più efficiente. Questa opzione è la scelta tipica.
  • COLUMNSTORE_ARCHIVE comprime ulteriormente la tabella o la partizione in una dimensione inferiore. Usare questa opzione per situazioni come l'archiviazione, che richiede dimensioni di archiviazione inferiori e può consentire più tempo per l'archiviazione e il recupero.
CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
WITH ( DATA_COMPRESSION = COLUMNSTORE_ARCHIVE );

Per altre informazioni sulla compressione, vedere Compressione dei dati.

ONLINE = [ON | OFF]
  • ON specifica che l'indice columnstore rimane online e disponibile, mentre viene compilata la nuova copia dell'indice.
  • OFF specifica che l'indice non è disponibile per l'uso durante la compilazione della nuova copia.
CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
WITH ( ONLINE = ON );

Opzioni ON

Con queste opzioni, è possibile specificare opzioni per l'archiviazione dei dati, ad esempio uno schema di partizione, un filegroup specifico o il filegroup predefinito. Se l'opzione ON non è specificata, l'indice usa le impostazioni della partizione o del filegroup della tabella esistente.

partition_scheme_name ( column_name ) specifica lo schema di partizione per la tabella. Lo schema di partizione deve esistere già nel database. Per creare lo schema di partizione, vedere CREATE PARTITION SCHEME (Transact-SQL).

column_name specifica la colonna su cui è partizionato un indice partizionato. Questa colonna deve corrispondere al tipo di dati, alla lunghezza e alla precisione dell'argomento della funzione di partizione usata partition_scheme_name .

filegroup_name specifica il filegroup per l'archiviazione dell'indice columnstore cluster. Se non viene specificata alcuna posizione e la tabella non è partizionata, l'indice usa lo stesso filegroup della tabella o della vista sottostante. Il filegroup deve già esistere.

Per creare l'indice nel filegroup predefinito, usare "default" o [default]. Se si specifica "default", l'opzione QUOTED_IDENTIFIER deve essere ON per la sessione corrente. QUOTED_IDENTIFIER è ON per impostazione predefinita. Per altre informazioni, vedere SET QUOTED_IDENTIFIER (Transact-SQL).

CREATE [NONCLUSTERED] COLUMNSTORE INDEX

Creare un indice columnstore non cluster in una tabella rowstore archiviata come heap o indice cluster. L'indice può avere una condizione filtrata e non deve includere tutte le colonne della tabella sottostante. L'indice columnstore richiede spazio sufficiente per archiviare una copia dei dati. È possibile aggiornare l'indice e viene aggiornato man mano che viene modificata la tabella sottostante. L'indice columnstore non cluster in un indice cluster consente l'analisi in tempo reale.

index_name

Specifica il nome dell'indice. index_name deve essere univoco all'interno della tabella, ma non deve essere univoco all'interno del database. Devono essere anche conformi alle regole degli identificatori.

( colonna [ ,... n ] )

Specifica le colonne da archiviare. Un indice columnstore non cluster è limitato a 1.024 colonne.

Ogni colonna deve essere di un tipo di dati supportato per gli indici columnstore. Per un elenco dei tipi di dati supportati, vedere Limitazioni e restrizioni .

ON [ database_name. [ schema_name ]. | schema_name . ] table_name

Specifica il nome di una, due o tre parti della tabella che contiene l'indice.

ORDER per columnstore non cluster

Le colonne specificate nella ORDER clausola per un indice columnstore non cluster devono essere un subset delle colonne chiave per l'indice.

Utilizzare la column_store_order_ordinal colonna in sys.index_columns per determinare l'ordine delle colonne per un indice columnstore non cluster. L'ordinamento columnstore facilita l'eliminazione dei segmenti, in particolare con i dati stringa. Per altre informazioni, vedere Ottimizzazione delle prestazioni con indici columnstore ordinati e indici Columnstore - Linee guida per la progettazione. Le considerazioni sulla progettazione e sulle prestazioni in questi articoli si applicano in genere agli indici columnstore cluster e non cluster.

I tipi di dati LOB (i tipi di dati di lunghezza massima) non possono essere la chiave di un indice columnstore non cluster ordinato.

Quando si crea un indice columnstore non cluster ordinato, usare le MAXDOP = 1 opzioni per l'ordinamento di qualità più elevata, in cambio di una durata significativamente più lunga dell'istruzione CREATE INDEX . Per creare l'indice il più velocemente possibile, non limitare MAXDOP. La massima qualità di compressione e ordinamento può aiutare le query sull'indice columnstore.

Per la disponibilità dell'indice columnstore ordinato, vedere Disponibilità dell'indice columnstore ordinato.

Opzioni WITH

DROP_EXISTING = [OFF] | SU

DROP_EXISTING = ON L'indice esistente viene eliminato e ricompilato. Il nome dell'indice specificato deve essere uguale a un indice attualmente esistente; Tuttavia, la definizione dell'indice può essere modificata. Ad esempio, è possibile specificare colonne diverse o opzioni di indice.

DROP_EXISTING = OFF
Se il nome di indice specificato esiste già, viene visualizzato un errore. Non è possibile modificare il tipo di indice usando DROP_EXISTING. Nella sintassi compatibile con le versioni precedenti, WITH DROP_EXISTING equivale a WITH DROP_EXISTING = ON.

MAXDOP = max_degree_of_parallelism

Esegue l'override dell'opzione di configurazione Server: max degree of parallelism durante l'operazione sull'indice. Usare MAXDOP per limitare il numero di processori usati in un'esecuzione di piano parallela. Il massimo è 64 processori.

max_degree_of_parallelism valori possono essere:

  • 1, ovvero eliminare la generazione di piani paralleli.
  • >1, ovvero limitare il numero massimo di processori usati in un'operazione di indice parallela al numero specificato, o meno, in base al carico di lavoro di sistema corrente. Ad esempio, quando MAXDOP = 4, il numero di processori usati è 4 o minore.
  • 0 (impostazione predefinita), ovvero usare il numero effettivo di processori o meno in base al carico di lavoro del sistema corrente.

Per altre informazioni, vedere Configurazione di operazioni parallele sugli indici.

Annotazioni

Le operazioni parallele sugli indici non sono disponibili in ogni edizione di Microsoft SQL Server. Per un elenco delle funzionalità supportate dalle varie edizioni di SQL Server, vedere Edizioni e funzionalità supportate di SQL Server 2022.

ONLINE = [ON | OFF]
  • ON specifica che l'indice columnstore rimane online e disponibile, mentre viene compilata la nuova copia dell'indice.
  • OFF specifica che l'indice non è disponibile per l'uso durante la compilazione della nuova copia. In un indice non cluster, la tabella di base rimane disponibile. Solo l'indice columnstore non cluster non viene usato per soddisfare le query fino al completamento del nuovo indice.
CREATE COLUMNSTORE INDEX ncci ON Sales.OrderLines (StockItemID, Quantity, UnitPrice, TaxRate)
WITH ( ONLINE = ON );
COMPRESSION_DELAY = 0 | delay [ MINUTES ]

Specifica un limite inferiore per quanto tempo una riga deve rimanere in un rowgroup differenziale, prima che sia idonea per la migrazione a un rowgroup compresso. Ad esempio, è possibile dire che se una riga rimane invariata per 120 minuti, tale riga è idonea per la compressione in formato di archiviazione a colonne.

Per un indice columnstore nelle tabelle basate su disco, l'ora in cui una riga è stata inserita o aggiornata non viene rilevata. Al contrario, il tempo di chiusura del rowgroup differenziale viene usato come proxy per la riga. La durata predefinita è 0 minuti. Viene eseguita la migrazione di una riga all'archiviazione a colonne dopo un accumulo di 1 milione di righe nel rowgroup differenziale e viene contrassegnata come chiusa.

Compressione_dati

Specifica l'opzione di compressione dei dati per la tabella, il numero di partizione o l'intervallo di partizioni specificati. Si applica solo agli indici columnstore, inclusi cluster e non cluster. Le opzioni sono le seguenti:

  • COLUMNSTORE è l'impostazione predefinita e specifica di comprimere con la compressione columnstore più efficiente. Questa opzione è la scelta tipica.
  • COLUMNSTORE_ARCHIVE comprime ulteriormente la tabella o la partizione in una dimensione inferiore. È possibile usare questa opzione per l'archiviazione o per altre situazioni che richiedono dimensioni di archiviazione inferiori e possono consentire più tempo per l'archiviazione e il recupero.

Per altre informazioni sulla compressione, vedere Compressione dei dati.

WHERE <filter_expression> [ AND <filter_expression> ]

Chiamata predicato di filtro, questa opzione specifica le righe da includere nell'indice. SQL Server crea statistiche filtrate sulle righe di dati nell'indice filtrato.

Il predicato di filtro usa una logica di confronto semplice. I confronti che usano NULL valori letterali non sono consentiti con gli operatori di confronto. Usare invece gli IS NULL operatori e IS NOT NULL .

Ecco alcuni esempi di predicati di filtro per la Production.BillOfMaterials tabella:

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

Per indicazioni sugli indici filtrati, vedere Creare indici filtrati.

Opzioni ON

Le opzioni seguenti specificano i filegroup in cui viene creato l'indice.

partition_scheme_name ( column_name )

Specifica lo schema di partizione che definisce i filegroup in cui vengono mappate le partizioni di un indice partizionato. Lo schema di partizione deve esistere all'interno del database eseguendo CREATE PARTITION SCHEME.

column_name specifica la colonna su cui è partizionato un indice partizionato. Questa colonna deve corrispondere al tipo di dati, alla lunghezza e alla precisione dell'argomento della funzione di partizione usata partition_scheme_name . column_name non è limitato alle colonne nella definizione dell'indice. Quando si partiziona un indice columnstore, motore di database aggiunge la colonna di partizionamento come colonna dell'indice, se non è già specificata.

Se la tabella è partizionata e partition_scheme_name o filegroup non vengono specificati, l'indice viene inserito nello stesso schema di partizione e usa la stessa colonna di partizionamento della tabella sottostante.

Un indice columnstore in una tabella partizionata deve essere allineato alla partizione. Per altre informazioni sul partizionamento degli indici, vedere Tabelle e indici partizionati.

filegroup_name

Specifica un nome di filegroup in cui creare l'indice. Se filegroup_name non viene specificato e la tabella non è partizionata, l'indice usa lo stesso filegroup della tabella sottostante. Il filegroup deve già esistere.

predefinito

Crea l'indice specificato nel filegroup predefinito.

Il termine predefinito, in questo contesto, non è una parola chiave. Si tratta di un identificatore per il filegroup predefinito e deve essere delimitato, come in ON "default" o ON [default]. Se "default" viene specificato, l'opzione QUOTED_IDENTIFIER deve essere IMPOSTATA per la sessione corrente, ovvero l'impostazione predefinita. Per altre informazioni, vedere SET QUOTED_IDENTIFIER.

Autorizzazioni

È necessario disporre dell'autorizzazione ALTER sulla tabella.

Osservazioni:

È possibile creare un indice columnstore in una tabella temporanea. Quando la tabella viene eliminata o la sessione termina, viene eliminato anche l'indice.

Nel database SQL di Infrastruttura le tabelle con indici columnstore cluster non vengono rispecchiate in Fabric OneLake.

Indici filtrati

Un indice filtrato è un indice ottimizzato, non cluster, adatto per le query che selezionano una piccola percentuale di righe da una tabella. Usa un predicato di filtro per indicizzare una parte dei dati nella tabella. Un indice filtrato ben progettato può migliorare le prestazioni delle query, ridurre i costi di archiviazione e ridurre i costi di manutenzione.

Opzioni SET necessarie per gli indici filtrati

Le opzioni SET nella colonna valore obbligatorio sono necessarie ogni volta che si verifica una delle condizioni seguenti:

  • Si crea un indice filtrato.
  • Un'operazione INSERT, UPDATE, DELETE o MERGE modifica i dati in un indice filtrato.
  • Query Optimizer usa l'indice filtrato per produrre il piano di query.
Opzioni SET Valore obbligatorio Valore server predefinito Valore OLE DB e ODBC predefinito Valore DB-Library predefinito
ANSI_NULLS ATTIVO ATTIVO ATTIVO SPENTO
ANSI_PADDING (impostazione di riempimento ANSI) ATTIVO ATTIVO ATTIVO SPENTO
ANSI_WARNINGS 1 ATTIVO ATTIVO ATTIVO SPENTO
ARITHABORT ATTIVO ATTIVO SPENTO SPENTO
CONCAT_NULL_YIELDS_NULL (Quando concatenato a NULL, il risultato è NULL) ATTIVO ATTIVO ATTIVO SPENTO
NUMERIC_ROUNDABORT SPENTO SPENTO SPENTO SPENTO
IDENTIFICATORE_QUOTATO ATTIVO ATTIVO ATTIVO SPENTO

1 L'impostazione di ANSI_WARNINGS su ON imposta in modo implicito ARITHABORT su ON quando il livello di compatibilità del database è impostato su 90 o versione successiva. Se il livello di compatibilità del database è impostato su 80 o versioni precedenti, è necessario impostare in modo esplicito l'opzione ARITHABORT su ON.

Se le opzioni SET non sono corrette, possono verificarsi le condizioni seguenti:

  • L'indice filtrato non viene creato.

  • Il motore di database genera un errore ed esegue il rollback di istruzioni INSERT, UPDATE, DELETE o MERGE che modificano i dati nell'indice.

  • Query Optimizer non considera l'indice nel piano di esecuzione per le istruzioni Transact-SQL.

Per altre informazioni sugli indici filtrati, vedere Creare indici filtrati.

Limitazioni e restrizioni

Ogni colonna in un indice columnstore deve essere di uno dei tipi di dati business comuni seguenti:

  • datetimeoffset [ ( n ) ]
  • datetime2 [ ( n ) ]
  • datetime
  • smalldatetime
  • dattero
  • time [ ( n ) ]
  • float [ ( n ) ]
  • real [ ( n ) ]
  • decimal [ ( precision [ , scale ] ) ]
  • numeric [ ( precision [ , scale ] ) ]
  • denaro
  • smallmoney
  • bigint
  • Int
  • piccoloint
  • tinyint
  • pezzo
  • nvarchar [ ( n ) ]
  • nvarchar(max)1
  • nchar [ ( n ) ]
  • varchar [ ( n ) ]
  • varchar(max)1
  • char [ ( n ) ]
  • varbinary [ ( n ) ]
  • varbinary(max)1
  • binary [ ( n ) ]
  • uniqueidentifier2

1 Si applica a SQL Server 2017 (14.x) e al database SQL di Azure al livello Premium, al livello Standard (S3 e versioni successive) e a tutti i livelli di offerte vCore, solo negli indici columnstore cluster.

2 Si applica a SQL Server 2014 (12.x) e versioni successive.

Se la tabella sottostante contiene una colonna di un tipo di dati non supportato per gli indici columnstore, è necessario omettere tale colonna dall'indice columnstore non cluster.

I dati LOB (Large Object) maggiori di 8 kilobyte vengono archiviati in una risorsa di archiviazione LOB fuori riga, con solo un puntatore alla posizione fisica archiviata all'interno del segmento di colonna. Le dimensioni dei dati archiviati non vengono segnalate in sys.column_store_segments, sys.column_store_dictionaries o sys.dm_db_column_store_row_group_physical_stats.

Le colonne che usano uno dei tipi di dati seguenti non possono essere incluse in un indice columnstore:

  • ntext, text e image
  • nvarchar(max), varchar(max)e varbinary(max)1
  • rowversion (e timestamp)
  • sql_variant
  • Tipi CLR (hierarchyid e tipi spaziali)
  • XML
  • uniqueidentifier2

1 Si applica a SQL Server 2016 (13.x) e alle versioni precedenti e agli indici columnstore non cluster.

2 Si applica a SQL Server 2012 (11.x).

Indici columnstore non cluster:

  • Non può contenere più di 1.024 colonne.
  • Non è possibile creare come indice basato su vincoli. È possibile avere vincoli univoci, vincoli di chiave primaria e vincoli di chiave esterna in una tabella con un indice columnstore. I vincoli vengono sempre applicati con un indice dell'archivio righe. I vincoli non possono essere applicati con un indice columnstore (cluster o non cluster).
  • Non è possibile includere una colonna di tipo sparse.
  • Non è possibile modificare usando l'istruzione ALTER INDEX. Per modificare l'indice non cluster, è necessario eliminare e ricreare l'indice columnstore. È possibile usare ALTER INDEX per disabilitare e ricompilare un indice columnstore.
  • Non è possibile creare usando la parola chiave INCLUDE.
  • Non è possibile specificare le ASC parole chiave o DESC nell'elenco delle colonne di indice. Gli indici columnstore vengono ordinati in base agli algoritmi di compressione.
  • Nel database SQL di Azure, il database SQL in Microsoft Fabric,L'AUTD di Istanza gestita di SQL di Azure e l'anteprima di SQL Server 2025 (17.x) possono essere ordinati includendo la ORDER clausola . Per altre informazioni, vedere Ottimizzazione delle prestazioni con indici columnstore ordinati.
  • Non è possibile includere colonne LOB di tipo nvarchar(max), varchar(max)e varbinary(max) in indici columnstore non cluster. Solo gli indici columnstore cluster supportano i tipi LOB, a partire dalla versione di SQL Server 2017 (14.x), il database SQL di Azure (configurato a livello Premium, livello Standard (S3 e versioni successive) e tutti i livelli di offerte vCore. Le versioni precedenti non supportano i tipi LOB negli indici columnstore cluster e non cluster.
  • A partire da SQL Server 2016 (13.x), è possibile creare un indice columnstore non cluster in una vista indicizzata.

Gli indici columnstore non possono essere combinati con le funzionalità seguenti:

  • Colonne calcolate. A partire da SQL Server 2017 (14.x), un indice columnstore cluster può contenere una colonna calcolata non persistente. Tuttavia, in SQL Server 2017 (14.x), gli indici columnstore cluster non possono contenere colonne calcolate persistenti e non è possibile creare indici non cluster in colonne calcolate.
  • Compressione di pagine e righe e formato di archiviazione vardecimal . Un indice columnstore è già compresso in un formato diverso.
  • Replica con indici columnstore cluster. Gli indici columnstore non cluster sono supportati. Per altre informazioni, vedere sp_addarticle.
  • Filestream.

Non è possibile usare cursori o trigger in una tabella con un indice columnstore cluster. Questa restrizione non si applica agli indici columnstore non cluster. È possibile usare cursori e trigger in una tabella con un indice columnstore non cluster.

Limitazioni specifiche di SQL Server 2014 (12.x):

Le limitazioni seguenti si applicano solo a SQL Server 2014 (12.x). In questa versione è possibile usare indici columnstore cluster aggiornabili. Gli indici columnstore non cluster sono ancora di sola lettura.

  • Rilevamento modifiche. Non è possibile usare il rilevamento delle modifiche con indici columnstore.
  • Change Data Capture. Questa funzionalità non può essere abilitata nelle tabelle con un indice columnstore cluster. A partire da SQL Server 2016 (13.x), Change Data Capture può essere abilitato nelle tabelle con un indice columnstore non cluster.
  • Secondario leggibile. Non è possibile accedere a un indice columnstore cluster (CCI) da un database secondario leggibile di un gruppo di disponibilità leggibile Always On. È possibile accedere a un indice columnstore non cluster da un database secondario leggibile.
  • Mars (Multiple Active Result Sets). SQL Server 2014 (12.x) usa questa funzionalità per le connessioni di sola lettura alle tabelle con un indice columnstore. Tuttavia, SQL Server 2014 (12.x) non supporta questa funzionalità per operazioni DML (Data Manipulation Language) simultanee in una tabella con un indice columnstore. Se si tenta di usare la funzionalità a questo scopo, SQL Server termina le connessioni e annulla le transazioni.
  • Non è possibile creare indici columnstore non cluster in una vista o in una vista indicizzata.

Per informazioni sui vantaggi e sulle limitazioni delle prestazioni degli indici columnstore, vedere Indici columnstore: Panoramica.

Metadati

Tutte le colonne di un indice columnstore vengono archiviate nei metadati come colonne incluse. L'indice columnstore non contiene colonne chiave. Le viste di sistema seguenti forniscono informazioni sugli indici columnstore:

Esempi: convertire la tabella da rowstore a columnstore

Un. Convertire un heap in un indice columnstore cluster

Questo esempio crea una tabella come heap e la converte in un indice columnstore cluster denominato cci_Simple. La creazione dell'indice columnstore cluster modifica lo spazio di archiviazione per l'intera tabella da rowstore a 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. Convertire un indice cluster in un indice columnstore cluster con lo stesso nome

In questo esempio viene creata una tabella con indice cluster e viene quindi illustrata la sintassi della conversione dell'indice cluster in un indice columnstore cluster. La creazione dell'indice columnstore cluster modifica lo spazio di archiviazione per l'intera tabella da rowstore a 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. Gestire gli indici non cluster durante la conversione di una tabella rowstore in un indice columnstore

In questo esempio viene illustrato come gestire gli indici non cluster quando si converte una tabella rowstore in un indice columnstore. A partire da SQL Server 2016 (13.x), non è necessaria alcuna azione speciale. SQL Server definisce e ricompila automaticamente gli indici non cluster nel nuovo indice columnstore cluster.

Per eliminare gli indici non cluster, usare l'istruzione DROP INDEX prima di creare l'indice columnstore. L'opzione DROP EXISTING elimina solo l'indice cluster che viene convertito. Non rilascia gli indici non cluster.

In SQL Server 2012 (11.x) e SQL Server 2014 (12.x) non è possibile creare un indice non cluster in un indice columnstore.

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

Solo per SQL Server 2012 (11.x) e SQL Server 2014 (12.x), è necessario eliminare gli indici non cluster per creare l'indice columnstore.

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. Convertire una tabella dei fatti di grandi dimensioni da rowstore a columnstore

In questo esempio viene illustrato come convertire una tabella dei fatti di grandi dimensioni da una tabella rowstore a una tabella columnstore.

  1. Creare una tabella di piccole dimensioni da usare in questo esempio.

    --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. Eliminare tutti gli indici non cluster dalla tabella rowstore. È possibile creare uno script degli indici per ricrearli in un secondo momento.

    --Drop all nonclustered indexes
    DROP INDEX my_index ON dbo.MyFactTable;
    
  3. Convertire la tabella rowstore in una tabella columnstore con un indice columnstore cluster.

    Cercare prima di tutto il nome dell'indice rowstore cluster esistente. Nel passaggio 1 il nome dell'indice viene impostato su IDX_CL_MyFactTable. Se il nome dell'indice non è stato specificato, viene assegnato un nome di indice univoco generato automaticamente. È possibile recuperare il nome generato automaticamente con la query di esempio seguente:

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

    Opzione 1: eliminare l'indice IDX_CL_MyFactTablecluster esistente e convertirlo MyFactTable in columnstore. Modificare il nome del nuovo indice columnstore cluster.

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

    Opzione 2: convertire in columnstore e riutilizzare il nome dell'indice cluster rowstore esistente.

    --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. Convertire una tabella columnstore in una tabella rowstore con un indice cluster

Per convertire una tabella columnstore in una tabella rowstore con un indice cluster, usare l'istruzione CREATE INDEX con l'opzione DROP_EXISTING .

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

F. Convertire una tabella columnstore in un heap rowstore

Per convertire una tabella columnstore in un heap rowstore, eliminare l'indice columnstore cluster. Questo non è in genere consigliato, ma può avere usi limitati. Per altre informazioni sugli heap, vedere Heaps (tabelle senza indici cluster).

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

G. Deframmentare riorganizzando l'indice columnstore

Esistono due modi per gestire l'indice columnstore cluster. A partire da SQL Server 2016 (13.x), usare ALTER INDEX...REORGANIZE anziché REBUILD. Per altre informazioni, vedere Rowgroup dell'indice columnstore. Nelle versioni precedenti di SQL Server è possibile usare CREATE CLUSTERED COLUMNSTORE INDEX con DROP_EXISTING=ON o ALTER INDEX (Transact-SQL) e l'opzione REBUILD. Entrambi i metodi hanno ottenuto gli stessi risultati.

Per iniziare, determinare il nome dell'indice columnstore cluster 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';

Rimuovere la frammentazione eseguendo un'operazione REORGANIZE nell'indice columnstore.

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

Esempi di indici columnstore non cluster

Un. Creare un indice columnstore come indice secondario in una tabella rowstore

In questo esempio viene creato un indice columnstore non cluster in una tabella rowstore. In questa situazione è possibile creare un solo indice columnstore. L'indice columnstore richiede spazio di archiviazione aggiuntivo, perché contiene una copia dei dati nella tabella rowstore. In questo esempio viene creata una tabella semplice e un indice cluster rowstore, quindi viene illustrata la sintassi di creazione di un indice columnstore non cluster.

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. Creare un indice columnstore non cluster di base usando tutte le opzioni

Nell'esempio seguente viene illustrata la sintassi di creazione di un indice columnstore non cluster nel filegroup DEFAULT, specificando i gradi massimi di parallelismo (MAXDOP) come 2.

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

C. Creare un indice columnstore non cluster con un predicato filtrato

Nell'esempio seguente viene creato un indice columnstore filtrato e non cluster nella Production.BillOfMaterials tabella del AdventureWorks2022 database di esempio. Il predicato di filtro può includere colonne che non sono colonne chiave nell'indice filtrato. Il predicato in questo esempio seleziona solo le righe in cui EndDate non è NULL.

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

D. Modificare i dati in un indice columnstore non cluster

Si applica a: SQL Server 2012 (11.x) fino a SQL Server 2014 (12.x).

In SQL Server 2014 (12.x) e versioni precedenti, dopo aver creato un indice columnstore non cluster in una tabella, non è possibile modificare direttamente i dati in tale tabella. Una query con INSERT, UPDATE, DELETE o MERGE ha esito negativo e restituisce un messaggio di errore. Ecco le opzioni che è possibile usare per aggiungere o modificare i dati nella tabella:

  • Disabilitare o eliminare l'indice columnstore. È quindi possibile aggiornare i dati nella tabella. Se si disabilita l'indice columnstore, è possibile ricompilare l'indice columnstore al termine dell'aggiornamento dei dati. Per esempio:

    ALTER INDEX mycolumnstoreindex ON dbo.mytable DISABLE;
    
    -- update the data in mytable as necessary
    ALTER INDEX mycolumnstoreindex on dbo.mytable REBUILD;
    
  • Caricare i dati in una tabella di staging che non ha un indice columnstore. Creare un indice columnstore sulla tabella di staging. Spostare la tabella di staging in una partizione vuota della tabella principale.

  • Spostare una partizione da una tabella con l'indice columnstore in una tabella di staging vuota. Se nella tabella di staging è presente un indice columnstore, disabilitare quest'ultimo. Eseguire tutti gli aggiornamenti. Compilare o ricompilare l'indice columnstore. Spostare la tabella di staging nella partizione (ora vuota) della tabella principale.

Esempi: Azure Synapse Analytics, Piattaforma di analisi (PDW)

Un. Modificare un indice cluster in un indice columnstore cluster

Usando l'istruzione CREATE CLUSTERED COLUMNSTORE INDEX con DROP_EXISTING = ON, è possibile:

  • Modificare un indice cluster in un indice columnstore cluster.

  • Ricompilare un indice columnstore cluster.

Questo esempio crea la xDimProduct tabella come tabella rowstore con un indice cluster. L'esempio usa quindi CREATE CLUSTERED COLUMNSTORE INDEX per modificare la tabella da una tabella rowstore a una tabella columnstore.

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

Cercare il nome dell'indice cluster creato automaticamente per la nuova tabella nei metadati di sistema usando sys.indexes. Per esempio:

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

È ora possibile scegliere di:

  1. Eliminare l'indice columnstore cluster esistente con un nome creato automaticamente, quindi creare un nuovo indice columnstore cluster con un nome definito dall'utente.
  2. Eliminare e sostituire l'indice esistente con un indice columnstore cluster, mantenendo lo stesso nome generato dal sistema, ad esempio ClusteredIndex_1bd8af8797f7453182903cc68df48541.

Per esempio:

--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. Ricompilare un indice columnstore cluster

In base all'esempio precedente, questo esempio usa CREATE CLUSTERED COLUMNSTORE INDEX per ricompilare l'indice columnstore cluster esistente, denominato cci_xDimProduct.

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

C. Modificare il nome di un indice columnstore cluster

Per modificare il nome di un indice columnstore cluster, eliminare l'indice columnstore cluster esistente e quindi ricreare l'indice con un nuovo nome.

È consigliabile limitare questa operazione a una tabella piccola o vuota. L'eliminazione di un indice columnstore cluster di grandi dimensioni e la ricompilazione con un nome diverso richiede molto tempo.

In questo esempio viene fatto riferimento all'indice cci_xDimProduct columnstore cluster dell'esempio precedente. In questo esempio viene eliminato l'indice cci_xDimProduct columnstore cluster e quindi viene ricreato l'indice columnstore cluster con il nome 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. Convertire una tabella columnstore in una tabella rowstore con un indice cluster

Potrebbe verificarsi una situazione per cui si vuole eliminare un indice columnstore cluster e creare un indice cluster. Quando si rilascia un indice columnstore cluster, la tabella viene modificata nel formato rowstore. Questo esempio converte una tabella columnstore in una tabella rowstore con un indice cluster con lo stesso nome. Nessuno dei dati viene perso. Tutti i dati vengono inseriti nella tabella rowstore e le colonne elencate diventano le colonne chiave nell'indice cluster.

--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. Convertire di nuovo una tabella columnstore in un heap rowstore

Usare DROP INDEX per eliminare l'indice columnstore cluster e convertire la tabella in un heap rowstore. In questo esempio la tabella viene cci_xDimProduct convertita in un heap rowstore. La tabella continua a essere distribuita, ma viene archiviata come heap.

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

F. Creare un indice columnstore cluster ordinato in una tabella senza indice

Un indice columnstore non ordinato copre tutte le colonne per impostazione predefinita, senza dover specificare un elenco di colonne. Un indice columnstore ordinato consente di specificare l'ordine delle colonne. L'elenco non deve includere tutte le colonne.

Per altre informazioni, vedere Ottimizzazione delle prestazioni con indici columnstore ordinati.

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

G. Convertire un indice columnstore cluster in un indice columnstore cluster ordinato

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

H. Aggiungere una colonna all'ordinamento di un indice columnstore cluster ordinato

È possibile specificare un ordine per le colonne in un indice columnstore. L'indice columnstore ordinato originale cluster è stato ordinato solo nella SHIPDATE colonna. Nell'esempio seguente la PRODUCTKEY colonna viene aggiunta all'ordinamento. Per la disponibilità degli indici Columnstore ordinati, vedere indici Columnstore: Panoramica.

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

Io. Modificare l'ordinale delle colonne ordinate

L'indice columnstore ordinato originale cluster è stato ordinato in SHIPDATE, PRODUCTKEY. Nell'esempio seguente l'ordinamento viene modificato in PRODUCTKEY, SHIPDATE. Per la disponibilità degli indici Columnstore ordinati, vedere indici Columnstore: Panoramica.

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

J. Creare un indice columnstore cluster ordinato

È possibile creare un indice columnstore cluster con chiavi di ordinamento. Quando si crea un indice columnstore cluster ordinato, è necessario applicare l'hint MAXDOP = 1 per la query per ottenere la massima qualità dell'ordinamento e la durata più breve. Per la disponibilità degli indici Columnstore ordinati, vedere indici Columnstore: Panoramica.

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