Condividi tramite


Creazione di indici cluster

A parte poche eccezioni, ogni tabella deve disporre di un indice cluster. Oltre a migliorare le prestazioni di esecuzione delle query, un indice può essere ricostruito o riorganizzato su richiesta per controllare la frammentazione della tabella. È inoltre possibile creare un indice cluster in una vista.

Modalità di implementazione tipiche

Gli indici cluster vengono implementati nei modi seguenti:

  • Vincoli PRIMARY KEY e UNIQUE

    Quando si crea un vincolo PRIMARY KEY, viene automaticamente creato un indice cluster univoco nella colonna o nelle colonne se nella tabella non esiste già un indice cluster e non si specifica un indice non cluster univoco. La colonna chiave primaria non può consentire valori NULL.

    Quando si crea un vincolo UNIQUE, viene creato un indice non cluster univoco per imporre un vincolo UNIQUE per impostazione predefinita. È possibile specificare un indice cluster univoco se nella tabella non esiste già un indice cluster.

    A un indice creato come parte del vincolo viene automaticamente assegnato lo stesso nome del vincolo. Per ulteriori informazioni, vedere Vincoli PRIMARY KEY e Vincoli UNIQUE.

  • Indice indipendente da un vincolo

    È possibile creare un indice cluster in una colonna diversa dalla colonna chiave primaria a condizione che sia stato specificato un vincolo di chiave primaria non cluster.

  • Vista indicizzata

    Per creare una vista indicizzata, viene definito un indice cluster univoco in una o più colonne della vista. La vista viene materializzata e il set di risultati viene archiviato nel livello foglia allo stesso modo in cui vengono archiviati i dati della tabella in un indice cluster. Per ulteriori informazioni, vedere Creazione di viste indicizzate.

Selezione della colonna chiave

Poiché in ogni tabella può essere presente un solo indice cluster, è molto importante stabilire in quale colonna creare tale indice. Per ulteriori informazioni sulla selezione della colonna giusta, vedere Linee guida per la progettazione di indici cluster.

La chiave di un indice cluster non può contenere colonne varchar per le quali sono presenti dati nell'unità di allocazione ROW_OVERFLOW_DATA. Se viene creato un indice cluster in una colonna varchar e i dati esistenti si trovano nell'unità di allocazione IN_ROW_DATA, le azioni di inserimento o aggiornamento successive eseguite nella colonna che comporterebbero lo spostamento dei dati all'esterno di righe non verranno eseguite correttamente. Per ulteriori informazioni sulle unità di allocazione, vedere Organizzazione di tabelle e indici.

Requisiti di spazio su disco

Quando viene creata una struttura dell'indice cluster, è necessario spazio su disco per la struttura vecchia (origine) e per quella nuova (destinazione) nei file e filegroup appropriati. La struttura vecchia non viene deallocata fino a quando non viene eseguito il commit della transazione completa. Potrebbe inoltre essere necessario spazio su disco aggiuntivo temporaneo per l'ordinamento. Per ulteriori informazioni, vedere Individuazione dei requisiti di spazio su disco per gli indici.

Considerazioni sulle prestazioni

Se viene creato un indice cluster in un heap con molti indici non cluster esistenti, tutti gli indici non cluster devono essere ricostruiti in modo che contengano il valore della chiave di clustering anziché l'identificatore di riga (RID, Row Identifier). In modo analogo, se viene eliminato un indice cluster di una tabella con molti indici non cluster, tutti gli indici non cluster verranno ricostruiti durante l'operazione DROP. Per tabelle di grandi dimensioni, la ricostruzione degli indici potrebbe richiedere una notevole quantità di tempo.

La strategia ottimale per la creazione di indici per tabelle di grandi dimensioni consiste nel creare innanzitutto l'indice cluster e quindi generare eventuali indici non cluster. Quando si creano gli indici in tabelle esistenti, impostare l'opzione ONLINE su ON. In questo modo, i blocchi di lunga durata a livello di tabella non vengono mantenuti, al fine di consentire l'esecuzione di query o l'aggiornamento della tabella sottostante. Per ulteriori informazioni, vedere Esecuzione di operazioni in linea su indici.

Per creare un vincolo PRIMARY KEY o UNIQUE in fase di creazione di una tabella

Per creare un vincolo PRIMARY KEY or UNIQUE in una tabella esistente

Per creare un indice