Creazione di indici non cluster

In una tabella o in una vista indicizzata è possibile creare più indici non cluster. Gli indici non cluster vengono creati generalmente per migliorare le prestazioni delle query di utilizzo frequente non coperte dall'indice cluster.

Implementazioni tipiche

Gli indici non cluster vengono implementati nei modi seguenti:

  • Vincoli PRIMARY KEY e UNIQUE

    Quando si crea un vincolo PRIMARY KEY, se nella tabella non è già presente un indice cluster e l'utente non specifica un indice non cluster univoco, sulle colonne viene creato automaticamente un indice cluster univoco. La colonna chiave primaria non può supportare i valori NULL.

    Quando si crea un vincolo UNIQUE, viene creato un indice cluster univoco per imporre un vincolo UNIQUE per impostazione predefinita. È possibile specificare un indice cluster univoco se nella tabella non ne esiste già uno. Per ulteriori informazioni, vedere Vincoli PRIMARY KEY e Vincoli UNIQUE.

  • Indice indipendente da un vincolo

    Per impostazione predefinita, viene creato un indice non cluster se non è stato specificato l'indice cluster. Il numero massimo di indici non cluster che è possibile creare per tabella è 999. Ciò include gli indici creati tramite i vincoli PRIMARY KEY o UNIQUE, ma non gli indici XML o spaziali.

  • Indice non cluster su una vista indicizzata

    Dopo la creazione di un indice cluster univoco su una vista, è possibile creare indici non cluster. Per ulteriori informazioni, vedere Creazione di viste indicizzate.

Indice con colonne incluse

Quando si crea un indice non cluster per coprire una query, è possibile includere nella definizione dell'indice colonne non chiave, per la copertura delle colonne della query non utilizzate come colonne primarie per la ricerca. Ciò consente di ottenere miglioramenti delle prestazioni, perché Query Optimizer è in grado di individuare tutti i dati di colonna necessari nell'indice. L'accesso alla tabella o all'indice cluster non viene effettuato. Per ulteriori informazioni, vedere Indice con colonne incluse.

Indice con un predicato del filtro

Un indice filtrato è un indice non cluster ottimizzato, particolarmente indicato per coprire query che selezionano dati da un subset ben definito. Un indice di questo tipo utilizza un predicato del filtro per indicizzare una parte di righe nella tabella. Se confrontato con indici di tabella completa, un indice filtrato progettato correttamente consente di migliorare le prestazioni di esecuzione delle query e di ridurre i costi di manutenzione e di archiviazione dell'indice stesso.

Per ulteriori informazioni, vedere Linee guida per la progettazione di indici filtrati.

Requisiti di spazio su disco

Per informazioni sui requisiti di spazio su disco degli indici non cluster, vedere Individuazione dei requisiti di spazio su disco per gli indici.

Considerazioni sulle prestazioni

Sebbene sia importante che l'indice contenga tutte le colonne utilizzate dalla query, l'aggiunta di colonne non necessarie va evitata. L'aggiunta di troppe colonne di indice, chiave o non chiave, può avere le conseguenze seguenti sulle prestazioni:

  • Ogni pagina conterrà un numero minore di righe di indice, con un aumento dell'I/O su disco e una riduzione dell'efficienza della cache.

  • Per l'archiviazione dell'indice sarà necessario più spazio su disco.

  • La manutenzione dell'indice può aumentare il tempo necessario all'esecuzione di modifiche, inserimenti, aggiornamenti, eliminazioni o unioni nella tabella o nella vista indicizzata sottostante.

Si consiglia di determinare se i miglioramenti nella prestazione della query compensano gli effetti sulle prestazioni durante la modifica dei dati e in termini di requisiti di spazio su disco. Per ulteriori informazioni sulla valutazione delle prestazioni delle query, vedere Ottimizzazione delle query.

Utilizzare un indice filtrato per migliorare le prestazioni quando i dati della tabella dispongono di colonne con subset ben definiti di righe, ad esempio colonne di tipo sparse, colonne in cui la maggior parte dei valori è Null, colonne con categorie e colonne con intervalli di valori distinti. Per ulteriori informazioni, vedere Linee guida per la progettazione di indici filtrati.

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

CREATE TABLE (Transact-SQL)

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

ALTER TABLE (Transact-SQL)

Per creare un indice

CREATE INDEX (Transact-SQL)