Eventi
31 mar, 23 - 2 apr, 23
Il più grande evento di apprendimento di SQL, Infrastruttura e Power BI. 31 marzo - 2 aprile. Usare il codice FABINSIDER per salvare $400.
Iscriviti oggi stessoQuesto browser non è più supportato.
Esegui l'aggiornamento a Microsoft Edge per sfruttare i vantaggi di funzionalità più recenti, aggiornamenti della sicurezza e supporto tecnico.
Si applica a:SQL Server
Database SQL di Azure
Istanza gestita di SQL di Azure
Azure Synapse Analytics
Analytics Platform System (PDW)
Database SQL in Microsoft Fabric
Suggerimenti generali per la progettazione di indici columnstore. Bastano poche scelte oculate per ottenere gli alti livelli di compressione dei dati e di prestazioni delle query per cui sono progettati gli indici columnstore.
In questo articolo si presuppone una certa familiarità con la terminologia e l'architettura degli indici columnstore. Per altre informazioni, vedere Indici columnstore: Panoramica e Architettura degli indici columnstore.
Prima di progettare un indice columnstore, è importante conoscere i requisiti per i dati nel modo più approfondito possibile. Ad esempio, valutare le risposte a queste domande:
Non è detto che sia necessario un indice columnstore. Le tabelle rowstore (o ad albero B) con heap o con indici clusterizzati offrono prestazioni ottimali con le query che cercano un valore specifico o che operano su un piccolo intervallo di valori. Usare gli indici rowstore con carichi di lavoro transazionali, poiché questi tendono a richiedere principalmente ricerche nelle tabelle invece di scansioni di ampi intervalli delle tabelle.
Un indice columnstore può essere cluster o non cluster. Un indice columnstore raggruppato può avere uno o più indici B-tree non clusterizzati. Gli indici columnstore sono facili da provare. Se si crea una tabella come indice columnstore, è possibile riconvertire facilmente la tabella in tabella rowstore eliminando l'indice columnstore.
Di seguito è riportato un riepilogo delle opzioni e dei suggerimenti.
Opzione columnstore | Uso consigliato | Compressione |
---|---|---|
Indice columnstore raggruppato | Usare per: 1) Carico di lavoro di data warehouse tradizionale con modello a stella o a fiocco di neve 2) Carichi di lavoro Internet delle cose (IOT) per l'inserimento di grandi volumi di dati con aggiornamenti ed eliminazioni minimi. |
in media 10x |
indice columnstore ordinato | Usare quando viene eseguita una query su un indice columnstore clusterizzato tramite una singola colonna predicato ordinato o un set di colonne. Queste indicazioni sono simili alla scelta delle colonne chiave per un indice cluster rowstore, anche se i rowgroup sottostanti compressi si comportano in modo diverso. Per altre informazioni, vedere CREATE COLUMNSTORE INDEX e Ottimizzazione delle prestazioni con indici columnstore ordinati. | Media di 10 volte |
Indici B-tree non clusterizzati su un indice columnstore cluster | Utilizzare per: 1. Applicare vincoli di chiave primaria e di chiave esterna su un indice columnstore clusterizzato. 2. Velocizzare le query che eseguono la ricerca di valori specifici o in intervalli di valori limitati. 3. Velocizzare gli aggiornamenti e le eliminazioni di righe specifiche. |
10x in media, con ulteriore spazio di archiviazione per gli indici non cluster. |
Indice columnstore non clusterizzato su un heap o indice B-tree basato su disco | Da utilizzare per: 1) Un carico di lavoro OLTP con alcune query analitiche. È possibile eliminare gli indici B-tree creati per l'analisi e sostituirli con un solo indice di archiviazione a colonne non clusterizzato. 2) Molti carichi di lavoro OLTP tradizionali che eseguono operazioni di estrazione, trasformazione e caricamento (ETL) per spostare i dati in un data warehouse separato. È possibile evitare le operazioni ETL e la necessità di un data warehouse separato creando un indice columnstore non cluster su alcune delle tabelle OLTP. |
NCCI è un indice aggiuntivo che richiede in media il 10% in più di memoria di archiviazione. |
Indice columnstore su una tabella in memoria | Le stesse indicazioni valide per un indice columnstore non-clustered su una tabella basata su disco, tranne che la tabella di base è una tabella in memoria. | L'indice columnstore è un indice aggiuntivo. |
L'indice cluster columnstore non è semplicemente un indice, ma è l'archiviazione principale della tabella. Permette di ottenere alti livelli di compressione dei dati e un notevole miglioramento delle prestazioni delle interrogazioni per le grandi tabelle di fatti e dimensioni di data warehouse. Gli indici columnstore cluster sono più adatti a query di analisi piuttosto che a query transazionali, perché le query di analisi eseguono tendenzialmente operazioni su grandi intervalli di valori piuttosto che ricerche di valori specifici.
Valutare la possibilità di usare un indice columnstore con cluster nei casi seguenti:
Non usare un indice cluster columnstore nei casi seguenti:
Per ulteriori informazioni, vedere Indici columnstore nell'archiviazione dati.
Per la disponibilità degli indici Columnstore ordinati, vedere indici Columnstore: Panoramica.
Prendere in considerazione l'uso di un indice columnstore ordinato negli scenari seguenti:
Un indice columnstore ordinato potrebbe non essere efficace in questi scenari:
ALTER INDEX REORGANIZE
.A partire da SQL Server 2016 (13.x), è possibile creare indici B-tree non cluster o indici rowstore come indici secondari su un indice columnstore cluster. L'indice B-tree non cluster viene aggiornato man mano che si verificano modifiche all'indice columnstore. Si tratta di una funzionalità potente con numerosi vantaggi.
L'uso di un indice albero B secondario consente di eseguire ricerche di righe specifiche in modo efficiente, senza dover analizzare tutte le righe. Sono disponibili anche altre opzioni. Ad esempio, è possibile applicare un vincolo di chiave primaria o chiave esterna utilizzando un vincolo UNIQUE su un indice B-tree. Poiché non è possibile inserire un valore non univoco nell'indice albero B, SQL Server non può inserire il valore nel columnstore.
Considera di utilizzare un indice B-tree su un indice columnstore per:
A partire da SQL Server 2016 (13.x), è possibile creare un indice columnstore non cluster su una tabella rowstore basata su disco o su una tabella OLTP in memoria. Questo rende possibile l'esecuzione di analisi in tempo reale su una tabella transazionale. Mentre le transazioni avvengono sulla tabella sottostante, è possibile eseguire analisi sull'indice columnstore. Dato che una sola tabella gestisce entrambi gli indici, le modifiche sono disponibili in tempo reale sia per l'indice rowstore che per l'indice columnstore.
Un indice columnstore consente di ottenere livelli di compressione dei dati 10 volte migliori rispetto a un indice rowstore, quindi richiede solo una piccola quantità di spazio di archiviazione aggiuntivo. Ad esempio, se la tabella rowstore compressa richiede 20 GB, l'indice columnstore potrebbe richiedere altri 2 GB. Lo spazio aggiuntivo necessario dipende anche dal numero di colonne nell'indice columnstore non cluster.
Valutare la possibilità di usare un indice columnstore non cluster nei casi seguenti:
Esegui analisi in tempo reale su una tabella rowstore transazionale. È possibile sostituire gli indici B-tree esistenti progettati per l'analisi con un indice columnstore non clustered.
Per evitare la necessità di un data warehouse separato. In genere, le aziende eseguono le transazioni in una tabella rowstore e quindi caricano i dati in un data warehouse separato per le operazioni di analisi. Per molti carichi di lavoro, è possibile eliminare il processo di caricamento e un data warehouse distinto creando un indice columnstore non clusterizzato sulle tabelle transazionali.
SQL Server 2016 (13.x) offre diverse strategie per rendere efficiente questo scenario. È facile provarlo perché è possibile abilitare un indice columnstore non cluster senza modifiche all'applicazione OLTP.
Per aggiungere ulteriori risorse di elaborazione, è possibile eseguire le operazioni di analisi su una replica secondaria leggibile. L'uso di una replica secondaria leggibile consente di separare l'elaborazione del carico di lavoro transazionale e del carico di lavoro di analisi.
Per altre informazioni, vedere Introduzione a Columnstore per l'analisi operativa in tempo reale
Per altre informazioni sulla scelta dell'indice columnstore ottimale, vedere il blog di Sunil Agarwal Which columnstore index is right for my workload? (Qual è l'indice columnstore più appropriato per un carico di lavoro?).
Gli indici columnstore supportano il partizionamento, che rappresenta una soluzione efficace per la gestione e l'archiviazione dei dati. Il partizionamento consente anche di migliorare le prestazioni delle query, limitando le operazioni a una o più partizioni.
Per le tabelle di grandi dimensioni, l'uso delle partizioni è l'unico modo pratico per gestire gli intervalli di dati. I vantaggi delle partizioni per le tabelle rowstore si applicano anche agli indici columnstore.
Ad esempio, sia le tabelle rowstore che le tabelle columnstore usano le partizioni per:
Con un indice columnstore è inoltre possibile usare il partizionamento per:
COLUMNSTORE_ARCHIVE
compressione. Le prestazioni delle query potrebbero risultare più lente, che potrebbero essere accettabili se la partizione viene eseguita raramente.L'uso delle partizioni consente di limitare le query all'analisi di partizioni specifiche, con conseguente contenimento del numero di righe da analizzare. Ad esempio, se l'indice viene partizionato in base agli anni e la query deve analizzare i dati dell'anno precedente, l'analisi sarà limitata a una sola partizione.
A meno che le dimensioni dei dati non siano sufficientemente grandi, un indice columnstore offre prestazioni migliori con meno partizioni, rispetto al numero di partizioni generalmente usato per un indice rowstore. Se non si dispone di almeno un milione di righe per partizione, la maggior parte delle righe potrebbe finire nel deltastore, dove non beneficiano del miglioramento delle prestazioni dato dalla compressione columnstore. Ad esempio, se si caricano un milione di righe in una tabella con 10 partizioni e ogni partizione riceve 100.000 righe, tutte le righe vanno ai rowgroup delta.
Esempio:
Per altre informazioni sul partizionamento, vedere il post di blog di Sunil Agarwal Should I partition my columnstore index? (È consigliabile partizionare l'indice columnstore?).
L'indice columnstore offre due opzioni per la compressione dei dati: compressione del columnstore e compressione dell'archivio. È possibile scegliere l'opzione di compressione quando si crea l'indice o modificarlo in un secondo momento con ALTER INDEX ... REBUILD.
La compressione del columnstore consente in genere di ottenere tassi di compressione 10 volte migliori rispetto agli indici rowstore. Si tratta del metodo di compressione standard per gli indici columnstore e consente di ottenere prestazioni migliori per le query.
La compressione degli archivi è progettata per ottenere la massima compressione quando le prestazioni delle query non sono così importanti e consente di ottenere tassi di compressione dei dati migliori rispetto alla compressione del columnstore, anche se questo vantaggio ha un prezzo. La compressione e la decompressione dei dati richiedono infatti più tempo, quindi non è una soluzione adatta se sono necessarie prestazioni veloci per le query.
Se i dati sono già disponibili in una tabella rowstore, è possibile usare l'istruzione CREATE COLUMNSTORE INDEX per convertire la tabella in un indice columnstore cluster. Le due ottimizzazioni descritte di seguito migliorano le prestazioni delle query dopo la conversione della tabella.
È possibile configurare il numero massimo di processori per la conversione di un indice heap o un indice B-tree cluster in un indice columnstore. Per configurare i processori, usare l'opzione per il massimo grado di parallelismo (MAXDOP).
Se si dispone di grandi quantità di dati, MAXDOP 1
potrebbe essere troppo lento. È possibile ottenere buoni risultati aumentando MAXDOP a 4
. Se questo porta a qualche rowgroup che non ha il numero ottimale di righe, è possibile eseguire ALTER INDEX REORGANIZE per unirli insieme in background.
Dato che le righe vengono già archiviate con un ordinamento nell'indice albero B, il fatto di mantenere tale ordinamento quando le righe vengono compresse nell'indice columnstore può portare a un miglioramento delle prestazioni delle query.
L'indice columnstore non ordina i dati, ma usa i metadati per tenere traccia dei valori minimi e massimi di ogni segmento di colonna in ogni rowgroup. Durante l'analisi di un intervallo di valori, può rapidamente calcolare quando ignorare il rowgroup. Quando i dati sono ordinati, possono essere ignorati più gruppi di righe.
Per mantenere l'ordinamento durante la conversione:
Usare CREATE COLUMNSTORE INDEX con la clausola DROP_EXISTING. Viene così mantenuto anche il nome dell'indice. Se si dispone di script che usano già il nome dell'indice rowstore, non è necessario aggiornarli.
Questo esempio converte un indice rowstore clusterizzato su una tabella denominata MyFactTable
in un indice columnstore clusterizzato. Il nome dell'indice, ClusteredIndex_d473567f7ea04d7aafcac5364c241e09
, rimane invariato.
CREATE CLUSTERED COLUMNSTORE INDEX ClusteredIndex_d473567f7ea04d7aafcac5364c241e09
ON MyFactTable
WITH (DROP_EXISTING = ON);
Ogni rowgroup contiene un segmento di colonna per ogni colonna della tabella. Ogni segmento di colonna è compresso e archiviato su un supporto fisico.
Esistono metadati con ogni segmento che consentono l'eliminazione rapida dei segmenti senza leggerli. Le scelte del tipo di dati possono avere un impatto significativo sulle prestazioni delle query sull'indice columnstore, basate su predicati di filtro comuni. Per altre informazioni, consultare Eliminazione di segmenti.
La tabella seguente riepiloga le attività per la creazione e la manutenzione degli indici columnstore.
Attività | Articoli di riferimento | Note |
---|---|---|
Creare una tabella come columnstore. | CREATE TABLE (Transact-SQL) | A partire da SQL Server 2016 (13.x), è possibile creare la tabella come indice columnstore cluster. Non è necessario creare prima una tabella rowstore e quindi convertirla in columnstore. |
Creare una tabella in-memory con un indice columnstore. | CREATE TABLE (Transact-SQL) | A partire da SQL Server 2016 (13.x), è possibile creare una tabella ottimizzata per la memoria con un indice columnstore. L'indice columnstore può anche essere aggiunto dopo aver creato la tabella, usando la sintassi ALTER TABLE ADD INDEX. |
Convertire una tabella rowstore in un columnstore. | CREATE COLUMNSTORE INDEX (Transact-SQL) | Convertire un heap o un albero B esistente in un columnstore. Gli esempi illustrano come gestire gli indici esistenti e il nome dell'indice quando si esegue questa conversione. |
Convertire una tabella columnstore in un rowstore. | CREATE CLUSTERED INDEX (Transact-SQL) oppure Convertire una tabella columnstore di nuovo in un heap rowstore | Di solito non è necessario eseguire questa conversione, ma talvolta potrebbe presentarsene la necessità. Gli esempi illustrano come convertire un columnstore in un heap o un indice clusterizzato. |
Creare un indice columnstore per una tabella rowstore. | CREATE COLUMNSTORE INDEX (Transact-SQL) | Una tabella rowstore può avere un solo indice columnstore. A partire da SQL Server 2016 (13.x), l'indice columnstore può avere una condizione di filtro. Gli esempi illustrano la sintassi di base. |
Creare indici ad alte prestazioni per l'analisi operativa. | Introduzione a columnstore per l'analisi operativa in tempo reale | Descrive come creare indici columnstore e indici albero B complementari in modo che le query OLTP usino gli indici albero B e le query di analisi usino gli indici columnstore. |
Creare indici columnstore efficienti per il data warehousing. | Indici columnstore nell'ambito del data warehousing | Descrive come usare gli indici B-tree con le tabelle columnstore per creare query di data warehousing performanti. |
Usare un indice B-tree per imporre un vincolo di chiave primaria su un indice columnstore. | Indici columnstore nell'archiviazione dati | Illustra come combinare indici B-tree e indici columnstore per imporre vincoli di chiave primaria sull'indice columnstore. |
Rimuovere un indice columnstore | DROP INDEX (Transact-SQL) | Per rimuovere un indice columnstore si usa la sintassi standard DROP INDEX utilizzata dagli indici B-tree. La rimozione di un indice columnstore raggruppato converte la tabella columnstore in un heap. |
Eliminare una riga da un indice di archiviazione a colonne | DELETE (Transact-SQL) | Usare DELETE (Transact-SQL) per eliminare una riga. Riga columnstore: SQL Server contrassegna la riga come eliminata logicamente ma recupera lo spazio di archiviazione fisico della riga solo dopo che l'indice è stato ricompilato. Riga deltastore: SQL Server elimina la riga logicamente e fisicamente. |
Aggiornare una riga nell'indice columnstore | UPDATE (Transact-SQL) | Usare UPDATE (Transact-SQL) per aggiornare una riga. Riga columnstore: SQL Server contrassegna la riga come eliminata logicamente e quindi inserisce la riga aggiornata nel deltastore. Riga deltastore: SQL Server aggiorna la riga nel deltastore. |
Forzare il passaggio di tutte le righe del deltastore nel columnstore. |
ALTER INDEX (Transact-SQL) ... REBUILD Ottimizzare la manutenzione dell'indice per migliorare le prestazioni delle query e ridurre il consumo di risorse |
ALTER INDEX con l'opzione REBUILD costringe tutte le righe ad entrare nel columnstore. |
Deframmentare un indice columnstore | ALTER INDEX (Transact-SQL) |
ALTER INDEX ... REORGANIZE consente di deframmentare indici columnstore online. |
Unire tabelle con indici columnstore. | MERGE (Transact-SQL) |
Per creare un indice columnstore vuoto per:
Per ulteriori informazioni su come convertire un heap rowstore esistente o un indice B-tree in un indice columnstore clusterizzato, o su come creare un indice columnstore non clusterizzato, vedere CREATE COLUMNSTORE INDEX (Transact-SQL).
Eventi
31 mar, 23 - 2 apr, 23
Il più grande evento di apprendimento di SQL, Infrastruttura e Power BI. 31 marzo - 2 aprile. Usare il codice FABINSIDER per salvare $400.
Iscriviti oggi stessoFormazione
Percorso di apprendimento
Use advance techniques in canvas apps to perform custom updates and optimization - Training
Use advance techniques in canvas apps to perform custom updates and optimization
Documentazione
Indici columnstore - Prestazioni delle query - SQL Server
Raccomandazioni sulle prestazioni delle query sugli indici columnstore per ottenere prestazioni di query veloci.
Indici columnstore: Panoramica - SQL Server
Panoramica sugli indici columnstore. Gli indici columnstore rappresentano lo standard per l'archiviazione di grandi tabelle di fatto di data warehousing e per l'esecuzione di query su queste tabelle.
Indici columnstore - Linee guida per il caricamento di dati - SQL Server
Opzioni e suggerimenti per il caricamento di dati in un indice columnstore usando i metodi standard di caricamento bulk e con inserimento singolo di SQL.