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
database SQL di Azure Synapse Analytics Platform
System (PDW)
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 indici heap e cluster 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. Usare gli indici rowstore con carichi di lavoro transazionali, perché per i carichi di lavoro di questo tipo sono in genere necessarie ricerche all'interno delle tabelle anziché analisi di intervalli estesi nelle tabelle.
Un indice columnstore può essere cluster o non cluster. Un indice columnstore cluster può avere uno o più indici albero B non cluster. È facile provare gli indici columnstore. 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 per columnstore | Uso consigliato | Compressione |
---|---|---|
Indice columnstore cluster | Usare per: 1) Carico di lavoro di data warehouse tradizionale con schema star o snowflake 2) Carichi di lavoro Internet delle cose (IOT) per l'inserimento di grandi volumi di dati con aggiornamenti ed eliminazioni minimi. |
10x in media |
Indice columnstore cluster ordinato | Usare quando viene eseguita una query su un indice columnstore cluster tramite una singola colonna predicato ordinata o un set di colonne. Queste indicazioni sono simili alla scelta delle colonne chiave per un indice cluster rowstore, anche se i rowgroup compressi sottostanti si comportano in modo diverso. Per altre informazioni, vedere CREATE COLUMNSTORE INDEX and Performance tuning with ordered clustered columnstore indexes .For more information, see CREATE COLUMNSTORE INDEX and Performance tuning with ordered clustered columnstore indexes. | 10x in media |
Indici ad albero B non cluster su un indice columnstore cluster | Utilizzare per: 1. Applicare vincoli di chiave primaria e di chiave esterna su un indice columnstore cluster. 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 cluster su un indice heap o albero B basato su disco | Usare per: 1) Un carico di lavoro OLTP con alcune query analitiche. È possibile eliminare gli indici albero B creati per l'analisi e sostituirli con un solo indice columnstore non cluster. 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. |
L'indice columnstore non cluster è un indice aggiuntivo che richiede in media il 10% in più di spazio di archiviazione. |
Indice columnstore su una tabella in memoria | Le stesse indicazioni valide per un indice columnsore non cluster su una tabella basata su disco, ma la tabella di base è una tabella in memoria. | L'indice columnstore è un indice aggiuntivo. |
L'indice columnstore cluster non è semplicemente un indice, ma è lo spazio di archiviazione principale per le tabelle. Consente di ottenere alti livelli di compressione dei dati e un miglioramento significativo delle prestazioni delle query per le tabelle dei fatti e delle dimensioni di data warehouse di grandi dimensioni. 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 cluster nei casi seguenti:
Non usare un indice columnstore cluster nei casi seguenti:
Per altre informazioni, vedere Indici columnstore in data warehousing.
Per la disponibilità degli indici Columnstore ordinati, vedere indici Columnstore: Panoramica.
Prendere in considerazione l'uso di un indice columnstore cluster ordinato negli scenari seguenti:
Un indice columnstore cluster ordinato potrebbe non essere efficace in questi scenari:
A partire da SQL Server 2016 (13.x), è possibile creare indici ad albero B non cluster come indici secondari in un indice columnstore cluster. L'indice albero B non cluster viene aggiornato con le modifiche apportate 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. È possibile ad esempio applicare un vincolo chiave primaria o chiave esterna tramite un vincolo UNIQUE sull'indice albero B. Dato che non è possibile inserire un valore non univoco nell'indice ad albero B, SQL Server non può inserire il valore nel columnstore.
Valutare la possibilità di usare un indice albero B su un indice columnstore nei casi seguenti:
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. In questo modo è possibile eseguire allo stesso tempo analisi sull'indice columnstore e le transazioni sulla tabella sottostante. 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:
Per eseguire analisi in tempo reale su una tabella rowstore transazionale. È possibile sostituire gli indici albero B esistenti progettati per l'analisi con un indice columnstore non cluster.
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 evitare il processo di caricamento e la disponibilità di un data warehouse separato creando un indice columnstore non cluster sulle tabelle transazionali.
SQL Server 2016 (13.x) offre diverse strategie per rendere efficiente questo scenario. È molto semplice da provare, perché è possibile abilitare un indice columnstore non cluster senza dover modificare l'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 per questi dati saranno più lente, ma ciò è accettabile se le query su questa partizione sono poco frequenti.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 ogni partizione non include almeno un milione di righe, la maggior parte delle righe potrebbe essere trasferita all'archivio differenziale, perdendo quindi i vantaggi a livello di prestazioni derivanti dalla compressione del columnstore. Ad esempio, se si carica un milione di righe in una tabella con 10 partizioni e ogni partizione riceve 100.000 righe, tutte le righe passeranno ai rowgroup differenziali.
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 albero B cluster in un indice columnstore. Per configurare i processori, usare l'opzione per il massimo grado di parallelismo (MAXDOP).
In presenza di grandi quantità di dati, è probabile che l'opzione MAXDOP 1
sia troppo lenta. È possibile ottenere buoni risultati aumentando MAXDOP a 4
. Se si ottengono meno rowgroup senza il numero ottimale di righe, è possibile usare ALTER INDEX REORGANIZE per unirli 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ù rowgroup.
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 esistono script che usano già il nome dell'indice rowstore non sarà necessario aggiornarli.
Questo esempio converte un indice rowstore cluster su una tabella denominata MyFactTable
in un indice columnstore cluster. 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 basate su predicati di filtro comuni per le query sull'indice columntore. 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 memoria 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 albero B esistente o 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 in un indice cluster. |
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 nel data warehousing | Descrive come usare gli indici albero B con le tabelle columnstore per creare query di data warehousing ad alte prestazioni. |
Usare un indice albero B per imporre un vincolo di chiave primaria per un indice columnstore. | Indici columnstore nel data warehousing | Illustra come combinare indici albero B e indici columnstore per imporre vincoli di chiave primaria per l'indice columnstore. |
Rimuovere un indice columnstore | DROP INDEX (Transact-SQL) | Per rimuovere un indice columnstore si usa la sintassi DROP INDEX standard usata dagli indici albero B. La rimozione di un indice columnstore cluster converte la tabella columnstore in un heap. |
Eliminare una riga da un indice columnstore | 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 forza il passaggio di tutte le righe 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 altre informazioni su come convertire un indice heap o albero B rowstore esistente in un indice columnstore cluster o su come creare un indice columnstore non cluster, 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 stesso