Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Attività per l'utilizzo di indici columnstore clusterizzati in SQL Server.
Per una panoramica degli indici columnstore, vedere Indici columnstore descritti.
Per informazioni sugli indici columnstore cluster, vedere Uso di indici columnstore cluster.
Contenuto
Creare un indice columnstore raggruppato
Per creare un indice columnstore cluster, creare prima una tabella rowstore come indice heap o cluster e quindi usare l'istruzione CREATE CLUSTERED COLUMNSTORE INDEX (Transact-SQL) per convertire la tabella in un indice columnstore cluster. Se si desidera che l'indice columnstore raggruppato abbia lo stesso nome dell'indice raggruppato, utilizzare l'opzione DROP_EXISTING.
Questo esempio crea una tabella come struttura heap e la converte in un indice colonnare clusterizzato denominato cci_Simple. In questo modo viene modificata la risorsa di archiviazione per l'intera tabella da rowstore a columnstore.
CREATE TABLE T1(
ProductKey [int] NOT NULL,
OrderDateKey [int] NOT NULL,
DueDateKey [int] NOT NULL,
ShipDateKey [int] NOT NULL);
GO
CREATE CLUSTERED COLUMNSTORE INDEX cci_T1 ON T1;
GO
Per altri esempi, vedere la sezione Esempi in CREATE CLUSTERED COLUMNSTORE INDEX (Transact-SQL).
Eliminare un indice cluster columnstore
Usare l'istruzione DROP INDEX (Transact-SQL) per eliminare un indice columnstore cluster. Questa operazione comporta l'eliminazione dell'indice e la conversione della tabella columnstore in un heap rowstore.
Caricare dati in un Indice Cluster Columnstore
È possibile aggiungere dati a un indice columnstore cluster esistente usando uno dei metodi di caricamento standard. Ad esempio, gli strumenti di caricamento massivo bcp, Integration Services e INSERT ... SELECT possono tutti caricare dati in un indice columnstore clusterizzato.
Gli indici columnstore cluster sfruttano il deltastore per evitare la frammentazione dei segmenti di colonna nel columnstore.
Caricamento in una tabella partizionata
Per i dati partizionati, SQL Server assegna prima ogni riga a una partizione e quindi esegue operazioni columnstore sui dati all'interno della partizione. Ogni partizione ha i propri rowgroup e almeno un deltastore.
Scenari di caricamento deltastore
Le righe si accumulano nell'archivio differenziale fino al raggiungimento del numero massimo di righe consentite per un rowgroup. Quando il deltastore contiene il numero massimo di righe per rowgroup, SQL Server contrassegna il rowgroup come "CLOSED". Un processo in background, denominato "tuple-mover", trova il rowgroup CLOSED e si sposta nel columnstore, dove il rowgroup viene compresso in segmenti di colonna e i segmenti di colonna vengono archiviati nel columnstore.
Per ogni indice columnstore cluster possono essere presenti più deltastore.
Se un deltastore è bloccato, SQL Server tenterà di ottenere un blocco in un deltastore diverso. Se non sono disponibili deltastore, SQL Server creerà un nuovo deltastore.
Per una tabella partizionata, possono essere presenti uno o più deltastore per ogni partizione.
Solo per gli indici columnstore clusterizzati, i seguenti scenari mostrano quando le righe caricate passano direttamente al columnstore o quando passano al deltastore.
Nell'esempio, ogni rowgroup può contenere da 102,400 a 1,048,576 righe per rowgroup.
| Righe da caricare in blocco | Righe aggiunte al columnstore | Righe aggiunte al Deltastore |
|---|---|---|
| 102.000 | 0 | 102.000 |
| 145.000 | 145.000 Dimensioni del gruppo di righe: 145.000 |
0 |
| 1.048.577 | 1.048.576 Dimensioni rowgroup: 1.048.576. |
1 |
| 2.252.152 | 2.252.152 Dimensioni gruppo di righe: 1.048.576, 1.048.576, 155.000. |
0 |
L'esempio seguente mostra i risultati del caricamento di 1.048.577 righe in una partizione. I risultati mostrano che esiste un rowgroup COMPRESSED nel columnstore (come segmenti di colonna compressi) e 1 riga nel deltastore.
SELECT * FROM sys.column_store_row_groups;
Modificare i dati in un indice columnstore clusterizzato
Gli indici columnstore cluster supportano operazioni DML di inserimento, aggiornamento ed eliminazione.
Utilizzare INSERT (Transact-SQL) per inserire una riga. La riga verrà aggiunta al deltastore.
Usare DELETE (Transact-SQL) per eliminare una riga.
Se la riga si trova nel columnstore, SQL Server contrassegna la riga come eliminata logicamente, ma non recupera l'archiviazione fisica per la riga finché l'indice non viene ricompilato.
Se la riga si trova nel deltastore, SQL Server elimina logicamente e fisicamente la riga.
Usare UPDATE (Transact-SQL) per aggiornare una riga.
Se la riga si trova nel columnstore, SQL Server contrassegna la riga come eliminata logicamente e quindi inserisce la riga aggiornata nel deltastore.
Se la riga si trova nel deltastore, SQL Server aggiorna la riga nel deltastore.
Ricomplilare un indice columnstore clusterizzato
Usare CREATE CLUSTERED COLUMNSTORE INDEX (Transact-SQL) o ALTER INDEX (Transact-SQL) per eseguire una ricompilazione completa di un indice columnstore cluster esistente. Inoltre, è possibile usare ALTER INDEX ... REBUILD per ricompilare una partizione specifica.
Processo di ricostruzione
Per ricompilare un indice cluster columnstore, SQL Server:
Acquisisce un blocco esclusivo sulla tabella o sulla partizione durante la ricompilazione. I dati sono "offline" e non sono disponibili durante la ricompilazione.
Deframmenta il columnstore eliminando fisicamente le righe che sono state eliminate logicamente dalla tabella; i byte eliminati vengono recuperati nel supporto fisico.
Unisce i dati rowstore nell'archivio delta con i dati nel columnstore prima di ricompilare l'indice. Al termine della ricompilazione, tutti i dati vengono archiviati in formato columnstore e il deltastore è vuoto.
Comprime nuovamente tutti i dati nel columnstore. Esistono due copie dell'indice columnstore mentre viene eseguita la ricompilazione. Al termine della ricompilazione, SQL Server elimina l'indice columnstore originale.
Consigli per la ricompilazione di un indice columnstore clusterizzato
La ricompilazione di un indice columnstore cluster è utile per rimuovere la frammentazione e per spostare tutte le righe nel columnstore. Sono disponibili le raccomandazioni seguenti:
Ricostruire una partizione anziché l'intera tabella.
La ricompilazione dell'intera tabella richiede molto tempo se l'indice è grande e richiede spazio su disco sufficiente per archiviare una copia aggiuntiva dell'indice durante la ricompilazione. In genere è necessario solo ricompilare la partizione usata più di recente.
Per le tabelle partizionate, non è necessario ricompilare l'intero indice columnstore perché è probabile che la frammentazione si verifichi solo nelle partizioni modificate di recente. Le tabelle dei fatti e le tabelle delle dimensioni di grandi dimensioni vengono in genere partizionate per eseguire operazioni di backup e gestione su blocchi della tabella.
Ricostruire una partizione dopo operazioni DML significative.
La ricompilazione di una partizione deframmenterà la partizione e ridurrà l'archiviazione su disco. La ricostruzione eliminerà tutte le righe dall'archivio delle colonne contrassegnate per l'eliminazione e sposterà tutte le righe dall'archivio differenziale nell'archivio delle colonne.
Ricompilare una partizione dopo il caricamento dei dati.
In questo modo tutti i dati vengono archiviati nel columnstore. Se si verificano più carichi contemporaneamente, ogni partizione potrebbe avere più deltastore. La ricompilazione sposterà tutte le righe del deltastore nel columnstore.
Riorganizzare un indice clusterizzato columnstore
La riorganizzazione di un indice columnstore raggruppato sposta tutti i rowgroup CLOSED nel columnstore. Per eseguire una riorganizzazione, usare ALTER INDEX (Transact-SQL)con l'opzione REORGANIZE.
La riorganizzazione non è necessaria per spostare i rowgroup CLOSED nel columnstore. Il processo tuple-mover troverà tutti i rowgroup CLOSED e li sposterà. Tuttavia, il tuple-mover è a thread singolo e potrebbe non spostare i rowgroup abbastanza velocemente per il carico di lavoro.
Suggerimenti per la riorganizzazione
Quando è necessario riorganizzare un indice columnstore clusterizzato:
- Riorganizzare un indice columnstore cluster dopo uno o più carichi di dati per ottenere i vantaggi delle prestazioni delle query il più rapidamente possibile. La riorganizzazione richiederà inizialmente risorse cpu aggiuntive per comprimere i dati, che potrebbero rallentare le prestazioni complessive del sistema. Tuttavia, non appena i dati vengono compressi, le prestazioni delle query possono migliorare.