Qual è la differenza tra indici cluster e non cluster in Microsoft SQL Server?

Qual è la differenza tra indici cluster e non cluster in Microsoft SQL Server?

Un indice consente a SQL Server di recuperare rapidamente i dati dalle righe. Gli indici funzionano come il sommario all’inizio dei libri, permettendoti di cercare rapidamente la pagina in cui si trova un argomento. Senza indici, SQL Server deve eseguire la scansione di tutte le righe in una tabella per trovare un record.

Esistono due tipi di indici in SQL Server: cluster e non cluster. Scopri la differenza tra indici cluster e non cluster e perché sono importanti.

Indice cluster in SQL Server

In un indice cluster, le righe di dati vengono archiviate fisicamente in modo ordinato in base al valore della chiave. Poiché l’indice include la tabella e può disporre le righe solo in un ordine, è possibile creare un solo indice cluster per tabella.

Mentre gli indici rendono più veloce il recupero delle righe in un intervallo, le istruzioni INSERT e UPDATE possono essere lente perché Query Optimizer esegue la scansione dell’indice nell’ordine finché non trova l’indice di destinazione.

Indice non cluster in SQL Server

Un indice non cluster contiene i valori chiave la cui voce è un puntatore chiamato localizzatore di riga. Per le tabelle cluster (tabelle con un indice cluster), il puntatore punta a una chiave nell’indice cluster che a sua volta punta alla riga nella tabella. Per le righe senza un indice cluster, il puntatore punta direttamente alla riga della tabella.

Come creare un indice cluster in SQL Server

Quando crei una tabella con una chiave primaria, SQL Server crea automaticamente una chiave di indice cluster basata su tale chiave primaria. Se non si dispone di una chiave primaria, è possibile eseguire la seguente istruzione per creare una chiave di indice cluster.

CREATE CLUSTERED INDEX <index name>
ON TABLE <table_name>(column_name)

In questa istruzione si specifica il nome dell’indice, il nome della tabella in cui crearlo e il nome della colonna da utilizzare nell’indice.

Se aggiungi una chiave primaria a una tabella che ha già un indice cluster, SQL Server creerà un indice non cluster con essa.

Per creare un indice cluster che non includa la colonna della chiave primaria, devi prima eliminare il vincolo della chiave primaria.

USE database_name
ALTER TABLE table_name
DROP CONSTRAINT pk_name
GO

La rimozione dei vincoli di chiave primaria rimuove anche l’indice cluster consentendo di crearne uno personalizzato.

Come creare un indice non cluster in SQL Server

Per creare un indice non cluster, utilizzare la seguente istruzione.

CREATE INDEX <index name>
ON TABLE <table_name>(column_name)

Puoi anche utilizzare la parola chiave NONCLUSTERED in questo modo:

CREATE [NONCLUSTERED] INDEX <index name>
ON TABLE <table_name>(column_name)

Questa istruzione crea un indice non cluster nella tabella specificata e include la colonna indicata.

Se lo desideri, puoi ordinare le colonne in ordine crescente (ASC) o decrescente (DESC).

CREATE [NONCLUSTERED] INDEX <index name>
ON TABLE <table_name>(column_name ASC/DESC)

Quale indice dovresti scegliere?

Sia gli indici cluster che quelli non cluster migliorano i tempi di query. Se la maggior parte delle query sono operazioni SELECT su più colonne della tabella, gli indici cluster sono più veloci. Tuttavia, per le operazioni INSERT o UPDATE, gli indici non cluster sono più veloci poiché Query Optimizer può individuare la colonna direttamente dall’indice.

Come puoi vedere, questi indici funzionano meglio per diverse query SQL. La maggior parte dei database SQL trarrà quindi vantaggio dall’avere almeno un indice cluster e indici non cluster per le colonne che vengono aggiornate regolarmente.

L’importanza degli indici in SQL Server

Gli indici cluster e non cluster portano a prestazioni di query più elevate. Quando si esegue una query, Query Optimizer esegue la scansione dell’indice per la posizione di archiviazione di una riga, quindi recupera le informazioni da tale posizione. Questo è molto più veloce della scansione di tutte le righe della tabella.

È inoltre possibile utilizzare indici non in cluster per risolvere i deadlock di ricerca dei segnalibri creando un indice non in cluster per le colonne a cui le query interessate accedono.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *