Creare indici cluster
È possibile creare indici cluster nelle tabelle di SQL Server 2012 utilizzando SQL Server Management Studio o Transact-SQL. A parte poche eccezioni, ogni tabella deve disporre di un indice cluster. Oltre a migliorare le prestazioni di esecuzione delle query, un indice può essere ricompilato o riorganizzato su richiesta per controllare la frammentazione della tabella. È inoltre possibile creare un indice cluster in una vista. Gli indici cluster sono definiti nell'argomento Descrizione di indici cluster e non cluster..
Contenuto dell'argomento
Prima di iniziare:
Modalità di implementazione tipiche
Limitazioni e restrizioni
Sicurezza
Per creare un indice cluster in una tabella tramite:
SQL Server Management Studio
Transact-SQL
Prima di iniziare
Modalità di implementazione tipiche
Gli indici cluster vengono implementati nei modi seguenti:
Vincoli PRIMARY KEY e UNIQUE
Quando si crea un vincolo PRIMARY KEY, se nella tabella non è già presente un indice cluster e l'utente non specifica un indice non cluster univoco, sulle colonne viene creato automaticamente un indice cluster univoco. La colonna chiave primaria non può supportare i valori NULL.
Quando si crea un vincolo UNIQUE, viene creato un indice cluster univoco per imporre un vincolo UNIQUE per impostazione predefinita. È possibile specificare un indice cluster univoco se nella tabella non esiste già un indice cluster.
A un indice creato come parte del vincolo viene automaticamente assegnato lo stesso nome del vincolo. Per ulteriori informazioni, vedere Vincoli di chiavi primarie ed esterne e Vincoli UNIQUE e CHECK.
Indice indipendente da un vincolo
È 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.
Limitazioni e restrizioni
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. La struttura vecchia non viene deallocata fino a quando non viene eseguito il commit della transazione completa. Potrebbe inoltre essere necessario spazio su disco aggiuntivo temporaneo per l'ordinamento. Per ulteriori informazioni, vedere Requisiti di spazio su disco per operazioni DLL sugli indici.
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). 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. Per tabelle di grandi dimensioni, la ricostruzione degli indici potrebbe richiedere una notevole quantità di tempo.
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. Quando si creano gli indici in tabelle esistenti, impostare l'opzione ONLINE su ON. In questo modo, i blocchi di lunga durata a livello di tabella non vengono mantenuti, al fine di consentire l'esecuzione di query o l'aggiornamento della tabella sottostante. Per ulteriori informazioni, vedere Eseguire operazioni online sugli indici.
La chiave di un indice cluster non può contenere colonne varchar per le quali sono presenti dati nell'unità di allocazione ROW_OVERFLOW_DATA. 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 di righe non verranno eseguite correttamente. Per ottenere informazioni su tabelle che potrebbero contenere dati di overflow della riga, utilizzare la funzione a gestione dinamica sys.dm_db_index_physical_stats (Transact-SQL).
Sicurezza
Autorizzazioni
È richiesta l'autorizzazione ALTER per la tabella o la vista. L'utente deve essere un membro del ruolo predefinito del server sysadmin o dei ruoli predefiniti del database db_ddladmin e db_owner.
[Top]
Utilizzo di SQL Server Management Studio
Per creare un indice cluster tramite Esplora oggetti
In Esplora oggetti espandere la tabella in cui si desidera creare un indice cluster.
Fare clic con il pulsante destro del mouse sulla cartella Indici, scegliere Nuovo indice e selezionare Indice cluster.
Nella pagina Generale della finestra di dialogo Nuovo indice immettere il nome del nuovo indice nella casella Nome indice.
In Colonne chiave indice fare clic su Aggiungi.
Nella finestra di dialogo Seleziona colonne da table_name selezionare la casella di controllo della colonna della tabella da aggiungere all'indice cluster.
Scegliere OK.
Nella finestra di dialogo Nuovo indice fare clic su OK.
Per creare un indice cluster tramite Progettazione tabelle
In Esplora oggetti espandere il database in cui si desidera creare una tabella con un indice cluster.
Fare clic con il pulsante destro del mouse sulla cartella Tabelle e scegliere Nuova tabella.
Creare una nuova tabella con il metodo tradizionale. Per ulteriori informazioni, vedere Creare tabelle (motore di database).
Fare clic con il pulsante destro del mouse sulla nuova tabella creata e scegliere Progetta.
Scegliere Indici/chiavi nel menu Progettazione tabelle.
Nella finestra di dialogo Indici/chiavi fare clic su Aggiungi.
Selezionare il nuovo indice dalla casella di testo Indice o chiave primari/univoci selezionati.
Nella griglia selezionare Crea come CLUSTERED, quindi selezionare Sì dall'elenco a discesa a destra della proprietà.
Scegliere Chiudi.
Scegliere Salva dal menu File table_name.
[Top]
Utilizzo di Transact-SQL
Per creare un indice cluster
In Esplora oggetti connettersi a un'istanza del Motore di database.
Sulla barra Standard fare clic su Nuova query.
Copiare e incollare l'esempio seguente nella finestra Query, quindi fare clic su Esegui.
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 ulteriori informazioni, vedere CREATE INDEX (Transact-SQL).
[Top]