Indici columnstore - ArchitetturaColumnstore indexes - architecture

QUESTO ARGOMENTO SI APPLICA A:sìSQL Server (a partire dalla versione 2016)noDatabase SQL di AzurenoAzure SQL Data WarehousenoParallel Data WarehouseTHIS TOPIC APPLIES TO: yesSQL Server (starting with 2016)noAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

Informazioni sull'architettura di un indice columnstore.Learn how a columnstore index is architected. La conoscenza di questi concetti di base renderà più facile comprendere altri articoli dedicati agli indici columnstore che spiegano come usarli in modo efficace.Knowing these basics will make it easier to understand other columnstore articles that explain how to use them effectively.

Per l'archiviazione dei dati viene usata la compressione di columnstore e rowstoreData storage uses columnstore and rowstore compression

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. Gli indici columnstore usano entrambi i tipi di archiviazione.Columnstore indexes use both types of storage.

Clustered Columnstore IndexClustered Columnstore Index

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

Un indice columnstore archivia fisicamente la maggior parte dei dati nel formato columnstore.A columnstore index physically stores most of the data in columnstore format. Nel formato columnstore i dati vengono compressi e decompressi come colonne.In columnstore format, the data is compressed and uncompressed as columns. Non è necessario decomprimere altri valori in ogni riga, se non sono richiesti dalla query.There is no need to uncompress other values in each row that are not requested by the query. Ciò consente di analizzare in modo veloce un'intera colonna di una tabella di grandi dimensioni.This makes it fast to scan an entire column of a large table.

  • 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. Questo è stato il metodo tradizionale per archiviare dati di tabelle relazionali, come un indice heap o un indice "albero B" cluster.This has been the traditional way to store relational table data such as a heap or clustered "btree" index.

Un indice columnstore archivia inoltre fisicamente alcune righe in un formato rowstore, denominato archivio differenziale.A columnstore index also physically stores some rows in a rowstore format called a deltastore. L'archivio differenziale, detto anche rowgroup differenziale, è una posizione di archiviazione per le righe in numero troppo limitato per qualificarsi per la compressione nel columnstore.The deltastore,also called delta rowgroups, is a holding place for rows that are too few in number to qualify for compression into the columnstore. Ogni rowgroup differenziale viene implementato come indice albero B cluster.Each delta rowgroup is implemented as a clustered btree index.

  • L'archivio differenziale è una posizione di archiviazione per le righe in numero troppo limitato per essere compresse nel columnstore.A deltastore is a a holding place for rows that are too few in number to be compressed into the columnstore. L'archivio differenziale è un indice rowstore.The deltastore is a rowstore.

Le operazioni vengono eseguite sui rowgroup e sui segmenti di colonnaOperations are performed on rowgroups and column segments

L'indice columnstore raggruppa le righe in unità gestibili.The columnstore index groups rows into manageable units. Ognuna di queste unità viene chiamata rowgroup.Each of these units is called a rowgroup. Per ottenere prestazioni ottimali, 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.For best performance, the number of rows in a rowgroup is large enough to improve compression rates and small enough to benefit from in-memory operations.

  • Un rowgroup è un gruppo di righe su cui l'indice columnstore esegue operazioni di gestione e compressione.A rowgroup is a group of rows on which the columnstore index performs management and compression operations.

Ad esempio, l'indice columnstore esegue queste operazioni sui rowgroup:For example, the columnstore index performs these operations on rowgroups:

  • Compressione dei rowgroup nel columnstore.Compresses rowgroups into the columnstore. La compressione viene eseguita su ogni segmento di colonna all'interno di un rowgroup.Compression is performed on each column segment within a rowgroup.
  • Unione dei rowgroup durante un'operazione ALTER INDEX REORGANIZE.Merges rowgroups during an ALTER INDEX REORGANIZE operation.
  • Creazione di nuovi rowgroup durante un'operazione ALTER INDEX REBUILD.Creates new rowgroups during an ALTER INDEX REBUILD operation.
  • Restituzione di informazioni sull'integrità e la frammentazione dei rowgroup nelle viste a gestione dinamica (DMV).Reports on rowgroup health and fragmentation in the dynamic management views (DMVs).

L'archivio differenziale è costituito da uno o più rowgroup chiamati rowgroup differenziali.The deltastore is comprised of one or more rowgroups called delta rowgroups. Ogni rowgroup differenziale è un indice albero B cluster che archivia le righe quando sono troppo poche per la compressione nel columnstore.Each delta rowgroup is a clustered btree index that stores rows when they are too few in number for compression into the columnstore.

  • Un rowgroup differenziale è un indice albero B cluster che archivia caricamenti e inserimenti bulk di dimensioni contenute, fino a quando il rowgroup non contiene 1.048.576 righe o l'indice non viene ricompilato.A delta rowgroup is a clustered btree index that stores small bulk loads and inserts until the rowgroup contains 1,048,576 rows or until the index is rebuilt. Quando un rowgroup differenziale raggiunge 1.048.576 righe, viene contrassegnato come chiuso e attende che un processo denominato motore di tuple lo comprima nel columnstore.When a delta rowgroup contains 1,048,576 rows it is marked as closed and waits for a process called the tuple-mover to compress it into the columnstore.

Ogni colonna dispone di alcuni dei relativi valori in ogni rowgroup.Each column has some of its values in each rowgroup. Questi valori sono denominati segmenti di colonna.These values are called column segments. Quando l'indice columnstore comprime un rowgroup, ogni segmento di colonna viene compresso separatamente.When the columnstore index compresses a rowgroup, it compresses each column segment separately. Per decomprimere un'intera colonna, l'indice columnstore deve semplicemente decomprimere un segmento di colonna da ogni rowgroup.To uncompress an entire column, the columnstore index only needs to uncompress one column segment from each rowgroup.

  • Un segmento di colonna è la parte dei valori di colonna in un rowgroup.A column segment is the portion of column values in a 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 colonna ha un segmento di colonna in ogni rowgroup.Each column has one column segment in each rowgroup.|

    Column segmentColumn segment

I caricamenti e gli inserimenti di dimensioni contenute vengono indirizzati all'archivio differenzialeSmall loads and inserts go to the deltastore

Un indice columnstore migliora le prestazioni e la compressione del columnstore comprimendo almeno 102.400 righe alla volta nell'indice columnstore.A columnstore index improves columnstore compression and performance by compressing at least 102,400 rows at a time into the columnstore index. Per eseguire la compressione bulk delle righe, l'indice columnstore accumula caricamenti e inserimenti di dimensioni contenute nell'archivio differenziale.To compress rows in bulk, the columnstore index accumulates small loads and inserts in the deltastore. 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.

Le righe vengono indirizzate all'archivio differenziale nei casi seguenti:Rows go to the deltastore when they are:

  • Quando vengono inserite con l'istruzione INSERT INTO VALUES.Inserted with the INSERT INTO VALUES statement.
  • Alla fine di un caricamento bulk e quando sono meno di 102.400.At the end of a bulk load and they number less than 102,400.
  • Quando vengono aggiornate.Updated. Ogni aggiornamento viene implementato come un'eliminazione e un inserimento.Each update is implemented as a delete and an insert.

L'archivio differenziale archivia anche un elenco di ID per le righe eliminate contrassegnate come eliminate ma non ancora eliminate fisicamente dal columnstore.The deltastore also stores a list of IDs for deleted rows that have been marked as deleted but not yet physically deleted from the columnstore.

Quando i rowgroup differenziali sono pieni, vengono compressi nel columnstoreWhen delta rowgroups are full they get compressed into the columnstore

Gli indici columnstore cluster acquisiscono fino a 1.048.576 righe in ogni rowgroup differenziale prima di comprimere il rowgroup nel columnstore.Clustered columnstore indexes collect up to 1,048,576 rows in each delta rowgroup before compressing the rowgroup into the columnstore. migliorando così la compressione dell'indice columnstore.This improves the compression of the columnstore index. Quando un rowgroup differenziale contiene 1.048.576 righe, l'indice columnstore lo contrassegna come chiuso.When a delta rowgroup contains 1,048,576 rows, the columnstore index marks the rowgroup as closed. Un processo in background, denominato motore di tuple, trova ogni rowgroup chiuso e lo comprime nel columnstore.A background process, called the tuple-mover, finds each closed rowgroup and compresses it into the columnstore.

È possibile forzare l'inserimento dei rowgroup differenziali nel columnstore usando ALTER INDEX per ricostruire o riorganizzare l'indice.You can force delta rowgroups into the columnstore by using ALTER INDEX to rebuild or reorganize the index. Si noti che in caso di memoria insufficiente durante la compressione, l'indice columnstore potrebbe ridurre il numero di righe nel rowgroup compresso.Note that if there is memory pressure during compression, the columnstore index might reduce the number of rows in the compressed rowgroup.

Ogni partizione di tabella ha i propri rowgroup e rowgroup differenzialiEach table partition has its own rowgroups and delta rowgroups

Il concetto di partizionamento è lo stesso per un indice cluster, un indice heap e un indice columnstore.The concept of partitioning is the same in both a clustered index, a heap, and a columnstore index. Il partizionamento di una tabella suddivide la tabella in piccoli gruppi di righe in base a un intervallo di valori di colonnaPartitioning a table divides the table into smaller groups of rows according to a range of column values. e viene spesso usato per la gestione dei dati.It is often used for managing the data. Ad esempio, è possibile creare una partizione per ogni anno dei dati e quindi usare il cambio della partizione per archiviare i dati in una soluzione di archiviazione meno costosa.For example, you could create a partition for each year of data, and then use partition switching to archive data to less expensive storage. Il cambio della partizione si applica agli indici columnstore e rende più semplice spostare una partizione di dati in un'altra posizione.Partition switching works on columnstore indexes and makes it easy to move a partition of data to another location.

I rowgroup sono sempre definiti all'interno di una partizione di tabella.Rowgroups are always defined within a table partition. Quando un indice columnstore viene partizionato, ogni partizione ha rowgroup compressi e rowgroup differenziali propri.When a columnstore index is partitioned, each partition has its own compressed rowgroups and delta rowgroups.

Ogni partizione può avere più rowgroup differenzialiEach partition can have multiple delta rowgroups

Ogni partizione può avere più di un rowgroup differenziale.Each partition can have more than one delta rowgroups. Quando l'indice columnstore deve aggiungere dati a un rowgroup differenziale e il rowgroup differenziale è bloccato, l'indice columnstore tenterà di ottenere un blocco su un rowgroup differenziale diverso.When the columnstore index needs to add data to a delta rowgroup and the delta rowgroup is locked, the columnstore index will try to obtain a lock on a different delta rowgroup. In assenza di rowgroup differenziali disponibili, l'indice columnstore creerà un nuovo rowgroup differenziale.If there are no delta rowgroups available, the columnstore index will create a new delta rowgroup. Ad esempio, una tabella con 10 partizioni potrebbe avere facilmente 20 o più rowgroup differenziali.For example, a table with 10 partitions could easily have 20 or more delta rowgroups.

È possibile combinare indici columnstore e rowstore nella stessa tabellaYou can combine columnstore and rowstore indexes on the same table

Un indice non cluster contiene una copia totale o parziale di tutte le righe e colonne della tabella sottostante.A 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.

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 dei dati, pertanto è necessario spazio di archiviazione aggiuntivo.The columnstore index stores a copy of the data so you do need extra storage. Tuttavia, i dati nell'indice columnstore verranno compressi fino a ottenere dimensioni minori rispetto a quanto richiesto per la tabella del rowstore.However, the data in the columnstore index will compress to a smaller size than the rowstore table requires. 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

Usare queste viste dei metadati per visualizzare gli attributi degli indici columnstore.Use these metadata views to see attributes of columnstore indexes. In alcune di queste viste sono incorporate altre informazioni sull'architettura.More architectural information is embedded in some of these views.

Si noti che tutte le colonne di un indice columnstore vengono archiviate nei metadati come colonne incluse.Note, 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.

|

Passaggi successiviNext steps

Per indicazioni sulla progettazione degli indici columnstore, vedere Indici columnstore - Linee guida per la progettazione.For guidance on designing your columnstore indexes, see Columnstore indexes - design guidance