Tipi di query e indici

Quando si valuta l'opportunità di creare un indice su una colonna, considerare il modo in cui la colonna viene utilizzata nelle query. Nella tabella seguente vengono descritti i tipi di query per i quali sono utili gli indici.

[!NOTA]

Gli esempi nella tabella si basano sul database di esempio AdventureWorks. Quando si eseguono gli esempi in SQL Server Management Studio è possibile visualizzare gli indici che vengono selezionati da Query Optimizer visualizzando il piano di esecuzione effettivo. Per ulteriori informazioni, vedere Procedura: Visualizzazione di un piano di esecuzione effettivo.

Query in cui il predicato della colonna è uno dei seguenti

Descrizione della query ed esempio

Indice consigliato

Corrispondenza esatta a un valore specifico

Ricerca una corrispondenze esatta in cui la query utilizza la clausola WHERE per specificare una voce di colonna con un valore specifico. Ad esempio:

SELECT EmployeeID, Title 
FROM HumanResources.Employee 
WHERE EmployeeID = 228; 

Indice cluster o non cluster sulla colonna EmployeeID.

Corrispondenze esatta a un valore contenuto in un elenco IN (x,y,z)

Ricerca una corrispondenze esatta a un valore presente in un elenco di valori specificati. Ad esempio:

SELECT EmployeeID, Title 
FROM HumanResources.Employee 
WHERE EmployeeID IN (288, 30, 15);

Indice cluster o non cluster sulla colonna EmployeeID.

Intervallo di valori

Ricerca un intervallo di valori nel quale la query specifica qualsiasi voce il cui valore è compreso tra due valori. Ad esempio:

SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID BETWEEN 1 and 5;

oppure

WHERE ProductModelID >= 1 AND ProductModelID <= 5

Indice cluster o non cluster sulla colonna ProductModelID.

Join tra tabelle

Ricerca righe in una tabella che corrispondono, in base a un predicato di join, a una riga in un'altra tabella. Ad esempio:

SELECT a.ProductAssemblyID, b.Name, a.PerAssemblyQty
FROM Production.BillOfMaterials AS a
JOIN Production.Product AS b 
ON a.ProductAssemblyID = b.ProductID
WHERE b.ProductID = 900;

Indice cluster o non cluster sulle colonne ProductID e ProductAssemblyID.

Confronto LIKE

Ricerca righe corrispondenti che iniziano con una stringa di caratteri specifica, ad esempio "abc%". Ad esempio:

SELECT CountryRegionCode, Name 
FROM Person.CountryRegion 
WHERE Name LIKE N'D%'

Indice cluster o non cluster sulla colonna Name.

Ordinata o aggregata

Richiede un ordinamento implicito o esplicito oppure un'aggregazione (GROUP BY). Ad esempio:

SELECT a.WorkOrderID, b.ProductID, a.OrderQty, a.DueDate 
FROM Production.WorkOrder AS a
JOIN Production.WorkOrderRouting AS b 
ON a.WorkOrderID = b.WorkOrderID
ORDER BY a.WorkOrderID;

Indice cluster o non cluster sulla colonna ordinata o aggregata.

Per le colonne da ordinare, prendere in considerazione l'opportunità di specificare il tipo di ordinamento della colonna (ASC o DESC).

Vincolo PRIMARY KEY o UNIQUE

Ricerca duplicati di nuovi valori di chiave di indice in operazioni di inserimento e aggiornamento per imporre i vincoli PRIMARY KEY e UNIQUE. Ad esempio:

INSERT INTO Production.UnitMeasure (UnitMeasureCode, Name, ModifiedDate)
VALUES ('OZ1', 'OuncesTest', GetDate());

Indice cluster o non cluster sulle colonne definite nel vincolo.

Operazione UPDATE o DELETE in una relazione tra chiave primaria e chiave esterna

Ricerca le righe in un'operazione di eliminazione o di aggiornamento nelle quali la colonna partecipa a una relazione tra chiave primaria e chiave esterna, con o senza l'opzione CASCADE.

Indice cluster o non cluster sulla colonna chiave esterna.

La colonna è inclusa nell'elenco di selezione, ma non nel predicato.

Contiene una o più colonne dell'elenco di selezione non utilizzate per le ricerche. Ad esempio:

SELECT Title, Revision, FileName
FROM Production.Document
WHERE Title LIKE N'%Maintenance%' AND Revision >= 0';

Indice non cluster con FileName specificato nella clausola INCLUDE.