Indici cluster e non cluster
Si applica a: SQL Server database SQL di Azure Istanza gestita di SQL di Azure
Un indice è una struttura su disco associata a una tabella o a una vista che consente di recuperare in modo rapido le righe della tabella o della vista. L'indice contiene chiavi costituite da una o più colonne della tabella o della vista. Queste chiavi vengono archiviate in una struttura (albero B) che consente a SQL Server di individuare con rapidità ed efficienza la riga o le righe associate ai valori di chiave.
Nota
Nella documentazione viene usato in modo generico il termine albero B in riferimento agli indici. Negli indici rowstore, il motore di database implementa un albero B+. Ciò non si applica a indici columnstore o a indici in tabelle ottimizzate per la memoria. Per altre informazioni, vedere Architettura e guida per la progettazione degli indici SQL Server e Azure SQL.
Una tabella o una vista può contenere i tipi di indici seguenti:
Cluster
- Gli indici cluster ordinano e archiviano le righe di dati della tabella in base ai valori di chiave, ovvero alle colonne incluse nella definizione dell'indice. Per ogni tabella è disponibile un solo indice cluster, poiché alle righe di dati è possibile applicare un solo tipo di ordinamento.
- Le righe di dati di una tabella vengono archiviate con ordinamento solo se la tabella contiene un indice cluster. Una tabella con indice cluster è denominata tabella cluster. Se la tabella non contiene un indice cluster, le righe di dati vengono archiviate in una struttura non ordinata denominata heap.
Non cluster
Gli indici non cluster presentano una struttura distinta dalle righe di dati. Un indice non cluster contiene i valori di chiave dell'indice non cluster, ciascuno dei quali dispone di un puntatore alla riga di dati che contiene il valore di chiave.
Il puntatore da una riga di indice non cluster a una riga di dati è denominato indicatore di posizione delle righe. La struttura dell'indicatore di posizione delle righe dipende dal tipo di archiviazione delle pagine di dati (heap o tabella cluster). Nel caso di un heap, l'indicatore di posizione delle righe è un puntatore alla riga. Nel caso di una tabella cluster, l'indicatore di posizione delle righe è la chiave di indice cluster.
È possibile aggiungere colonne non chiave al livello foglia dell'indice non cluster per ignorare i limiti esistenti ed eseguire query completamente coperte. Per altre informazioni, vedere Creare indici con colonne incluse. Per informazioni dettagliate sui limiti delle chiavi dell'indice, vedere Specifiche di capacità massima per SQL Server.
Sia gli indici cluster che non cluster possono essere univoci. Con un indice univoco, due righe non possono avere lo stesso valore di chiave di indice. In caso contrario, l'indice non è univoco e più righe possono condividere lo stesso valore di chiave. Per altre informazioni, vedere Creare indici univoci.
Gli indici di una tabella o di una vista vengono gestiti automaticamente in caso di modifica dei dati della tabella.
Per altri tipi di indici usati per scopi speciali, vedere Indici.
Indici e vincoli
Gli indici vengono creati automaticamente da SQL Server quando si definiscono vincoli PRIMARY KEY e UNIQUE sulle colonne della tabella. Quando si crea una tabella con un vincolo UNIQUE, ad esempio, il motore di database crea automaticamente un indice non cluster. Se invece si configura un vincolo PRIMARY KEY, il motore di database crea automaticamente un indice cluster, a meno che non esista già. Se si tenta di imporre un vincolo PRIMARY KEY in una tabella esistente e nella tabella esiste già un indice cluster, SQL Server impone il vincolo PRIMARY KEY usando un indice non cluster.
Per altre informazioni, vedere Creare chiavi primarie e Creare vincoli univoci.
Uso degli indici in Query Optimizer
Se correttamente progettati, gli indici contribuiscono a ridurre le operazioni di I/O su disco e a consumare una quantità inferiore di risorse di sistema. Pertanto, questi indici migliorano le prestazioni delle query. Gli indici possono inoltre risultare utili in una vasta gamma di query che contengono le istruzioni SELECT, UPDATE, DELETE o MERGE. Si consideri la query SELECT JobTitle, HireDate FROM HumanResources.Employee WHERE BusinessEntityID = 250
nel database AdventureWorks2022
. Quando viene eseguita questa query, Query Optimizer valuta i singoli metodi disponibili per il recupero dei dati e seleziona quello più efficace. Il metodo può prevedere un'analisi di tabella oppure di uno o più indici eventualmente esistenti.
Durante una scansione di tabella Query Optimizer legge tutte le righe della tabella ed estrae quelle che soddisfano i criteri della query. Pur generando molte operazioni di I/O su disco e talvolta utilizzando un elevato numero di risorse, un'analisi di tabella può costituire il metodo più efficace se, ad esempio, il set di risultati della query include un'elevata percentuale di righe della tabella.
Se invece Query Optimizer utilizza un indice, esegue la ricerca delle colonne chiave dell'indice, individua la posizione di archiviazione delle righe richieste dalla query ed estrae solo quelle corrispondenti. In genere, la ricerca nell'indice è molto più veloce rispetto alla ricerca nella tabella. A differenza di una tabella, un indice contiene spesso pochissime colonne per riga e le righe sono ordinate.
Query Optimizer seleziona in genere il metodo più efficace durante l'esecuzione delle query. Se, tuttavia, non è disponibile alcun indice, verrà utilizzata un'analisi di tabella. L'attività consiste nel progettare e creare indici adatti all'ambiente in modo che in Query Optimizer sia presente una selezione di indici efficienti da cui effettuare una selezione. SQL Server fornisce l'ottimizzazione guidata motore di database per facilitare l'analisi dell'ambiente del database e la selezione di indici adatti.
Importante
Per altre informazioni sulle linee guida di progettazione di indici e di elementi interni, vedere Guida per la progettazione di indici di SQL Server e Azure SQL.