Strutture degli indici non cluster

Gli indici non cluster hanno lo stesso albero B degli indici cluster, con due differenze significative:

  • Le righe di dati della tabella sottostante vengono archiviate con ordinamento basato sulle relative chiavi non cluster.

  • Il livello foglia di un indice non cluster è composto da pagine di indice invece che da pagine di dati.

È possibile definire indici non cluster per una tabella o una vista che include un indice cluster o un heap. Ogni riga di indice nell'indice non cluster contiene il valore della chiave non cluster e un indicatore di posizione delle righe. Questo indicatore punta alla riga di dati nell'indice cluster o nell'heap contenente il valore della chiave.

Gli indicatori di posizione delle righe nelle righe di indice non cluster sono rappresentati da un puntatore a una riga o da una chiave di indice cluster per una riga, come illustrato di seguito:

  • Se la tabella è un heap, ovvero non include un indice cluster, l'indicatore di posizione è un puntatore riferito alla riga e creato in base all'ID del file, al numero della pagina e al numero della riga nella pagina. L'intero puntatore è noto come ID di riga.

  • Se una tabella include un indice cluster oppure l'indice è riferito a una vista indicizzata, l'indicatore di posizione delle righe corrisponde alla chiave di indice cluster per la riga. Se l'indice cluster non è univoco, SQL Server rende univoche le chiavi duplicate tramite l'aggiunta di un valore generato internamente e denominato colonna di univocità. Questo valore a quattro byte non è visibile agli utenti e viene aggiunto solo quando è necessario per rendere univoca la chiave cluster per l'utilizzo in indici non cluster. SQL Server recupera la riga di dati grazie a una ricerca all'interno dell'indice cluster in base alla chiave di indice cluster archiviata nella riga foglia dell'indice non cluster.

Gli indici non cluster includono una riga in sys.partitions con index_id >0 per ogni partizione utilizzata dall'indice. Per impostazione predefinita, un indice non cluster include una singola partizione. Quando in un indice non cluster sono incluse più partizioni, ogni partizione ha un albero B contenente le righe di indice per la partizione specifica. Se, ad esempio, un indice non cluster include quattro partizioni, vi sono quattro alberi B, una in ogni partizione.

In base ai tipi di dati nell'indice non cluster, ogni struttura dell'indice non cluster avrà una o più unità di allocazione in cui archiviare e gestire i dati per una partizione specifica. Ogni indice non cluster ha almeno un'unità di allocazione IN_ROW_DATA per partizione in cui sono archiviate le pagine relative all'albero B dell'indice. L'indice non cluster includerà inoltre un'unità di allocazione LOB_DATA per partizione se contiene colonne LOB. L'indice include inoltre un'unità di allocazione ROW_OVERFLOW_DATA per partizione se contiene colonne a lunghezza variabile che superano le dimensioni massime di 8.060 byte. Per ulteriori informazioni sulle unità di allocazione, vedere Organizzazione di tabelle e indici. Le raccolte di pagine per l'albero B sono ancorate tramite i puntatori root_page nella vista di sistema sys.system_internals_allocation_units.

Nota importanteImportante

La vista di sistema sys.system_internals_allocation_units è riservata per il solo uso interno a Microsoft SQL Server. Non è garantita la compatibilità con le versioni future.

Nella figura seguente viene illustrata la struttura di un indice non cluster in una singola partizione.

Livelli di un indice non cluster

Indici con colonne

La funzionalità degli indici non cluster può essere estesa aggiungendo colonne, denominate colonne non chiave, al livello foglia dell'indice. Mentre le colonne chiave vengono archiviate a tutti i livelli dell'indice non cluster, le colonne non chiave vengono archiviate solo al livello foglia. Per ulteriori informazioni, vedere Indice con colonne incluse.