Creare un indice cluster
Si applica a: SQL Server database SQL di Azure Istanza gestita di SQL di Azure database SQL in Microsoft Fabric
È possibile creare gli indici cluster sulle tabelle usando 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 descritti nell'articolo Descrizione di indici cluster e non cluster.
Modalità di implementazione tipiche
Gli indici cluster vengono implementati nei modi seguenti:
Vincoli PRIMARY KEY e UNIQUE
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. La colonna chiave primaria non può consentire i valoriNULL
.Quando si crea un vincolo
UNIQUE
, viene creato un indice non cluster univoco per applicare un vincoloUNIQUE
per impostazione predefinita. È possibile specificare un indice cluster univoco se nella tabella non ne esiste già uno.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.
Limiti
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 altre informazioni, vedere 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). 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, questo processo 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 altre informazioni, vedere 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
. Se viene creato un indice cluster in una colonna varchar e i dati esistenti si trovano nell'unità di allocazioneIN_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. 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).
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 .
Usare SQL Server Management Studio
Creare un indice cluster da 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 danome_tabella selezionare la casella di controllo della colonna della tabella da aggiungere all'indice cluster.
Seleziona OK.
Nella finestra di dialogo Nuovo indice fare clic su OK.
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 altre informazioni, vedere Creare tabelle (motore di database).
Fare clic con il pulsante destro del mouse sulla nuova tabella creata in precedenza e scegliere Progettazione.
Selezionare Indici/chiavi nel menu Progettazione tabelle.
Nella finestra di dialogo Indici/chiavi selezionare Aggiungi.
Selezionare il nuovo indice dalla casella di testo Chiave o indice primario/univoco selezionato .
Nella griglia selezionare Crea come CLUSTERED, quindi selezionare Sì dall'elenco a discesa a destra della proprietà.
Selezionare Chiudi.
Nel menu File scegliere Salva nome_tabella.
Usare Transact-SQL
In Esplora oggetti connettersi a un'istanza del motore di database.
Sulla barra Standard selezionare Nuova query.
Copiare e incollare l'esempio seguente nella finestra di query e selezionare Esegui.
USE AdventureWorks2022; 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).