Creazione di indici (Motore di database)

In questo argomento vengono descritte le principali operazioni di creazione degli indici e vengono fornite linee guida relative all'implementazione e alle prestazioni da considerare prima di procedere alla creazione di un indice.

Operazioni di creazione degli indici

Di seguito sono elencate le operazioni che costituiscono la strategia consigliata per la creazione di indici:

  1. Progettare l'indice.

    La progettazione degli indici rappresenta un'attività di fondamentale importanza. Nell'ambito della progettazione degli indici è necessario determinare le colonne da utilizzare, selezionare il tipo di indice, ad esempio cluster o non cluster, selezionare le opzioni di indice appropriate e determinare il posizionamento dello schema di partizione o di filegroup. Per ulteriori informazioni, vedere Progettazione di indici.

  2. Determinare il metodo di creazione ottimale. Per la creazione degli indici è possibile utilizzare i metodi seguenti:

    • Definire un vincolo PRIMARY KEY o UNIQUE su una colonna tramite CREATE TABLE o ALTER TABLE.

      In Motore di database di SQL Server viene creato automaticamente un indice univoco per imporre i requisiti di univocità di un vincolo PRIMARY KEY o UNIQUE. Per impostazione predefinita, viene creato un indice cluster univoco per imporre un vincolo PRIMARY KEY, a meno che nella tabella non esista già un indice cluster oppure non venga specificato un indice non cluster univoco. Per impostazione predefinita, viene creato un indice non cluster univoco per imporre un vincolo UNIQUE a meno che non venga specificato in modo esplicito un indice cluster univoco e nella tabella non esista un indice cluster.

      È inoltre possibile specificare opzioni e posizione dell'indice, nonché lo schema di partizione o di filegroup.

      A un indice creato nell'ambito di un vincolo PRIMARY KEY o UNIQUE viene automaticamente assegnato lo stesso nome del vincolo. Per ulteriori informazioni, vedere Vincoli PRIMARY KEY e Vincoli UNIQUE.

    • Creare un indice indipendente da un vincolo tramite l'istruzione CREATE INDEX oppure la finestra di dialogo Nuovo indice in Esplora oggetti di SQL Server Management Studio.

      È necessario specificare il nome dell'indice, della tabella e delle colonne cui applicare l'indice. È inoltre possibile specificare opzioni e posizione dell'indice, nonché lo schema di partizione o di filegroup. Per impostazione predefinita, viene creato un indice non cluster non univoco se non sono state specificate le opzioni di clustering e di univocità. Per creare un indice filtrato, utilizzare la clausola WHERE facoltativa. Per ulteriori informazioni, vedere Linee guida per la progettazione di indici filtrati.

  3. Creare l'indice.

    La creazione dell'indice in una tabella vuota o in una che contiene dati costituisce un importante fattore da tenere in considerazione. La creazione di un indice in una tabella vuota non influisce sulle prestazioni quando si crea l'indice, ma quando si aggiungono dati alla tabella.

    È opportuno pianificare con attenzione la creazione di indici in tabelle di grandi dimensioni in modo da non influire negativamente sulle prestazioni del database. La strategia ottimale per la creazione di indici in tabelle di grandi dimensioni consiste nel creare innanzitutto l'indice cluster e quindi gli eventuali indici non cluster. Provare a impostare l'opzione ONLINE su ON quando si creano indici in tabelle esistenti. Se questa opzione è impostata su ON, i blocchi a lungo termine a livello di tabella non vengono mantenuti, pertanto l'esecuzione di query o aggiornamenti sulla tabella sottostante può proseguire. Per ulteriori informazioni, vedere Esecuzione di operazioni in linea su indici.

Considerazioni sull'implementazione

Nella tabella seguente vengono elencati i valori massimi applicabili a indici cluster, non cluster, spaziali, filtrati e XML. A meno che non venga specificato, le limitazioni sono valide per tutti i tipi di indice.

Limiti massimi dell'indice

Valore

Informazioni aggiuntive

Indici cluster per tabella

1

 

Indici non cluster per tabella

999

Include gli indici non cluster creati tramite i vincoli PRIMARY KEY o UNIQUE e gli indici filtrati, ma non gli indici XML.

Indici XML per tabella

249

Include gli indici XML primari e secondari su colonne il cui tipo di dati è xml.

Indici su colonne con tipo di dati XML

Indici spaziali per ogni tabella

249

Utilizzo degli indici spaziali (Motore di database)

Numero di colonne chiave per indice

16*

L'indice cluster è limitato a 15 colonne se la tabella contiene anche un indice XML primario o indici spaziali.

Dimensione massima delle chiavi di indice.

Dimensioni del record delle chiavi dell'indice

900 byte*

Non si applica a indici XML o spaziali.

Affinché una tabella supporti indici spaziali, il valore delle dimensioni massime del record delle chiavi dell'indice è 895 byte.

Dimensione massima delle chiavi di indice.

*Per ovviare alle limitazioni degli indici non cluster relative al numero di colonne chiave dell'indice e alla dimensione dei record, includere nell'indice colonne non chiave. Per ulteriori informazioni, vedere Indice con colonne incluse.

Tipi di dati

È in genere possibile indicizzare qualsiasi colonna di una tabella o di una vista. Nella tabella seguente sono elencati i tipi di dati per i quali l'indicizzazione può essere soggetta a restrizioni.

Tipo di dati

Indicizzazione

Informazioni aggiuntive

Tipo CLR definito dall'utente

Può essere indicizzato se è supportato l'ordinamento binario.

Utilizzo di tipi CLR definiti dall'utente

Tipi di dati LOB (Large Object): image, ntext, text, varchar(max), nvarchar(max), varbinary(max) e xml

Non può essere una colonna chiave dell'indice. Una colonna XML può tuttavia essere una colonna chiave in un indice XML primario o secondario di una tabella.

Può essere indicizzato come colonne non chiave (incluse) di un indice non cluster, ad eccezione di image, ntext e text.

Può essere indicizzato se è incluso in un'espressione di colonna calcolata.

Indice con colonne incluse

Indici su colonne con tipo di dati XML

Colonne calcolate

Può essere indicizzato. Sono incluse le colonne calcolate definite come chiamate di metodo di una colonna di tipo CLR definito dall'utente, purché i metodi siano contrassegnati come deterministici.

Le colonne calcolate derivate da tipi di dati LOB possono essere indicizzate come colonne chiave o non chiave, purché il tipo di dati della colonna calcolata possa essere utilizzato per una colonna chiave di indice o una colonna non chiave.

Creazione di indici per le colonne calcolate

Colonne Varchar spostate all'esterno delle righe

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 si crea un indice cluster su una colonna varchar e nell'unità di allocazione IN_ROW_DATA sono disponibili dati esistenti, le successive operazioni di inserimento o aggiornamento eseguite sulla colonna e che comportano uno spostamento dei dati all'esterno delle righe avranno esito negativo.

Organizzazione di tabelle e indici

Dati di overflow della riga che superano 8 KB

geometry

Tipo che può essere indicizzato con più indici spaziali.

Tipi di dati spaziali

Considerazioni aggiuntive

Di seguito sono riportate ulteriori considerazioni relative alla creazione di un indice:

  • È possibile creare un indice se si dispone dell'autorizzazione CONTROL o ALTER per la tabella.

  • Dopo la creazione, l'indice viene automaticamente attivato ed è disponibile per l'utilizzo. Per rimuovere l'accesso a un indice, è necessario disattivarlo. Per ulteriori informazioni, vedere Disabilitazione di indici.

Requisiti di spazio su disco

La quantità di spazio su disco necessaria per l'archiviazione dell'indice dipende dai fattori seguenti:

Considerazioni sulle prestazioni

Il tempo necessario per la creazione fisica di un indice dipende in larga misura dal sottosistema disco. Di seguito vengono indicati i fattori da considerare:

  • Modello di recupero del database. Il modello di recupero con registrazione minima delle operazioni bulk garantisce prestazioni migliori e richiede meno spazio per i log durante l'operazione di creazione dell'indice rispetto al modello di recupero con registrazione completa. Questo modello di recupero comporta tuttavia una riduzione della flessibilità nel caso dei recuperi temporizzati. Per ulteriori informazioni, vedere Scelta di un modello di recupero per le operazioni sugli indici.

  • Livello RAID (Redundant Array of Independent Disks) utilizzato per l'archiviazione dei file di database e dei file di log delle transazioni. La larghezza di banda di I/O è in genere migliore con i livelli RAID che utilizzano lo striping.

  • Numero di dischi nell'array, se si utilizza RAID. La velocità di trasferimento dati aumenta proporzionalmente al numero di unità dell'array.

  • Posizione di archiviazione degli ordinamenti intermedi dei dati. L'utilizzo dell'opzione SORT_IN_TEMPDB può determinare una riduzione del tempo necessario per la creazione di un indice quando tempdb è posizionato in un set di dischi diverso rispetto al database utente. Per ulteriori informazioni, vedere tempdb e creazione dell'indice.

  • Creazione dell'indice in linea o non in linea.

    Quando si crea un indice non in linea (impostazione predefinita), i blocchi esclusivi vengono mantenuti sulla tabella sottostante fino al completamento della transazione per la creazione dell'indice. Tale tabella è inaccessibile agli utenti durante la creazione dell'indice.

    Ad eccezione di indici XML e spaziali, è possibile specificare che l'indice venga creato in linea. Se l'opzione Online è impostata su ON, i blocchi a lungo termine a livello di tabella non vengono mantenuti, pertanto l'esecuzione di query o aggiornamenti sulla tabella sottostante può proseguire anche durante la creazione dell'indice. Le operazioni basate su indice in linea sono consigliabili purché si tenga tuttavia conto dell'ambiente e dei requisiti specifici. Potrebbe infatti essere preferibile eseguire questo tipo di operazioni non in linea. In tal modo, gli utenti disporranno di accesso limitato ai dati per la durata dell'operazione, tuttavia il completamento dell'operazione richiederà meno tempo e un numero inferiore di risorse. Per ulteriori informazioni, vedere Esecuzione di operazioni in linea su indici.

Per creare un vincolo PRIMARY KEY o UNIQUE durante la creazione di una tabella

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

Per creare un indice

Cronologia modifiche

Aggiornamento del contenuto

Aggiornamento del limite degli indici non cluster a 999.