Linee guida per la progettazione di indici cluster

Gli indici cluster ordinano e archiviano le righe di dati della tabella in base ai valori di chiave. Per ogni tabella è disponibile un solo indice cluster poiché le righe di dati possono essere ordinate con un solo tipo di ordinamento. Per ulteriori informazioni sull'architettura degli indici cluster, vedere Strutture degli indici cluster.

Con poche eccezioni, è opportuno definire un indice cluster sulla colonna o sulle colonne di tutte le tabelle che presentano le caratteristiche seguenti:

  • Possono essere utilizzate per query frequenti.

  • Garantiscono un elevato livello di univocità.

    Nota

    Quando si crea un vincolo PRIMARY KEY, viene automaticamente creato un indice univoco sulla colonna o sulle colonne. Per impostazione predefinita, tale indice è cluster. È tuttavia possibile specificare un indice non cluster durante la creazione del vincolo.

  • Possono essere utilizzate in query di intervallo.

Se l'indice cluster non viene creato con la proprietà UNIQUE, Motore di database aggiunge automaticamente alla tabella una colonna uniqueifier da 4 byte. Se necessario, Motore di database aggiunge inoltre automaticamente a una riga un valore uniqueifier in modo da rendere univoche le singole chiavi. Questa colonna e i relativi valori sono per uso interno e non sono visualizzati o accessibili dagli utenti.

Considerazioni sulle query

Prima di creare indici cluster, è consigliabile conoscere la modalità di accesso ai dati. Utilizzare ad esempio un indice cluster per query che eseguono le operazioni seguenti:

  • Restituiscono un intervallo di valori utilizzando operatori quali BETWEEN, >, >=, < e <=.

    Quando la riga con il primo valore viene trovata utilizzando l'indice cluster, le righe con i valori indicizzati successivi sono sempre fisicamente adiacenti. Se, ad esempio, una query recupera i record compresi tra un intervallo di numeri di ordini di vendita, la presenza di un indice cluster sulla colonna SalesOrderNumber consente di individuare rapidamente la riga che contiene il numero iniziale dell'ordine di vendita e quindi di recuperare tutte le righe successive fino al raggiungimento dell'ultimo numero dell'ordine di vendita.

  • Restituiscono set di risultati di grandi dimensioni.

  • Utilizzano clausole JOIN, come nel caso delle colonne chiave esterne.

  • Utilizzano clausole ORDER BY o GROUP BY.

    L'utilizzo di un indice basato sulle colonne specificate nella clausola ORDER BY o GROUP BY consente di evitare operazioni di ordinamento dei dati in Motore di database perché le righe sono già ordinate e pertanto di ottimizzare le prestazioni delle query.

Considerazioni sulle colonne

È in genere opportuno definire la chiave di indice cluster con il minor numero di colonne possibile. Utilizzare colonne che presentano o più degli attributi seguenti:

  • Sono univoche o contengono molti valori distinti.

    Gli ID dipendente consentono ad esempio di identificare in modo univoco i dipendenti. Un indice cluster o un vincolo PRIMARY KEY sulla colonna EmployeeID contribuisce a migliorare le prestazioni di query che eseguono la ricerca di informazioni sui dipendenti in base al numero di ID del dipendente. In alternativa, è possibile creare un indice cluster su LastName, FirstName, MiddleName perché i record relativi ai dipendenti sono in genere raggruppati in questo modo ai fini dell'esecuzione di query, pertanto la combinazione di tali colonne garantisce un elevato livello di differenziazione.

  • Sono caratterizzate dall'accesso in modalità sequenziale.

    Un ID prodotto, ad esempio, identifica in modo univoco i prodotti inclusi nella tabella Production.Product del database AdventureWorks2008R2. La definizione di un indice cluster su ProductID produce effetti positivi sulle query in cui è stata specificata una ricerca sequenziale, come nel caso di WHERE ProductID BETWEEN 980 and 999, in quanto le righe vengono archiviate in base all'ordinamento definito per tale colonna chiave.

  • Sono definite come IDENTITY perché si garantisce l'univocità della colonna all'interno della tabella.

  • Vengono utilizzate di frequente per ordinare i dati recuperati da una tabella.

    Può essere utile eseguire il clustering della tabella, ovvero ordinarla fisicamente, in base a tale colonna per evitare il costo di un'operazione di ordinamento ogni volta che si esegue la query sulla colonna.

Gli indici cluster non sono consigliati per gli attributi seguenti:

  • Colonne che vengono modificate di frequente

    Le modifiche frequenti determinano lo spostamento dell'intera riga in quanto Motore di database deve mantenere i valori dei dati nell'ordine fisico. Si tratta di una considerazione importante nel caso di sistemi che elaborano volumi elevati di transazioni in cui i dati sono in genere volatili.

  • Chiavi estese

    Le chiavi estese sono costituite da diverse colonne normali o di grandi dimensioni. I valori di chiave dell'indice cluster vengono utilizzati come chiavi di ricerca da tutti gli indici non cluster. Gli indici non cluster definiti nella stessa tabella saranno significativamente più grandi perché le voci di indice non cluster includono la chiave di clustering, nonché le colonne chiave definite per l'indice non cluster.

Opzioni per gli indici

Sono disponibili diverse opzioni che è possibile specificare durante la creazione di un indice cluster. Poiché gli indici cluster sono in genere di grandi dimensioni, è opportuno considerare in modo specifico le opzioni seguenti:

  • SORT_IN_TEMPDB

  • DROP_EXISTING

  • FILLFACTOR

  • ONLINE

Per ulteriori informazioni, vedere Impostazione delle opzioni di un indice.