Creare indici clusterCreate Clustered Indexes

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

È possibile creare indici cluster nelle tabelle usando SQL Server Management StudioSQL Server Management Studio o Transact-SQLTransact-SQL.You can create clustered indexes on tables by using SQL Server Management StudioSQL Server Management Studio or Transact-SQLTransact-SQL. A parte poche eccezioni, ogni tabella deve disporre di un indice cluster.With few exceptions, every table should have a clustered index. Oltre a migliorare le prestazioni di esecuzione delle query, un indice può essere ricompilato o riorganizzato su richiesta per controllare la frammentazione della tabella.Besides improving query performance, a clustered index can be rebuilt or reorganized on demand to control table fragmentation. È inoltre possibile creare un indice cluster in una vista.A clustered index can also be created on a view. Gli indici cluster sono descritti nell'argomento Descrizione di indici cluster e non cluster.(Clustered indexes are defined in the topic Clustered and Nonclustered Indexes Described.)

Contenuto dell'argomentoIn This Topic

Prima di iniziareBefore You Begin

Modalità di implementazione tipicheTypical Implementations

Gli indici cluster vengono implementati nei modi seguenti:Clustered indexes are implemented in the following ways:

  • Vincoli PRIMARY KEY e UNIQUEPRIMARY KEY and UNIQUE constraints

    Quando si crea un vincolo PRIMARY KEY, viene automaticamente creato un indice cluster univoco nella colonna o nelle colonne se nella tabella non esiste già un indice cluster e non si specifica un indice non cluster univoco.When you create a PRIMARY KEY constraint, a unique clustered index on the column or columns is automatically created if a clustered index on the table does not already exist and you do not specify a unique nonclustered index. La colonna chiave primaria non può supportare i valori NULL.The primary key column cannot allow NULL values.

    Quando si crea un vincolo UNIQUE, viene creato un indice non cluster univoco per applicare un vincolo UNIQUE per impostazione predefinita.When you create a UNIQUE constraint, a unique nonclustered index is created to enforce a UNIQUE constraint by default. È possibile specificare un indice cluster univoco se nella tabella non ne esiste già uno.You can specify a unique clustered index if a clustered index on the table does not already exist.

    A un indice creato come parte del vincolo viene automaticamente assegnato lo stesso nome del vincolo.An index created as part of the constraint is automatically given the same name as the constraint name. Per ulteriori informazioni, vedere Primary and Foreign Key Constraints e Unique Constraints and Check Constraints.For more information, see Primary and Foreign Key Constraints and Unique Constraints and Check Constraints.

  • Indice indipendente da un vincoloIndex independent of a constraint

    È possibile creare un indice cluster in una colonna diversa dalla colonna chiave primaria a condizione che sia stato specificato un vincolo di chiave primaria non cluster.You can create a clustered index on a column other than primary key column if a nonclustered primary key constraint was specified.

Limitazioni e restrizioniLimitations and Restrictions

  • Quando viene creata una struttura dell'indice cluster, è necessario spazio su disco per la struttura vecchia (origine) e per quella nuova (destinazione) nei file e filegroup appropriati.When a clustered index structure is created, disk space for both the old (source) and new (target) structures is required in their respective files and filegroups. La struttura vecchia non viene deallocata fino a quando non viene eseguito il commit della transazione completa.The old structure is not deallocated until the complete transaction commits. Potrebbe inoltre essere necessario spazio su disco aggiuntivo temporaneo per l'ordinamento.Additional temporary disk space for sorting may also be required. Per altre informazioni, vedere Disk Space Requirements for Index DDL Operations.For more information, see Disk Space Requirements for Index DDL Operations.

  • Se viene creato un indice cluster in un heap con molti indici non cluster esistenti, tutti gli indici non cluster devono essere ricompilati in modo che contengano il valore della chiave di clustering anziché l'identificatore di riga (RID, Row Identifier).If a clustered index is created on a heap with several existing nonclustered indexes, all the nonclustered indexes must be rebuilt so that they contain the clustering key value instead of the row identifier (RID). In modo analogo, se viene eliminato un indice cluster di una tabella con molti indici non cluster, tutti gli indici non cluster verranno ricompilati durante l'operazione DROP.Similarly, if a clustered index is dropped on a table that has several nonclustered indexes, the nonclustered indexes are all rebuilt as part of the DROP operation. Per tabelle di grandi dimensioni, la ricostruzione degli indici potrebbe richiedere una notevole quantità di tempo.This may take significant time on large tables.

    La strategia ottimale per la compilazione di indici per tabelle di grandi dimensioni consiste nel compilare innanzitutto l'indice cluster e quindi eventuali indici non cluster.The preferred way to build indexes on large tables is to start with the clustered index and then build any nonclustered indexes. Quando si creano gli indici in tabelle esistenti, impostare l'opzione ONLINE su ON.Consider setting the ONLINE option to ON when you create indexes on existing tables. In questo modo, i blocchi di lunga durata a livello di tabella non vengono mantenuti,When set to ON, long-term table locks are not held. al fine di consentire l'esecuzione di query o l'aggiornamento della tabella sottostante.This enables queries or updates to the underlying table to continue. Per altre informazioni, vedere Perform Index Operations Online.For more information, see Perform Index Operations Online.

  • La chiave di indice di un indice cluster non può contenere colonne di tipo varchar con dati esistenti nell'unità di allocazione ROW_OVERFLOW_DATA.The index key of a clustered index cannot contain varchar columns that have existing data in the ROW_OVERFLOW_DATA allocation unit. Se viene creato un indice cluster in una colonna varchar e i dati esistenti si trovano nell'unità di allocazione IN_ROW_DATA, le azioni di inserimento o aggiornamento successive eseguite nella colonna che comporterebbero lo spostamento dei dati all'esterno delle righe avranno esito negativo.If a clustered index is created on a varchar column and the existing data is in the IN_ROW_DATA allocation unit, subsequent insert or update actions on the column that would push the data off-row will fail. Per ottenere informazioni sulle tabelle che potrebbero contenere dati di overflow della riga, usare la funzione a gestione dinamica sys.dm_db_index_physical_stats (Transact-SQL).To obtain information about tables that might contain row-overflow data, use the sys.dm_db_index_physical_stats (Transact-SQL) dynamic management function.

SicurezzaSecurity

AutorizzazioniPermissions

È 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 StudioUsing SQL Server Management Studio

Per creare un indice cluster tramite Esplora oggettiTo create a clustered index by using Object Explorer

  1. In Esplora oggetti espandere la tabella in cui si desidera creare un indice cluster.In Object Explorer, expand the table on which you want to create a clustered index.

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

  3. 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.

  4. In Colonne chiave indicefare clic su Aggiungi.Under Index key columns, click Add….

  5. Nella finestra di dialogo Seleziona colonne danome_tabella selezionare la casella di controllo della colonna della tabella da aggiungere all'indice cluster.In the Select Columns fromtable_name dialog box, select the check box of the table column to be added to the clustered index.

  6. Scegliere OK.Click OK.

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

Per creare un indice cluster tramite Progettazione tabelleTo create a clustered index by using the Table Designer

  1. In Esplora oggetti espandere il database in cui si desidera creare una tabella con un indice cluster.In Object Explorer, expand the database on which you want to create a table with a clustered index.

  2. Fare clic con il pulsante destro del mouse sulla cartella Tabelle e scegliere Nuova tabella.Right-click the Tables folder and click New Table….

  3. Creare una nuova tabella con il metodo tradizionale.Create a new table as you normally would. Per altre informazioni, vedere Creare tabelle (motore di database).For more information, see Create Tables (Database Engine).

  4. Fare clic con il pulsante destro del mouse sulla nuova tabella creata e scegliere Progetta.Right-click the new table created above and click Design.

  5. Scegliere Indici/chiavi nel menu Progettazione tabelle.On the Table Designer menu, click Indexes/Keys.

  6. Nella finestra di dialogo Indici/chiavi fare clic su Aggiungi.In the Indexes/Keys dialog box, click Add.

  7. Selezionare il nuovo indice nella casella di testo Chiave o indice primario/univoco selezionato .Select the new index in the Selected Primary/Unique Key or Index text box.

  8. Nella griglia selezionare Crea come CLUSTERED, quindi selezionare dall'elenco a discesa a destra della proprietà.In the grid, select Create as Clustered, and choose Yes from the drop-down list to the right of the property.

  9. Scegliere Chiudi.Click Close.

  10. Nel menu File scegliere Salvanome_tabella.On the File menu, click Savetable_name.

Utilizzo di Transact-SQLUsing Transact-SQL

Per creare un indice clusterTo create a clustered index

  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  
    -- Create a new table with three columns.  
    CREATE TABLE dbo.TestTable  
        (TestCol1 int NOT NULL,  
         TestCol2 nchar(10) NULL,  
         TestCol3 nvarchar(50) NULL);  
    GO  
    -- Create a clustered index called IX_TestTable_TestCol1  
    -- on the dbo.TestTable table using the TestCol1 column.  
    CREATE CLUSTERED INDEX IX_TestTable_TestCol1   
        ON dbo.TestTable (TestCol1);   
    GO  
    

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

Vedere ancheSee Also

Creazione di chiavi primarie Create Primary Keys
Creare vincoli univociCreate Unique Constraints