Descrizione di indici cluster e non cluster.Clustered and Nonclustered Indexes Described

In questo argomento si applica a: SìSQL ServerSìDatabase SQL di AzurenonAzure SQL Data Warehouse non Parallel Data WarehouseTHIS TOPIC APPLIES TO: yesSQL ServeryesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

Per il contenuto relativo alle versioni precedenti di SQL Server, vedere Descrizione di indici cluster e non cluster.For content related to previous versions of SQL Server, see Clustered and Nonclustered Indexes Described.

Un indice è una struttura su disco associata a una tabella o a una vista che consente di recuperare in modo rapido le righe della tabella o della vista.An index is an on-disk structure associated with a table or view that speeds retrieval of rows from the table or view. L'indice contiene chiavi costituite da una o più colonne della tabella o della vista.An index contains keys built from one or more columns in the table or view. Tali chiavi vengono archiviate in una struttura (albero B) che consente a SQL ServerSQL Server di individuare con rapidità ed efficienza la riga o le righe associate ai valori di chiave.These keys are stored in a structure (B-tree) that enables SQL ServerSQL Server to find the row or rows associated with the key values quickly and efficiently.

Una tabella o una vista può contenere i tipi di indici seguenti:A table or view can contain the following types of indexes:

  • ClusterClustered

    • Gli indici cluster ordinano e archiviano le righe di dati della tabella in base ai valori di chiave,Clustered indexes sort and store the data rows in the table or view based on their key values. ovvero alle colonne incluse nella definizione dell'indice.These are the columns included in the index definition. Per ogni tabella è disponibile un solo indice cluster, poiché alle righe di dati è possibile applicare un solo tipo di ordinamento.There can be only one clustered index per table, because the data rows themselves can be sorted in only one order.

    • Le righe di dati di una tabella vengono archiviate con ordinamento solo se la tabella contiene un indice cluster.The only time the data rows in a table are stored in sorted order is when the table contains a clustered index. Una tabella con indice cluster è denominata tabella cluster.When a table has a clustered index, the table is called a clustered table. Se la tabella non contiene un indice cluster, le righe di dati vengono archiviate in una struttura non ordinata denominata heap.If a table has no clustered index, its data rows are stored in an unordered structure called a heap.

  • Non clusterNonclustered

    • Gli indici non cluster presentano una struttura distinta dalle righe di dati.Nonclustered indexes have a structure separate from the data rows. Un indice non cluster contiene i valori di chiave dell'indice non cluster, ciascuno dei quali dispone di un puntatore alla riga di dati che contiene il valore di chiave.A nonclustered index contains the nonclustered index key values and each key value entry has a pointer to the data row that contains the key value.

    • Il puntatore da una riga di indice non cluster a una riga di dati è denominato indicatore di posizione delle righe.The pointer from an index row in a nonclustered index to a data row is called a row locator. La struttura dell'indicatore di posizione delle righe dipende dal tipo di archiviazione delle pagine di dati (heap o tabella cluster).The structure of the row locator depends on whether the data pages are stored in a heap or a clustered table. Nel caso di un heap, l'indicatore di posizione delle righe è un puntatore alla riga.For a heap, a row locator is a pointer to the row. Nel caso di una tabella cluster, l'indicatore di posizione delle righe è la chiave di indice cluster.For a clustered table, the row locator is the clustered index key.

    • È possibile aggiungere colonne non chiave al livello foglia dell'indice non cluster per ignorare i limiti esistenti ed eseguire query indicizzate completamente coperte.You can add nonkey columns to the leaf level of the nonclustered index to by-pass existing index key limits, and execute fully covered, indexed, queries. Per altre informazioni, vedere Creare indici con colonne incluse.For more information, see Create Indexes with Included Columns. Per informazioni dettagliate sui limiti delle chiavi dell'indice, vedere Specifiche di capacità massima per SQL Server.For details about index key limits see Maximum Capacity Specifications for SQL Server.

    Sia gli indici cluster che non cluster possono essere univoci.Both clustered and nonclustered indexes can be unique. In tal caso due righe possono avere lo stesso valore di chiave di indice.This means no two rows can have the same value for the index key. In caso contrario, l'indice non è univoco e più righe possono condividere lo stesso valore di chiave.Otherwise, the index is not unique and multiple rows can share the same key value. Per altre informazioni, vedere Creare indici univoci.For more information, see Create Unique Indexes.

    Gli indici di una tabella o di una vista vengono gestiti automaticamente in caso di modifica dei dati della tabella.Indexes are automatically maintained for a table or view whenever the table data is modified.

    Vedere Indici per altri tipi di indici usati per scopi speciali.See Indexes for additional types of special purpose indexes.

Indici e vincoliIndexes and Constraints

Gli indici vengono creati automaticamente quando si definiscono vincoli PRIMARY KEY e UNIQUE sulle colonne della tabella.Indexes are automatically created when PRIMARY KEY and UNIQUE constraints are defined on table columns. Quando, ad esempio, si crea una tabella e si identifica una colonna specifica da utilizzare come chiave primaria, nel Motore di databaseDatabase Engine verrà automaticamente creato un vincolo PRIMARY KEY e un indice su quella colonna.For example, when you create a table and identify a particular column to be the primary key, the Motore di databaseDatabase Engine automatically creates a PRIMARY KEY constraint and index on that column. Per altre informazioni, vedere Creare chiavi primarie e Creare vincoli univoci.For more information, see Create Primary Keys and Create Unique Constraints.

Utilizzo degli indici in Query OptimizerHow Indexes Are Used by the Query Optimizer

Se correttamente progettati, gli indici contribuiscono a ridurre le operazioni di I/O su disco e l'utilizzo di risorse di sistema, migliorando pertanto le prestazioni delle query.Well-designed indexes can reduce disk I/O operations and consume fewer system resources therefore improving query performance. Gli indici possono inoltre risultare utili in una vasta gamma di query che contengono le istruzioni SELECT, UPDATE, DELETE o MERGE.Indexes can be helpful for a variety of queries that contain SELECT, UPDATE, DELETE, or MERGE statements. Si consideri la query SELECT Title, HireDate FROM HumanResources.Employee WHERE EmployeeID = 250 nel database AdventureWorks2012AdventureWorks2012 .Consider the query SELECT Title, HireDate FROM HumanResources.Employee WHERE EmployeeID = 250 in the AdventureWorks2012AdventureWorks2012 database. Quando viene eseguita questa query, Query Optimizer valuta i singoli metodi disponibili per il recupero dei dati e seleziona quello più efficace.When this query is executed, the query optimizer evaluates each available method for retrieving the data and selects the most efficient method. Il metodo può prevedere un'analisi di tabella oppure di uno o più indici eventualmente esistenti.The method may be a table scan, or may be scanning one or more indexes if they exist.

Durante un'analisi di tabella Query Optimizer legge tutte le righe della tabella ed estrae quelle che soddisfano i criteri della query.When performing a table scan, the query optimizer reads all the rows in the table, and extracts the rows that meet the criteria of the query. Pur generando molte operazioni di I/O su disco e talvolta utilizzando un elevato numero di risorse,A table scan generates many disk I/O operations and can be resource intensive. un'analisi di tabella può costituire il metodo più efficace se, ad esempio, il set di risultati della query include un'elevata percentuale di righe della tabella.However, a table scan could be the most efficient method if, for example, the result set of the query is a high percentage of rows from the table.

Se invece Query Optimizer utilizza un indice, esegue la ricerca delle colonne chiave dell'indice, individua la posizione di archiviazione delle righe richieste dalla query ed estrae solo quelle corrispondenti.When the query optimizer uses an index, it searches the index key columns, finds the storage location of the rows needed by the query and extracts the matching rows from that location. La ricerca basata sull'indice è in genere più rapida rispetto a quella basata sulla tabella perché, a differenza di una tabella, un indice contiene di frequente pochissime colonne per riga e le righe sono ordinate.Generally, searching the index is much faster than searching the table because unlike a table, an index frequently contains very few columns per row and the rows are in sorted order.

Query Optimizer seleziona in genere il metodo più efficace durante l'esecuzione delle query.The query optimizer typically selects the most efficient method when executing queries. Se, tuttavia, non è disponibile alcun indice, verrà utilizzata un'analisi di tabella.However, if no indexes are available, the query optimizer must use a table scan. L'attività consiste nel progettare e creare indici adatti all'ambiente in modo che in Query Optimizer sia presente una selezione di indici efficienti da cui effettuare una selezione.Your task is to design and create indexes that are best suited to your environment so that the query optimizer has a selection of efficient indexes from which to select. SQL ServerSQL Server fornisce l' Ottimizzazione guidata motore di database per facilitare l'analisi dell'ambiente del database e la selezione di indici adatti. provides the Database Engine Tuning Advisor to help with the analysis of your database environment and in the selection of appropriate indexes.

Creare indici clusterCreate Clustered Indexes

Creare indici non clusterCreate Nonclustered Indexes