Indici cluster e non cluster descritti

  • 02/11/2019
  • 4 minuti per la lettura
    • M
    • M
    • C
    • M
    • r
    • +9

Si applica a: SQL Server (tutte le versioni supportate) Database SQL di Azure

Un indice è una struttura su disco associata a una tabella o vista che accelera il recupero delle righe dalla tabella o dalla vista. Un indice contiene chiavi create da una o più colonne nella tabella o nella vista. Queste chiavi sono archiviate in una struttura (albero B) che consente a SQL Server di trovare la riga o le righe associate ai valori delle chiavi in modo rapido ed efficiente.

Una tabella o una vista può contenere i seguenti tipi di indici:

  • Cluster

    • Gli indici raggruppati ordinano e memorizzano le righe di dati nella tabella o vista in base ai valori chiave. Queste sono le colonne incluse nella definizione dell’indice. Può esserci un solo indice cluster per tabella, poiché le righe di dati possono essere archiviate in un solo ordine.
    • L’unica volta che le righe di dati in una tabella vengono archiviate in ordine ordinato è quando la tabella contiene un indice cluster. Quando una tabella ha un indice cluster, la tabella viene chiamata tabella cluster. Se una tabella non ha un indice cluster, le sue righe di dati vengono archiviate in una struttura non ordinata chiamata heap.
  • Non cluster

    • Gli indici non cluster hanno una struttura separata dalle righe di dati. Un indice non cluster contiene i valori della chiave dell’indice non cluster e ogni voce del valore della chiave ha un puntatore alla riga di dati che contiene il valore della chiave.

    • Il puntatore da una riga dell’indice in una riga non cluster l’indice di una riga di dati è chiamato localizzatore di riga. La struttura del localizzatore di righe dipende dal fatto che le pagine di dati siano archiviate in un heap o in una tabella cluster. Per un heap, un localizzatore di riga è un puntatore alla riga. Per una tabella cluster, l’indicatore di riga è la chiave dell’indice cluster.

    • Puoi aggiungere colonne non chiave al livello foglia dell’indice non cluster per ignorare i limiti di chiave dell’indice esistenti, ed eseguire query completamente coperte, indicizzate. Per ulteriori informazioni, vedere Creare indici con colonne incluse. Per i dettagli sui limiti delle chiavi di indice, vedere Specifiche di capacità massima per SQL Server.

Sia gli indici cluster che quelli non cluster possono essere univoci. Ciò significa che due righe non possono avere lo stesso valore per la chiave di indice. In caso contrario, l’indice non è univoco e più righe possono condividere lo stesso valore di chiave. Per ulteriori informazioni, vedere Creazione di indici univoci.

Gli indici vengono gestiti automaticamente per una tabella o una vista ogni volta che i dati della tabella vengono modificati.

Vedere Indici per ulteriori tipi di indici per scopi speciali.

Indici e vincoli

Gli indici vengono creati automaticamente quando i vincoli PRIMARY KEY e UNIQUE vengono definiti sulle colonne della tabella. Ad esempio, quando crei una tabella con un vincolo UNIQUE, Motore di database crea automaticamente un indice non cluster. Se si configura una CHIAVE PRIMARIA, Motore di database crea automaticamente un indice cluster, a meno che non esista già un indice cluster. Quando si tenta di applicare un vincolo PRIMARY KEY su una tabella esistente e in quella tabella esiste già un indice cluster, SQL Server applica la chiave primaria utilizzando un indice non cluster.

Per ulteriori informazioni, vedere Creare chiavi primarie e Crea vincoli univoci.

Modalità di utilizzo degli indici da Query Optimizer

Gli indici ben progettati possono ridurre le operazioni di I / O del disco e consumare meno risorse di sistema, migliorando quindi le prestazioni delle query. Gli indici possono essere utili per una serie di query che contengono istruzioni SELECT, UPDATE, DELETE o MERGE. Considera la query SELECT Title, HireDate FROM HumanResources.Employee WHERE EmployeeID = 250 nel database AdventureWorks2012. Quando questa query viene eseguita, Query Optimizer valuta ogni metodo disponibile per il recupero dei dati e seleziona il metodo più efficiente. Il metodo può essere una scansione di una tabella o può eseguire la scansione di uno o più indici, se esistono.

Quando si esegue una scansione di una tabella, Query Optimizer legge tutte le righe nella tabella ed estrae le righe che soddisfano i criteri della query. Una scansione della tabella genera molte operazioni di I / O del disco e può richiedere molte risorse. Tuttavia, una scansione della tabella potrebbe essere il metodo più efficiente se, ad esempio, il set di risultati della query è un’alta percentuale di righe della tabella.

Quando Query Optimizer utilizza un indice, cerca nel colonne chiave indice, trova la posizione di archiviazione delle righe necessarie per la query ed estrae le righe corrispondenti da quella posizione. In genere, la ricerca nell’indice è molto più veloce della ricerca nella tabella perché, a differenza di una tabella, un indice contiene spesso pochissime colonne per riga e le righe sono ordinate.

L’ottimizzatore di query in genere seleziona il metodo più efficiente durante l’esecuzione delle query. Tuttavia, se non sono disponibili indici, Query Optimizer deve utilizzare una scansione della tabella. Il tuo compito è progettare e creare indici più adatti al tuo ambiente in modo che Query Optimizer abbia una selezione di indici efficienti da cui effettuare la selezione. SQL Server fornisce il Database Engine Tuning Advisor per aiutare con l’analisi dell’ambiente del database e nella selezione degli indici appropriati.

Importante

Per ulteriori informazioni sulle linee guida per la progettazione degli indici e interni, fare riferimento alla Guida alla progettazione degli indici di SQL Server.

  • Guida alla progettazione degli indici di SQL Server
  • Crea indici cluster
  • Crea non cluster Indici

Leave a Reply

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *