Creazione di indici con colonne incluse

È possibile estendere un indice non cluster includendo colonne non chiave oltre alle colonne chiave dell'indice. Le colonne non chiave vengono memorizzate al livello foglia dell'albero B dell'indice.

Gli indici che includono colonne non chiave offrono i maggiori vantaggi quando coprono la query, ossia quando includono tutte le colonne a cui la query fa riferimento. Per ulteriori informazioni, vedere Indice con colonne incluse.

Requisiti di spazio su disco

Gli indici con colonne non chiave richiedono una maggiore quantità di spazio su disco. In particolare, l'aggiunta di tipi di dati varchar(max), nvarchar(max), varbinary(max) o xml come colonne non chiave può aumentare in modo significativo i requisiti di spazio su disco, perché i valori delle colonne vengono copiati nel livello foglia dell'indice e permangono anche nell'indice cluster o di tabella.

Il processo per la determinazione dei requisiti di spazio su disco degli indici con colonne incluse è analogo a quello relativo agli indici non cluster. Per informazioni, vedere Individuazione dei requisiti di spazio su disco per gli indici.

Considerazioni sulle prestazioni

È possibile ottenere miglioramenti delle prestazioni in alcune operazioni, 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. L'inclusione di un numero eccessivo di colonne tuttavia, può aumentare il tempo necessario alla manutenzione dell'indice e di conseguenza all'esecuzione di modifiche, inserimenti, aggiornamenti o eliminazioni nella tabella o nella vista indicizzata sottostante.

Esempi

A. Copertura di una query

Nell'esempio seguente viene creato un indice non cluster nella tabella Person.Address con quattro colonne incluse. La colonna chiave dell'indice è PostalCode e le colonne non chiave sono AddressLine1, AddressLine2, City, e StateProvinceID.

USE AdventureWorks;
GO
CREATE NONCLUSTERED INDEX IX_Address_PostalCode
ON Person.Address (PostalCode)
INCLUDE (AddressLine1, AddressLine2, City, StateProvinceID);
GO

Questa query verrà coperta dall'indice.

SELECT AddressLine1, AddressLine2, City, StateProvinceID, PostalCode
FROM Person.Address
WHERE PostalCode BETWEEN '98000' and '99999';
GO

B. Superamento delle dimensioni massime dell'indice

Nell'esempio seguente, la clausola INCLUDE dell'istruzione CREATE INDEX viene utilizzata per l'indicizzazione di colonne che in genere supererebbero il limite di 900 byte stabilito per le colonne chiave. La tabella Production.ProductReview contiene le colonne ProductID(int), ReviewerName(nvarchar (50)) e Comments (nvarchar (3850)). Queste colonne vengono utilizzate di frequente nelle query, ma la colonna Comments è di dimensioni eccessive per la partecipazione come colonna chiave indice. Utilizzando la clausola INCLUDE tuttavia, è possibile aggiungere la colonna Comments nell'indice come colonna non chiave.

USE AdventureWorks;
GO
CREATE NONCLUSTERED INDEX IX_ProductReview_ProductID_ReviewerName
ON Production.ProductReview (ProductID, ReviewerName)
INCLUDE (Comments);
GO

Questa query verrà coperta dall'indice.

SELECT Comments
FROM Production.ProductReview 
WHERE ProductID = 937;
GO

Per creare un indice con colonne incluse