Creare indici con colonne incluseCreate Indexes with Included Columns

QUESTO ARGOMENTO SI APPLICA A: sìSQL Server (a partire dalla versione 2016)sìDatabase SQL di AzurenoAzure SQL Data Warehouse noParallel Data Warehouse THIS TOPIC APPLIES TO: yesSQL Server (starting with 2016)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

In questo argomento si illustra come aggiungere colonne incluse (o non chiave) per estendere la funzionalità di indici non cluster in SQL ServerSQL Server tramite SQL Server Management StudioSQL Server Management Studio o Transact-SQLTransact-SQL.This topic describes how to add included (or nonkey) columns to extend the functionality of nonclustered indexes in SQL ServerSQL Server by using SQL Server Management StudioSQL Server Management Studio or Transact-SQLTransact-SQL. Con l'inclusione di colonne non chiave è possibile creare indici non cluster in grado di coprire più query.By including nonkey columns, you can create nonclustered indexes that cover more queries. Ciò è possibile perché le colonne non chiave presentano i vantaggi seguenti:This is because the nonkey columns have the following benefits:

  • Possono essere tipi di dati che non sono consentiti come colonne chiave indice.They can be data types not allowed as index key columns.

  • Non vengono prese in esame dal Motore di databaseDatabase Engine durante il calcolo del numero di colonne chiave indice o della dimensione delle chiavi di indice.They are not considered by the Motore di databaseDatabase Engine when calculating the number of index key columns or index key size.

    Con un indice con colonne non chiave è possibile aumentare significativamente le prestazioni delle query quando tutte le relative colonne sono incluse nell'indice come colonne chiave o non chiave.An index with nonkey columns can significantly improve query performance when all columns in the query are included in the index either as key or nonkey columns. I vantaggi nelle prestazioni si ottengono poiché Query Optimizer può individuare tutti i valori delle colonne all'interno dell'indice. In questo modo, la quantità di operazioni di I/O su disco è inferiore dato che non viene eseguito alcun accesso ai dati delle tabelle o degli indici cluster.Performance gains are achieved because the query optimizer can locate all the column values within the index; table or clustered index data is not accessed resulting in fewer disk I/O operations.

Nota

Quando in un indice sono contenute tutte le colonne a cui fa riferimento una query, viene generalmente indicato come copertura della query.When an index contains all the columns referenced by a query it is typically referred to as covering the query.

Contenuto dell'argomentoIn This Topic

Prima di iniziare Before You Begin

Indicazioni sulla progettazione Design Recommendations

  • Progettare nuovamente gli indici non cluster con chiavi di indice dalle dimensioni elevate in modo da utilizzare come colonne chiave solo le colonne utilizzate per le ricerche.Redesign nonclustered indexes with a large index key size so that only columns used for searching and lookups are key columns. Modificare in colonne non chiave tutte le altre colonne che coprono la query.Make all other columns that cover the query into nonkey columns. In questo modo si avranno tutte le colonne necessarie per coprire la query, contenendo al tempo stesso le dimensioni della chiave dell'indice e mantenendone l'efficienza.In this way, you will have all columns needed to cover the query, but the index key itself is small and efficient.

  • Includere colonne non chiave in un indice non cluster per evitare il superamento delle limitazioni di dimensione correnti degli indici, ovvero numero massimo di colonne chiave pari a 32 e dimensione massima delle chiavi di indice pari a 1.700 byte (16 colonne chiave e 900 byte prima di SQL Server 2016SQL Server 2016).Include nonkey columns in a nonclustered index to avoid exceeding the current index size limitations of a maximum of 32 key columns and a maximum index key size of 1,700 bytes (16 key columns and 900 bytes prior to SQL Server 2016SQL Server 2016). Il Motore di databaseDatabase Engine non prende in esame le colonne non chiave durante il calcolo del numero di colonne chiave indice o della dimensione delle chiavi di indice.The Motore di databaseDatabase Engine does not consider nonkey columns when calculating the number of index key columns or index key size.

Limitazioni e restrizioni Limitations and Restrictions

  • Le colonne non chiave possono essere definite solo negli indici non cluster.Nonkey columns can only be defined on nonclustered indexes.

  • È possibile usare come colonne non chiave tutti i tipi di dati eccetto text, ntexte image .All data types except text, ntext, and image can be used as nonkey columns.

  • Le colonne calcolate deterministiche, precise o imprecise, possono essere colonne non chiave.Computed columns that are deterministic and either precise or imprecise can be nonkey columns. Per altre informazioni, vedere Indici per le colonne calcolate.For more information, see Indexes on Computed Columns.

  • Le colonne calcolate derivate dai tipi di dati image, ntexte text possono essere colonne non chiave purché il tipo di dati della colonna calcolata sia consentito come colonna non chiave dell'indice.Computed columns derived from image, ntext, and text data types can be nonkey columns as long as the computed column data type is allowed as a nonkey index column.

  • Non è possibile rimuovere da una tabella le colonne non chiave se non si è prima eliminato l'indice di questa tabella.Nonkey columns cannot be dropped from a table unless that table’s index is dropped first.

  • Non è possibile modificare le colonne non chiave se non per eseguire le operazioni seguenti:Nonkey columns cannot be changed, except to do the following:

    • Modifica del supporto di valori NULL della colonna da NOT NULL a NULL.Change the nullability of the column from NOT NULL to NULL.

    • Aumento della lunghezza di colonne varchar, nvarcharo varbinary .Increase the length of varchar, nvarchar, or varbinary columns.

Sicurezza Security

Autorizzazioni Permissions

È richiesta l'autorizzazione ALTER per la tabella o la vista.Requires ALTER permission on the table or view. L'utente deve essere un membro del ruolo predefinito del server sysadmin o dei ruoli predefiniti del database db_ddladmin e db_owner .User must be a member of the sysadmin fixed server role or the db_ddladmin and db_owner fixed database roles.

Utilizzo di SQL Server Management Studio Using SQL Server Management Studio

Per creare un indice con colonne non chiaveTo create an index with nonkey columns

  1. In Esplora oggetti fare clic sul segno più per espandere il database contenente la tabella in cui si desidera creare un indice con colonne non chiave.In Object Explorer, click the plus sign to expand the database that contains the table on which you want to create an index with nonkey columns.

  2. Fare clic sul segno più per espandere la cartella Tabelle .Click the plus sign to expand the Tables folder.

  3. Fare clic sul segno più per espandere la tabella in cui si desidera creare un indice con colonne non chiave.Click the plus sign to expand the table on which you want to create an index with nonkey columns.

  4. Fare clic con il pulsante destro del mouse sulla cartella Indici , scegliere Nuovo indicee selezionare Indice non cluster.Right-click the Indexes folder, point to New Index, and select Non-Clustered Index….

  5. Nella pagina Generale della finestra di dialogo Nuovo indice immettere il nome del nuovo indice nella casella Nome indice .In the New Index dialog box, on the General page, enter the name of the new index in the Index name box.

  6. Nella scheda Colonne chiave indice scegliere Aggiungi.Under the Index key columns tab, click Add….

  7. Nella finestra di dialogo Seleziona colonne datable_name selezionare le caselle di controllo delle colonne della tabella da aggiungere all'indice.In the Select Columns fromtable_name dialog box, select the check box or check boxes of the table column or columns to be added to the index.

  8. Scegliere OK.Click OK.

  9. Nella scheda Colonne incluse scegliere Aggiungi.Under the Included columns tab, click Add….

  10. Nella finestra di dialogo Seleziona colonne datable_name selezionare le caselle di controllo delle colonne di tabella da aggiungere all'indice come colonne non chiave.In the Select Columns fromtable_name dialog box, select the check box or check boxes of the table column or columns to be added to the index as nonkey columns.

  11. Scegliere OK.Click OK.

  12. Nella finestra di dialogo Nuovo indice fare clic su OK.In the New Index dialog box, click OK.

Utilizzo di Transact-SQL Using Transact-SQL

Per creare un indice con colonne non chiaveTo create an index with nonkey columns

  1. In Esplora oggetticonnettersi a un'istanza del Motore di databaseDatabase Engine.In Object Explorer, connect to an instance of Motore di databaseDatabase Engine.

  2. Sulla barra Standard fare clic su Nuova query.On the Standard bar, click New Query.

  3. Copiare e incollare l'esempio seguente nella finestra Query, quindi fare clic su Esegui.Copy and paste the following example into the query window and click Execute.

    USE AdventureWorks2012;  
    GO  
    -- Creates a nonclustered index on the Person.Address table with four included (nonkey) columns.   
    -- index key column is PostalCode and the nonkey columns are  
    -- AddressLine1, AddressLine2, City, and StateProvinceID.  
    CREATE NONCLUSTERED INDEX IX_Address_PostalCode  
    ON Person.Address (PostalCode)  
    INCLUDE (AddressLine1, AddressLine2, City, StateProvinceID);  
    GO  
    

    Per altre informazioni, vedere CREATE INDEX (Transact-SQL).For more information, see CREATE INDEX (Transact-SQL).