Indici columnstore - PanoramicaColumnstore indexes - overview

QUESTO ARGOMENTO SI APPLICA A:sìSQL Server (a partire dalla versione 2012)sìDatabase SQL di AzuresìAzure SQL Data Warehouse sìParallel Data Warehouse THIS TOPIC APPLIES TO:yesSQL Server (starting with 2012)yesAzure SQL DatabaseyesAzure SQL Data Warehouse yesParallel Data Warehouse

L' indice columnstore rappresenta lo standard per l'archiviazione di tabelle dei fatti di data warehousing di grandi dimensioni e per l'esecuzione di query su queste tabelle.The columnstore index is the standard for storing and querying large data warehousing fact tables. Grazie all'archiviazione dei dati basata su colonne, l'indice columnstore riesce a ottenere nel data warehouse un miglioramento delle prestazioni delle query fino a 10 volte rispetto all'archiviazione tradizionale orientata alle righe e una compressione dei dati fino a 10 volte rispetto alla dimensione dei dati non compressi.It uses column-based data storage and query processing to achieve up to 10x query performance gains in your data warehouse over traditional row-oriented storage, and up to 10x data compression over the uncompressed data size. A partire da SQL Server 2016SQL Server 2016gli indici columnstore consentono l'analisi operativa, rendendo possibile l'esecuzione di analisi in tempo reale ad alte prestazioni su carichi di lavoro transazionali.Beginning with SQL Server 2016SQL Server 2016, columnstore indexes enable operational analytics, the ability to run performant real-time analytics on a transactional workload.

Scenari correlati:Jump to scenarios:

Che cos'è un indice columnstore?What is a columnstore index?

L' columnstore index è una tecnologia per l'archiviazione, il recupero e la gestione dei dati utilizzando un formato di dati in colonna, detto columnstore.A columnstore index is a technology for storing, retrieving and managing data by using a columnar data format, called a columnstore.

Termini e concetti chiaveKey terms and concepts

Di seguito sono definiti termini e concetti chiave associati agli indici columnstore.These are key terms and concepts are associated with columnstore indexes.

columnstorecolumnstore
Un indice columnstore è costituito da dati organizzati logicamente in una tabella con righe e colonne e archiviati fisicamente in un formato di dati a colonne.A columnstore is data that is logically organized as a table with rows and columns, and physically stored in a column-wise data format.

rowstorerowstore
Un indice rowstore è costituito da dati organizzati logicamente in una tabella con righe e colonne e archiviati fisicamente in un formato di dati a righe.A rowstore is data that is logically organized as a table with rows and columns, and then physically stored in a row-wise data format. È stata la modalità di archiviazione tradizionale per archiviare dati relazionali di tabella.This has been the traditional way to store relational table data. In SQL Server, rowstore fa riferimento alla tabella in cui il formato di archiviazione dati sottostante è un heap, un indice cluster o una tabella con ottimizzazione per la memoria.In SQL Server, rowstore refers to table where the underlying data storage format is a heap, a clustered index, or a memory-optimized table.

Nota

Quando si parla di indici columnstore, si usano i termini rowstore e columnstore per enfatizzare il formato per l'archiviazione dei dati.In discussions about columnstore indexes, we use the terms rowstore and columnstore to emphasize the format for the data storage.

rowgrouprowgroup
Un rowgroup è un gruppo di righe che vengono compresse nel formato columnstore contemporaneamente.A row group is a group of rows that are compressed into columnstore format at the same time. Un rowgroup contiene in genere il numero massimo di righe per rowgroup, pari a 1.048.576 righe.A rowgroup usually contains the maximum number of rows per rowgroup which is 1,048,576 rows.

Per garantire prestazioni elevate e un alto tasso di compressione, l'indice columnstore suddivide la tabella in gruppi di righe, dette rowgroup, quindi comprime ogni rowgroup per colonne.For high performance and high compression rates, the columnstore index slices the table into groups of rows, called rowgroups, and then compresses each rowgroup in a column-wise manner. Il numero di righe nel rowgroup deve essere sufficientemente grande da migliorare il tasso di compressione e sufficientemente ridotto da poter trarre vantaggio dall'esecuzione delle operazioni in memoria.The number of rows in the rowgroup must be large enough to improve compression rates, and small enough to benefit from in-memory operations.

segmento di colonnacolumn segment
Un segmento di colonna è una colonna di dati all'interno del rowgroup.A column segment is a column of data from within the rowgroup.

  • Ogni rowgroup contiene un segmento di colonna per ogni colonna della tabella.Each rowgroup contains one column segment for every column in the table.

  • Ogni segmento di colonna è compresso e archiviato su un supporto fisico.Each column segment is compressed together and stored on physical media.

    Column segmentColumn segment

    indice columnstore clusterclustered columnstore index
    Un indice columnstore cluster rappresenta l'archivio fisico per l'intera tabella.A clustered columnstore index is the physical storage for the entire table.

    Clustered Columnstore IndexClustered Columnstore Index

    Per ridurre la frammentazione dei segmenti di colonna e migliorare le prestazioni, l'indice columnstore può archiviare temporaneamente alcuni dati in un indice cluster, denominato deltastore, e in un BTree di ID per le righe eliminate.To reduce fragmentation of the column segments and improve performance, the columnstore index might store some data temporarily into a clustered index, which is called a deltastore, and a btree list of IDs for deleted rows. Le operazioni deltastore sono gestite in modo automatico.The deltastore operations are handled behind the scenes. Per tornare ai risultati della query corretti, l'indice columnstore cluster combina i risultati della query da columnstore e deltastore.To return the correct query results, the clustered columnstore index combines query results from both the columnstore and the deltastore.

    deltastoredeltastore
    Usato solo con indici columnstore cluster, un deltastore è un indice cluster che migliora la compressione e le prestazioni dei columnstore archiviando le righe finché il numero di queste non raggiunge una soglia specifica e spostandole quindi nel columnstore.Used with clustered column store indexes only, a deltastore is a clustered index that improves columnstore compression and performance by storing rows until the number of rows reaches a threshold and are then moved into the columnstore.

    Durante un caricamento bulk di grandi dimensioni, la maggior parte delle righe viene direttamente indirizzata al columnstore senza passare per il deltastore.During a large bulk load, most of the rows go directly to the columnstore without passing through the deltastore. È possibile che alla fine del caricamento bulk il numero delle righe sia insufficiente a soddisfare le dimensioni minime di un rowgroup, pari a 102.400.Some rows at the end of the bulk load might be too few in number to meet the minimum size of a rowgroup which is 102,400 rows. In questo caso, le righe finali vengono indirizzate al deltastore anziché al columnstore.When this happens, the final rows go to the deltastore instead of the columnstore. Per i caricamenti bulk di piccole dimensioni, con meno di 102.400 righe, tutte le righe passano direttamente al deltastore.For small bulk loads with less than 102,400 rows, all of the rows go directly to the deltastore.

    Quando il deltastore raggiunge il numero massimo di righe, viene chiuso.When the deltastore reaches the maximum number of rows, it becomes closed. Un processo di motore di tuple controlla se sono presenti rowgroup chiusi.A tuple-mover process checks for closed row groups. Quando trova il rowgroup chiuso, lo comprime e lo archivia nel columnstore.When it finds the closed rowgroup, it compresses it and stores it into the columnstore.

    indice columnstore non clusternonclustered columnstore index
    Un indice columnstore non cluster e un indice columnstore cluster funzionano allo stesso modo.A nonclustered columnstore index and a clustered columnstore index function the same. La differenza è che un indice non cluster è un indice secondario creato per una tabella rowstore, mentre un indice columnstore cluster rappresenta l'archiviazione primaria per l'intera tabella.The difference is a nonclustered index is a secondary index created on a rowstore table, whereas a clustered columnstore index is the primary storage for the entire table.

    L'indice non cluster contiene una copia totale o parziale delle righe e delle colonne della tabella sottostante.The nonclustered index contains a copy of part or all of the rows and columns in the underlying table. L'indice è definito sotto forma di una o più colonne della tabella e ha una condizione facoltativa che consente di filtrare le righe.The index is defined as one or more columns of the table, and has an optional condition that filters the rows.

    Un indice columnstore non cluster consente l'analisi operativa in tempo reale, durante la quale il carico di lavoro OLTP usa l'indice cluster sottostante, mentre l'analisi viene eseguita simultaneamente sull'indice columnstore.A nonclustered columnstore index enables real-time operational analytics in which the OLTP workload uses the underlying clustered index, while analytics run concurrently on the columnstore index. Per altre informazioni, vedere l' articolo introduttivo sull'uso di columnstore per l'analisi operativa in tempo reale.For more information, see Get started with Columnstore for real time operational analytics.

    esecuzione batchbatch execution
    L'esecuzione batch è un metodo di elaborazione delle query in base al quale le query elaborano più righe contemporaneamente.Batch execution is a query processing method in which queries process multiple rows together. Le query sugli indici columnstore usano l'esecuzione in modalità batch, che migliora le prestazioni delle query in genere da 2 a 4 volte.Queries on columnstore indexes use batch mode execution which improves query performance typically 2-4x. L'esecuzione batch è strettamente integrata al formato di archiviazione columnstore, per il quale è ottimizzata.Batch execution is closely integrated with, and optimized around, the columnstore storage format. L'esecuzione in modalità batch talvolta è detta esecuzione basata su vettore o vettorizzata.Batch-mode execution is sometimes known as vector-based or vectorized execution.

Perché usare un indice columnstore? Why should I use a columnstore index?

Un indice columnstore può garantire un livello di compressione dei dati molto elevato, in genere di 10 volte, riducendo in modo significativo i costi di archiviazione del data warehouse.A columnstore index can provide a very high level of data compression, typically 10x, to reduce your data warehouse storage cost significantly. Per l'analisi, gli indici columnstore offrono anche prestazioni decisamente migliori rispetto agli indici BTreePlus, for analytics they offer an order of magnitude better performance than a btree index. e rappresentano il formato di archiviazione di dati preferito per i carichi di lavoro di analisi e data warehousing.They are the preferred data storage format for data warehousing and analytics workloads. A partire da SQL Server 2016SQL Server 2016è possibile usare gli indici columnstore per l'analisi in tempo reale del carico di lavoro operativo.Starting with SQL Server 2016SQL Server 2016, you can use columnstore indexes for real-time analytics on your operational workload.

Ecco perché gli indici columnstore sono così rapidi:Reasons why columnstore indexes are so fast:

  • Le colonne memorizzano valori provenienti dallo stesso dominio. Si tratta in genere di valori simili, il che consente un tasso di compressione elevato.Columns store values from the same domain and commonly have similar values, which results in high compression rates. Ciò riduce al minimo o elimina completamente i colli di bottiglia di I/O all'interno del sistema, riducendo nello stesso tempo il footprint di memoria in modo significativo.This minimizes or eliminates IO bottleneck in your system while reducing the memory footprint significantly.

  • Le frequenze di compressione elevate migliorano le prestazioni delle query utilizzando un footprint di memoria più piccolo.High compression rates improve query performance by using a smaller in-memory footprint. A loro volta, le prestazioni delle query costituiscono un miglioramento in SQL ServerSQL Server in quanto è possibile eseguire un numero maggiore di operazioni di dati e query in memoria.In turn, query performance can improve because SQL ServerSQL Server can perform more query and data operations in-memory.

  • L'esecuzione batch migliora le prestazioni delle query, in genere, da 2 a 4 volte grazie all'elaborazione di più righe contemporaneamente.Batch execution improves query performance, typically 2-4x, by processing multiple rows together.

  • Le query spesso selezionano solo alcune colonne di una tabella, riducendo il totale delle operazioni di I/O su un supporto fisico.Queries often select only a few columns from a table, which reduces total I/O from the physical media.

Quando usare un indice columnstore?When should I use a columnstore index?

Usi consigliati:Recommended use cases:

Come scegliere tra un indice rowstore e un indice columnstore?How do I choose between a rowstore index and a columnstore index?

Gli indici rowstore offrono prestazioni ottimali con le query che eseguono la ricerca di un valore specifico o all'interno di un intervallo di valori di piccole dimensioni.Rowstore indexes perform best on queries that seek into the data, searching for a particular value, or for queries on a small range of values. Usare gli indici rowstore con carichi di lavoro transazionali, poiché per i carichi di lavoro di questo tipo sono in genere necessarie ricerche all'interno delle tabelle anziché scansioni di queste.Use rowstore indexes with transactional workloads since they tend to require mostly table seeks instead of table scans.

Gli indici columnstore garantiscono prestazioni notevolmente elevate per le query analitiche su grandi quantità di dati, soprattutto per le tabelle di grandi dimensioni.Columnstore indexes give high performance gains for analytic queries that scan large amounts of data, especially on large tables. Usare gli indici columnstore per i carichi di lavoro di data warehousing e analisi, soprattutto sulle tabelle dei fatti, poiché in genere questi carichi di lavoro richiedono scansioni complete delle tabelle anziché ricerche all'interno di queste.Use columnstore indexes on data warehousing and analytics workloads, especially on fact tables, since they tend to require full table scans rather than table seeks.

È possibile combinare indici rowstore e columnstore nella stessa tabella?Can I combine rowstore and columnstore on the same table?

Sì.Yes. A partire da SQL Server 2016SQL Server 2016è possibile creare un indice columnstore non cluster aggiornabile in una tabella rowstore.Beginning with SQL Server 2016SQL Server 2016, you can create an updatable nonclustered columnstore index on a rowstore table. L'indice columnstore archivia una copia delle colonne selezionate. È quindi necessario spazio aggiuntivo, ma la compressione applicata è in media di 10 volte.The columnstore index stores a copy of the chosen columns so you do need extra space for this but it will be compressed on average by 10x. In questo modo è possibile eseguire allo stesso tempo analisi sull'indice columnstore e transazioni sull'indice rowstore.By doing this, you can run analytics on the columnstore index and transactions on the rowstore index at the same time. Il columnstore viene aggiornato quando i dati nella tabella rowstore vengono modificati. In questo modo entrambi gli indici possono usare gli stessi dati.The column store is updated when data changes in the rowstore table, so both indexes are working against the same data.

A partire da SQL Server 2016SQL Server 2016è possibile avere uno o più indici rowstore non cluster per un indice columnstore.Beginning with SQL Server 2016SQL Server 2016, you can have one or more nonclustered rowstore indexes on a columnstore index. Ciò consente di eseguire ricerche efficienti all'interno delle tabelle del columnstore sottostante.By doing this, you can perform efficient table seeks on the underlying columnstore. Sono disponibili anche altre opzioni.Other options become available too. È possibile, ad esempio, applicare un vincolo di chiave primaria tramite un vincolo UNIQUE nella tabella rowstore.For example, you can enforce a primary key constraint by using a UNIQUE constraint on the rowstore table. Di conseguenza, poiché non è possibile inserire un valore non univoco nella tabella rowstore, SQL Server non può inserire il valore nel columnstore.Since an non-unique value will fail to insert into the rowstore table, SQL Server cannot insert the value into the columnstore.

MetadatiMetadata

Tutte le colonne di un indice columnstore vengono archiviate nei metadati come colonne incluse.All of the columns in a columnstore index are stored in the metadata as included columns. L'indice columnstore non contiene colonne chiave.The columnstore index does not have key columns.

Tutte le tabelle relazionali, se non specificate come indice columnstore cluster, usano rowstore come formato dei dati sottostanti.All relational tables, unless you specify them as a clustered columnstore index, use rowstore as the underlying data format. CREATE TABLE crea una tabella rowstore, a meno che non si specifichi l'opzione WITH CLUSTERED COLUMNSTORE INDEX.CREATE TABLE creates a rowstore table unless you specify the WITH CLUSTERED COLUMNSTORE INDEX option.

Quando si crea una tabella con l'istruzione CREATE TABLE, è possibile creare la tabella come columnstore specificando l'opzione WITH CLUSTERED COLUMNSTORE INDEX.When you create a table with the CREATE TABLE statement you can create the table as a columnstore by specifying the WITH CLUSTERED COLUMNSTORE INDEX option. Se si ha già una tabella rowstore e si vuole convertirla in una tabella columnstore, è possibile usare l'istruzione CREATE COLUMNSTORE INDEX.If you already have a rowstore table and want to convert it to a columnstore, you can use the CREATE COLUMNSTORE INDEX statement. Per alcuni esempi, vedere.For examples, see.

AttivitàTask Argomenti di riferimentoReference Topics NoteNotes
Creare una tabella come columnstore.Create a table as a columnstore. CREATE TABLE (Transact-SQL)CREATE TABLE (Transact-SQL) A partire da SQL Server 2016SQL Server 2016è possibile creare la tabella come indice columnstore cluster.Beginning with SQL Server 2016SQL Server 2016, you can create the table as a clustered columnstore index. Non è necessario creare prima una tabella rowstore e quindi convertirla in columnstore.You do not have to first create a rowstore table and then convert it to columnstore.
Creare una tabella in memoria con un indice columnstore.Create a memory table with a columnstore index. CREATE TABLE (Transact-SQL)CREATE TABLE (Transact-SQL) A partire da SQL Server 2016SQL Server 2016è possibile creare una tabella in memoria ottimizzata con un indice columnstore.Beginning with SQL Server 2016SQL Server 2016, you can create a memory-optimized table with a columnstore index. L'indice columnstore può anche essere aggiunto dopo aver creato la tabella, usando la sintassi ALTER TABLE ADD INDEX.The columnstore index can also be added after the table is created, using the ALTER TABLE ADD INDEX syntax.
Convertire una tabella rowstore in un columnstore.Convert a rowstore table to a columnstore. CREATE COLUMNSTORE INDEX (Transact-SQL)CREATE COLUMNSTORE INDEX (Transact-SQL) Convertire un heap o un albero binario esistente o in un columnstore.Convert an existing heap or binary tree to a columnstore. Gli esempi illustrano come gestire gli indici esistenti e il nome dell'indice quando si esegue questa conversione.Examples show how to handle existing indexes and also the name of the index when performing this conversion.
Convertire una tabella columnstore in un rowstore.Convert a columnstore table to a rowstore. CREATE COLUMNSTORE INDEX (Transact-SQL)CREATE COLUMNSTORE INDEX (Transact-SQL) Di solito non è necessario eseguire questa conversione, ma talvolta potrebbe presentarsene la necessità.Usually this is not necessary, but there can be times when you need to perform this conversion. Gli esempi illustrano come convertire un columnstore in un heap o in un indice cluster.Examples show how to convert a columnstore to a heap or clustered index.
Creare un indice columnstore per una tabella rowstore.Create a columnstore index on a rowstore table. CREATE COLUMNSTORE INDEX (Transact-SQL)CREATE COLUMNSTORE INDEX (Transact-SQL) Una tabella rowstore può avere un solo indice columnstore.A rowstore table can have one columnstore index. A partire da SQL Server 2016SQL Server 2016l'indice columnstore può avere una condizione di filtro.Beginning with SQL Server 2016SQL Server 2016, the columnstore index can have a filtered condition. Gli esempi illustrano la sintassi di base.Examples show the basic syntax.
Creare indici ad alte prestazioni per l'analisi operativa.Create performant indexes for operational analytics. Introduzione a columnstore per l'analisi operativa in tempo realeGet started with Columnstore for real time operational analytics Descrive come creare indici columnstore e BTree complementari in modo che le query OLTP usino gli indici BTree e le query di analisi usino gli indici columnstore.Describes how to create complementary columnstore and btree indexes so that OLTP queries use btree indexes and analytics queries use columnstore indexes.
Creare indici columnstore efficienti per il data warehousing.Create performant columnstore indexes for data warehousing. Indici columnstore per il data warehousingColumnstore Indexes for Data Warehousing Descrive come usare gli indici BTree con le tabelle columnstore per creare query di data warehousing ad alte prestazioni.Describes how to use btree indexes on columnstore tables to create performant data warehousing queries.
Usare un indice BTree per imporre un vincolo di chiave primaria per un indice columnstore.Use a btree index to enforce a primary key constraint on a columnstore index. Indici columnstore per il data warehousingColumnstore Indexes for Data Warehousing Illustra come combinare indici BTree e columnstore per imporre vincoli di chiave primaria per l'indice columnstore.Shows how to combine btree and columnstore indexes to enforce primary key constraints on the columnstore index.
Rimuovere un indice columnstoreDrop a columnstore index DROP INDEX (Transact-SQL)DROP INDEX (Transact-SQL) Per rimuovere un indice columnstore si usa la sintassi DROP INDEX standard usata dagli indici BTree.Dropping a columnstore index uses the standard DROP INDEX syntax that btree indexes use. La rimozione di un indice columnstore cluster converte la tabella columnstore in un heap.Dropping a clustered columnstore index will convert the columnstore table to a heap.
Eliminare una riga da un indice columnstoreDelete a row from a columnstore index DELETE (Transact-SQL)DELETE (Transact-SQL) Usare DELETE (Transact-SQL) per eliminare una riga.Use DELETE (Transact-SQL) to delete a row.

Rigacolumnstore : SQL ServerSQL Server contrassegna la riga come eliminata logicamente ma recupera lo spazio di archiviazione fisico della riga solo dopo che l'indice è stato ricompilato.columnstore row: SQL ServerSQL Server marks the row as logically deleted but does not reclaim the physical storage for the row until the index is rebuilt.

Rigadeltastore : SQL ServerSQL Server elimina la riga logicamente e fisicamente.deltastore row: SQL ServerSQL Server logically and physically deletes the row.
Aggiornare una riga nell'indice columnstoreUpdate a row in the columnstore index UPDATE (Transact-SQL)UPDATE (Transact-SQL) Usare UPDATE (Transact-SQL) per aggiornare una ruga.Use UPDATE (Transact-SQL) to update a row.

Rigacolumnstore : SQL ServerSQL Server contrassegna la riga come eliminata logicamente e quindi inserisce la riga aggiornata nel deltastore.columnstore row: SQL ServerSQL Server marks the row as logically deleted, and then inserts the updated row into the deltastore.

Rigadeltastore : SQL ServerSQL Server aggiorna la riga nel deltastore.deltastore row: SQL ServerSQL Server updates the row in the deltastore.
Caricare dati in un indice columnstoreLoad data into a columnstore index Caricamento dati di indici columnstoreColumnstore Indexes Data Loading
Forzare il passaggio di tutte le righe del deltastore nel columnstore.Force all rows in the deltastore to go into the columnstore. ALTER INDEX (Transact-SQL) ... REBUILDALTER INDEX (Transact-SQL) ... REBUILD

Deframmentazione degli indici columnstoreColumnstore Indexes Defragmentation
ALTER INDEX con l'opzione REBUILD forza il passaggio di tutte le righe nel columnstore.ALTER INDEX with the REBUILD option forces all rows to go into the columnstore.
Deframmentare un indice columnstoreDefragment a columnstore index ALTER INDEX (Transact-SQL)ALTER INDEX (Transact-SQL) ALTER INDEX …ALTER INDEX … REORGANIZE consente di deframmentare indici columnstore online.REORGANIZE defragments columnstore indexes online.
Unire tabelle con indici columnstore.Merge tables with columnstore indexes. MERGE (Transact-SQL)MERGE (Transact-SQL)

Vedere ancheSee Also

Caricamento dati di indici columnstore Columnstore Indexes Data Loading
Riepilogo delle funzionalità con versione degli indici columnstore Columnstore Indexes Versioned Feature Summary
Prestazioni delle query per gli indici columnstore Columnstore Indexes Query Performance
Introduzione a columnstore per l'analisi operativa in tempo reale Get started with Columnstore for real time operational analytics
Indici columnstore per il data warehousing Columnstore Indexes for Data Warehousing
Deframmentazione degli indici columnstore Columnstore Indexes Defragmentation