Cosa significano realmente gli indici cluster e non cluster?


1119

Ho un'esposizione limitata a DB e ho usato DB solo come programmatore dell'applicazione. Voglio sapere di Clusterede Non clustered indexes. Ho cercato su Google e quello che ho trovato è stato:

Un indice cluster è un tipo speciale di indice che riordina il modo in cui i record nella tabella vengono archiviati fisicamente. Pertanto la tabella può avere un solo indice cluster. I nodi foglia di un indice cluster contengono le pagine di dati. Un indice non cluster è un tipo speciale di indice in cui l'ordine logico dell'indice non corrisponde all'ordine fisico archiviato delle righe sul disco. Il nodo foglia di un indice non cluster non è costituito dalle pagine di dati. Invece, i nodi foglia contengono righe di indice.

Quello che ho trovato in SO era Quali sono le differenze tra un indice cluster e un indice non cluster? .

Qualcuno può spiegarlo in un inglese semplice?

Risposte:


1118

Con un indice cluster le righe vengono archiviate fisicamente sul disco nello stesso ordine dell'indice. Pertanto, può esserci un solo indice cluster.

Con un indice non cluster c'è un secondo elenco con puntatori alle righe fisiche. Puoi avere molti indici non cluster, anche se ogni nuovo indice aumenterà il tempo necessario per scrivere nuovi record.

In genere è più veloce leggere da un indice cluster se si desidera ripristinare tutte le colonne. Non è necessario passare prima all'indice e quindi alla tabella.

La scrittura su una tabella con un indice cluster può essere più lenta, se è necessario riorganizzare i dati.


43
Dovresti chiarire cosa intendi con "fisicamente".
Spencer Ruport,

142
fisicamente come nei bit effettivi memorizzati sul disco
Peter

17
Fare riferimento a msdn "Quando si crea un vincolo PRIMARY KEY, viene automaticamente creato un indice cluster univoco sulla colonna o sulle colonne se un indice cluster sulla tabella non esiste già", il che significa che non è necessario che sia la stessa colonna.
Ming

46
@Pete che non è il caso. SQL Server certamente non garantisce che tutti i file di dati siano disposti in un'area fisica contigua del disco e che la frammentazione del file system sia zero. Non è nemmeno vero che un indice cluster sia in ordine all'interno del file di dati. Il grado in cui questo non è il caso è il grado di frammentazione logica.
Martin Smith,

42
Solo un breve commento per sostenere il punto di Martin Smith: gli indici cluster non garantiscono l'archiviazione sequenziale sul disco. Gestire esattamente dove sono posizionati i dati sul disco è il lavoro del sistema operativo, non del DBMS. Ma suggerisce che gli articoli vengono ordinati in genere in base alla chiave di clustering. Ciò significa che se il DB cresce di 10 GB, ad esempio, il sistema operativo può decidere di mettere quei 10 GB in blocchi da 5x2 GB su diverse parti del disco. Una tabella raggruppata che copre i 10 GB verrà archiviata in sequenza su ogni blocco da 2 GB, tuttavia i blocchi da 2 GB NON POSSONO essere sequenziali.
blobbles

601

Un indice cluster significa che stai dicendo al database di archiviare i valori vicini realmente vicini l'uno all'altro sul disco. Ciò ha il vantaggio di una rapida scansione / recupero di record che rientrano in un intervallo di valori di indice cluster.

Ad esempio, hai due tabelle, Cliente e Ordine:

Customer
----------
ID
Name
Address

Order
----------
ID
CustomerID
Price

Se si desidera recuperare rapidamente tutti gli ordini di un particolare cliente, è possibile creare un indice cluster nella colonna "CustomerID" della tabella degli ordini. In questo modo i record con lo stesso ID cliente verranno archiviati fisicamente uno accanto all'altro sul disco (raggruppato) per accelerarne il recupero.

PS L'indice su CustomerID ovviamente non sarà univoco, quindi è necessario aggiungere un secondo campo per "unificare" l'indice o lasciare che il database lo gestisca per te, ma questa è un'altra storia.

Per quanto riguarda più indici. È possibile disporre di un solo indice cluster per tabella poiché definisce la disposizione fisica dei dati. Se desideri un'analogia, immagina una grande stanza con molti tavoli. Puoi mettere queste tabelle per formare più righe o riunirle tutte insieme per formare un grande tavolo da conferenza, ma non in entrambi i modi allo stesso tempo. Una tabella può avere altri indici, quindi indicheranno le voci dell'indice cluster che a sua volta diranno dove trovare i dati effettivi.


4
Detto questo, CI dovrebbe essere sempre usato per PK
mko il

4
Quindi con un indice cluster sono i record nell'indice o nella tabella che sono archiviati vicini?
Caltor,

5
@Caltor Il tavolo. L'indice è ordinato per definizione. Ad esempio, un btree verrebbe ordinato in modo che si possa semplicemente fare l'aritmetica dell'indirizzo per la ricerca. L'idea del cluster è di soddisfare la tabella per le prestazioni di un determinato indice. Per essere chiari, i record della tabella verranno riordinati in modo che corrispondano all'ordine in cui si trova originariamente l'indice .
FLGMwt

9
@Caltor Niente affatto! In effetti, la documentazione e il nome stesso sono abbastanza fuorvianti. Avere un "indice cluster" ha davvero poco a che fare con l'indice. Concettualmente, quello che hai veramente è "una tabella raggruppata sull'indice x ".
FLGMwt,

3
@ JohnOrtizOrdoñez: Certo, è possibile utilizzare praticamente qualsiasi archiviato in fila, in modo che nessun XML, VARCHAR(MAX)o VARBINARY(MAX). Si noti che di solito ha senso raggruppare prima il campo data , poiché un indice cluster è più efficiente per le scansioni di intervalli, che sono più comuni sui tipi di data. YMMV.

317

Nella memoria orientata alle righe di SQL Server gli indici cluster e non cluster sono organizzati come alberi B.

inserisci qui la descrizione dell'immagine

( Fonte immagine )

La differenza chiave tra indici cluster e indici non cluster è che il livello foglia dell'indice cluster è la tabella. Ciò ha due implicazioni.

  1. Le righe nelle pagine foglia dell'indice cluster contengono sempre qualcosa per ciascuna delle colonne (non sparse) nella tabella (il valore o un puntatore al valore effettivo).
  2. L'indice cluster è la copia principale di una tabella.

Gli indici non cluster possono anche fare il punto 1 usando la INCLUDEclausola (Since SQL Server 2005) per includere esplicitamente tutte le colonne non chiave ma sono rappresentazioni secondarie e c'è sempre un'altra copia dei dati intorno (la tabella stessa).

CREATE TABLE T
(
A INT,
B INT,
C INT,
D INT
)

CREATE UNIQUE CLUSTERED INDEX ci ON T(A,B)
CREATE UNIQUE NONCLUSTERED INDEX nci ON T(A,B) INCLUDE (C,D)

I due indici sopra saranno quasi identici. Con le pagine dell'indice di livello superiore contenenti i valori per le colonne chiave A,Be le pagine di livello foglia contenentiA,B,C,D

Può esserci un solo indice cluster per tabella, poiché le righe di dati stesse possono essere ordinate in un solo ordine.

La citazione precedente dai libri online di SQL Server provoca molta confusione

Secondo me sarebbe molto meglio come.

Può esserci un solo indice cluster per tabella, poiché le righe a livello foglia dell'indice cluster sono le righe della tabella.

La citazione dei libri online non è errata, ma si dovrebbe essere chiari sul fatto che lo "smistamento" di indici sia non cluster che cluster sia logico non fisico. Se leggi le pagine a livello di foglia seguendo l'elenco collegato e leggi le righe sulla pagina in ordine di array di slot, allora leggerai le righe dell'indice in ordine ordinato ma fisicamente le pagine potrebbero non essere ordinate. La convinzione comunemente diffusa che con un indice cluster le righe siano sempre archiviate fisicamente sul disco nello stesso ordine della chiave di indice è falsa.

Questa sarebbe una realizzazione assurda. Ad esempio, se una riga viene inserita nel mezzo di una tabella da 4 GB, SQL Server non deve copiare 2 GB di dati nel file per fare spazio alla riga appena inserita.

Invece si verifica una divisione di pagina. Ogni pagina a livello foglia di indici sia cluster che non cluster ha l'indirizzo ( File:Page) della pagina successiva e precedente in ordine di chiave logica. Queste pagine non devono necessariamente essere contigue o in ordine di chiave.

ad esempio la catena di pagine collegate potrebbe essere 1:2000 <-> 1:157 <-> 1:7053

Quando si verifica una divisione di pagina, una nuova pagina viene allocata da qualsiasi parte del filegroup (da un'estensione mista, per tabelle piccole o un'estensione uniforme non vuota appartenente a quell'oggetto o un'estensione uniforme appena allocata). Questo potrebbe non essere nemmeno nello stesso file se il gruppo di file ne contiene più di uno.

Il grado in cui l'ordine logico e la contiguità differiscono dalla versione fisica idealizzata è il grado di frammentazione logica.

In un database appena creato con un singolo file ho eseguito il seguente.

CREATE TABLE T
  (
     X TINYINT NOT NULL,
     Y CHAR(3000) NULL
  );

CREATE CLUSTERED INDEX ix
  ON T(X);

GO

--Insert 100 rows with values 1 - 100 in random order
DECLARE @C1 AS CURSOR,
        @X  AS INT

SET @C1 = CURSOR FAST_FORWARD
FOR SELECT number
    FROM   master..spt_values
    WHERE  type = 'P'
           AND number BETWEEN 1 AND 100
    ORDER  BY CRYPT_GEN_RANDOM(4)

OPEN @C1;

FETCH NEXT FROM @C1 INTO @X;

WHILE @@FETCH_STATUS = 0
  BEGIN
      INSERT INTO T (X)
      VALUES        (@X);

      FETCH NEXT FROM @C1 INTO @X;
  END

Quindi controllato il layout della pagina con

SELECT page_id,
       X,
       geometry::Point(page_id, X, 0).STBuffer(1)
FROM   T
       CROSS APPLY sys.fn_PhysLocCracker( %% physloc %% )
ORDER  BY page_id

I risultati sono stati ovunque. La prima riga nell'ordine delle chiavi (con valore 1 - evidenziato con la freccia in basso) era quasi l'ultima pagina fisica.

inserisci qui la descrizione dell'immagine

La frammentazione può essere ridotta o rimossa ricostruendo o riorganizzando un indice per aumentare la correlazione tra ordine logico e ordine fisico.

Dopo aver corso

ALTER INDEX ix ON T REBUILD;

Ho ottenuto il seguente

inserisci qui la descrizione dell'immagine

Se la tabella non ha un indice cluster, viene chiamata heap.

Gli indici non cluster possono essere costruiti su un heap o un indice cluster. Contengono sempre un posizionatore di riga nella tabella di base. Nel caso di un heap, questo è un identificatore di riga fisica (rid) ed è costituito da tre componenti (File: Pagina: Slot). Nel caso di un indice cluster il localizzatore di righe è logico (la chiave dell'indice cluster).

Per quest'ultimo caso, se l'indice non cluster include già naturalmente le colonne chiave IC come colonne chiave NCI o INCLUDEcolonne -d, non viene aggiunto nulla. In caso contrario, le colonne mancanti della chiave CI vengono silenziosamente aggiunte all'NCI.

SQL Server garantisce sempre che le colonne chiave siano univoche per entrambi i tipi di indice. Il meccanismo in cui questo viene applicato per gli indici non dichiarati come unici differisce tuttavia tra i due tipi di indice.

Gli indici cluster vengono uniquifieraggiunti per tutte le righe con valori chiave che duplicano una riga esistente. Questo è solo un numero intero crescente.

Per gli indici non cluster non dichiarati come univoci SQL Server aggiunge silenziosamente il localizzatore di righe alla chiave dell'indice non cluster. Questo vale per tutte le righe, non solo per quelle che sono effettivamente duplicate.

La nomenclatura cluster vs non cluster viene utilizzata anche per gli indici dei negozi di colonne. Gli carta Miglioramenti a SQL Server colonna memorizza gli stati

Sebbene i dati dell'archivio di colonne non siano realmente "raggruppati" su nessuna chiave, abbiamo deciso di mantenere la tradizionale convenzione SQL Server di fare riferimento all'indice primario come indice cluster.


8
@brainstorm sì, ne sono consapevole. Probabilmente ciò è dovuto al fraseggio su questa pagina MSDN, ma per vedere che il fraseggio è in qualche modo fuorviante, devi solo guardare gli argomenti di frammentazione
Martin Smith,

12
@brainstorm: è sorprendente come alcune false dichiarazioni vengano ripetute come vangelo. Un cluster indica che, almeno dal punto di vista delle letture sequenziali, sarebbe "desiderabile" avere le righe archiviate fisicamente su disco nello stesso ordine dell'indice , ma è molto lontano dal dire che le farà effettivamente essere conservato in questo modo.
supercat

5
@MartinSmith Ho riprodotto e confermato i risultati del test su SQL Server 2014. Ottengo la 95%frammentazione dell'indice dopo l'inserimento iniziale. Dopo index rebuildla frammentazione è stato 0%e i valori sono stati ordinati. Mi chiedo, possiamo dirlo The only time the data rows in a table are stored in sorted order is when its clustered index fragmentation is 0?
gotqn

8
@MartinSmith Ora, signore, questa è una risposta. Mi piacerebbe vederlo in cima all'elenco delle risposte, ma come dice SO, "veloce e semplice" ottiene il voto.
Vaitrafra,

5
@Manachi questa risposta è stata data 5 anni dopo la domanda iniziale. Lo scopo è correggere alcuni aspetti fuorvianti di tali risposte. I capricci (ora di 8 anni) del PO non sono una mia preoccupazione. Altri lettori possono apprezzare una vista di livello inferiore.
Martin Smith,

150

Mi rendo conto che questa è una domanda molto antica, ma ho pensato che avrei offerto un'analogia per aiutare a illustrare le belle risposte sopra.

INDICE CLUSTERATO

Se entri in una biblioteca pubblica, scoprirai che i libri sono tutti disposti in un ordine particolare (molto probabilmente il Dewey Decimal System o DDS). Ciò corrisponde all ' "indice raggruppato" dei libri. Se il numero DDS per il libro che desideri fosse 005.7565 F736s, inizieresti individuando la fila di scaffali che è etichettata 001-099o qualcosa del genere. (Questo segno endcap alla fine dello stack corrisponde a un "nodo intermedio" nell'indice.) Alla fine, verrai eseguito il drill down sullo scaffale specifico etichettato 005.7450 - 005.7600, quindi eseguiresti la scansione fino a quando non avessi trovato il libro con il numero DDS specificato, e in quel punto hai trovato il tuo libro.

INDICE NON CLUSTERATO

Ma se non sei entrato in biblioteca con il numero DDS del tuo libro memorizzato, allora avresti bisogno di un secondo indice per aiutarti. In passato si trovava nella parte anteriore della biblioteca un meraviglioso ufficio di cassetti noto come "Catalogo di schede". In esso c'erano migliaia di carte 3x5 - una per ogni libro, ordinate in ordine alfabetico (per titolo, forse). Ciò corrisponde all ' "indice non cluster" . Questi cataloghi di carte erano organizzati in una struttura gerarchica, in modo tale che ciascun cassetto fosse etichettato con la gamma di carte che conteneva ( Ka - Klad esempio, il "nodo intermedio"). Ancora una volta, dovresti approfondire fino a quando non hai trovato il tuo libro, ma in questo caso, una volta trovato (cioè il "nodo foglia"), non hai il libro stesso,numero indice (il numero DDS) con il quale è possibile trovare il libro effettivo nell'indice cluster.

Naturalmente, nulla impedirebbe al bibliotecario di fotocopiare tutte le carte e ordinarle in un ordine diverso in un catalogo di carte separato. (In genere c'erano almeno due di questi cataloghi: uno ordinato per nome dell'autore e uno per titolo.) In linea di principio, si potrebbe avere quanti di questi indici "non raggruppati" si desideri.


2
Potrei forse estendere questa analogia per descrivere le colonne "Incluse" , che possono essere utilizzate con gli indici non cluster: si potrebbe immaginare una carta nel catalogo delle carte che includa più di un solo libro, ma invece un elenco di tutti gli articoli pubblicati versioni del libro, organizzate numericamente per data di pubblicazione. Proprio come in una "colonna inclusa", queste informazioni sono memorizzate solo a livello foglia (riducendo così il numero di carte che il bibliotecario deve creare).
kmote,

1
grande analogia - aiuta davvero a visualizzarla!
Denis

71

Di seguito sono riportate alcune caratteristiche degli indici cluster e non cluster:

Indici raggruppati

  1. Gli indici cluster sono indici che identificano in modo univoco le righe in una tabella SQL.
  2. Ogni tabella può avere esattamente un indice cluster.
  3. È possibile creare un indice cluster che copre più di una colonna. Ad esempio: create Index index_name(col1, col2, col.....).
  4. Per impostazione predefinita, una colonna con una chiave primaria ha già un indice cluster.

Indici non cluster

  1. Gli indici non cluster sono come indici semplici. Sono utilizzati solo per il recupero rapido dei dati. Non sono sicuro di avere dati univoci.

34
Una leggera correzione al punto 1. Un indice cluster non non necessariamente identificare univocamente le righe in una tabella SQL. Questa è la funzione di un PRIMARY KEY
Nigel,

4
@Nigel, una CHIAVE PRIMARIA o un INDICE UNICO?
anar khalilov,

risposta pratica e diretta, grazie @Anirudh Sood
Oscar Romero

50

Una regola empirica molto semplice e non tecnica sarebbe che gli indici cluster siano generalmente utilizzati per la chiave primaria (o, almeno, una colonna univoca) e che i cluster non utilizzati vengano utilizzati per altre situazioni (forse una chiave esterna) . In effetti, per impostazione predefinita SQL Server creerà un indice cluster nelle colonne della chiave primaria. Come avrai appreso, l'indice cluster si riferisce al modo in cui i dati sono fisicamente ordinati su disco, il che significa che è una buona scelta a tutto tondo per la maggior parte delle situazioni.


47

Indice cluster

Un indice cluster determina l'ordine fisico dei DATI in una tabella. Per questo motivo una tabella ha solo 1 indice cluster.

  • " dizionario " Non c'è bisogno di nessun altro indice, è già indice secondo le parole

Indice non cluster

Un indice non cluster è analogo a un indice in un Libro. I dati sono memorizzati in un unico posto. L'indice viene archiviato in un altro posto e l'indice ha puntatori alla posizione di archiviazione dei dati. Per questo motivo una tabella ha più di 1 indice non cluster.

  • " Libro di chimica " a fissare c'è un indice separato per indicare la posizione del capitolo e alla "FINE" c'è un altro indice che indica la posizione delle PAROLE comuni

6

Indice cluster

Gli indici cluster ordinano e memorizzano le righe di dati nella tabella o nella vista in base ai loro valori chiave. Queste sono le colonne incluse nella definizione dell'indice. Può esserci un solo indice cluster per tabella, poiché le righe di dati stesse possono essere ordinate in un solo ordine.

L'unica volta in cui le righe di dati in una tabella vengono archiviate in ordine ordinato è quando la tabella contiene un indice cluster. Quando una tabella ha un indice cluster, la tabella viene chiamata tabella cluster. Se una tabella non ha un indice cluster, le sue righe di dati vengono archiviate in una struttura non ordinata chiamata heap.

non cluster

Gli indici non cluster hanno una struttura separata dalle righe di dati. Un indice non cluster contiene i valori chiave dell'indice non cluster e ogni voce del valore chiave ha un puntatore alla riga di dati che contiene il valore chiave. Il puntatore da una riga di indice in un indice non cluster a una riga di dati è chiamato localizzatore di righe. La struttura del localizzatore di righe dipende dal fatto che le pagine di dati siano memorizzate in un heap o in una tabella di cluster. Per un heap, un localizzatore di riga è un puntatore alla riga. Per una tabella cluster, il localizzatore di righe è la chiave di indice cluster.

È possibile aggiungere colonne non chiave al livello foglia dell'indice non cluster per ignorare i limiti delle chiavi di indice esistenti ed eseguire query completamente coperte, indicizzate. Per ulteriori informazioni, consultare Creare indici con colonne incluse. Per i dettagli sui limiti delle chiavi di indice, vedere Specifiche della capacità massima per SQL Server.

Riferimento: https://docs.microsoft.com/en-us/sql/relational-d database / indexes / clustered - and - nonclustered - indexes - described


4

Consentitemi di offrire una definizione del libro di testo su "indice di clustering", tratta dalla 15.6.1 di Database Systems: The Complete Book :

Possiamo anche parlare di indici di clustering , che sono indici su un attributo o attributi tali che tutte le tuple con un valore fisso per la chiave di ricerca di questo indice compaiono all'incirca sul numero di blocchi che possono contenere.

Per capire la definizione, diamo un'occhiata all'esempio 15.10 fornito dal libro di testo:

Una relazione R(a,b)che viene ordinata per attributo ae memorizzata in quell'ordine, impacchettata in blocchi, è sicuramente clusterd. Un indice attivo aè un indice di raggruppamento, poiché per un dato avalore a1, tutte le tuple con quel valore per asono consecutive. Sembrano quindi impacchettati in blocchi, eventualmente eseguiti per il primo e l'ultimo blocco che contengono a-valore a1, come suggerito in Fig.15.14. Tuttavia, è improbabile che un indice su b sia raggruppato, poiché le tuple con un valore fisso bsaranno sparse in tutto il file a meno che i valori di ae bsiano strettamente correlati.

Fig 15.14

Si noti che la definizione non impone che i blocchi di dati debbano essere contigui sul disco; dice solo che le tuple con la chiave di ricerca sono raggruppate nel minor numero possibile di blocchi di dati.

Un concetto correlato è una relazione raggruppata . Una relazione viene "raggruppata" se le sue tuple sono raggruppate in meno blocchi possibili che possono contenere quelle tuple. In altre parole, dal punto di vista del blocco del disco, se contiene tuple provenienti da relazioni diverse, tali relazioni non possono essere raggruppate (ovvero, esiste un modo più impacchettato per memorizzare tale relazione scambiando le tuple di quella relazione da altri blocchi del disco con il tuple non appartiene alla relazione nel blocco del disco corrente). Chiaramente, R(a,b)nell'esempio sopra è raggruppato.

Per connettere due concetti insieme, una relazione in cluster può avere un indice di clustering e un indice non cluster. Tuttavia, per una relazione non cluster, l'indice di clustering non è possibile a meno che l'indice non sia basato sulla chiave primaria della relazione.

"Cluster" come una parola viene spammato su tutti i livelli di astrazione del lato di archiviazione del database (tre livelli di astrazione: tuple, blocchi, file). Un concetto chiamato " file cluster ", che descrive se un file (un'astrazione per un gruppo di blocchi (uno o più blocchi del disco)) contiene tuple da una relazione o relazioni diverse. Non si riferisce al concetto dell'indice di clustering poiché si trova a livello di file.

Tuttavia, ad alcuni materiali didattici piace definire l'indice di clustering in base alla definizione del file cluster. Questi due tipi di definizioni sono uguali a livello di relazione cluster, indipendentemente dal fatto che definiscano una relazione cluster in termini di blocco o file di dati. Dal link in questo paragrafo,

Un indice sugli attributi A in un file è un indice di clustering quando: Tutte le tuple con valore di attributo A = a sono archiviate in sequenza (= consecutivamente) nel file di dati

Memorizzare consecutivamente le tuple equivale a dire "le tuple sono impacchettate in circa pochi blocchi che possono contenere quelle tuple" (con una differenza minore su uno che parla di file, l'altro che parla di disco). È perché la memorizzazione consecutiva della tupla è il modo per ottenere "impacchettati in meno blocchi che possono contenere quelle tuple".


3

Indice cluster: il vincolo Chiave primaria crea automaticamente un indice cluster se non esiste già un indice cluster sulla tabella. I dati effettivi dell'indice cluster possono essere memorizzati a livello foglia dell'indice.

Indice non cluster: i dati effettivi dell'indice non cluster non si trovano direttamente sul nodo foglia, ma deve fare un ulteriore passo per trovare perché ha solo valori di localizzatori di riga che puntano verso dati reali. L'indice non cluster non può essere ordinato come indice cluster. Possono esserci più indici non cluster per tabella, in realtà dipende dalla versione del server sql che stiamo usando. Fondamentalmente SQL Server 2005 consente 249 indici non cluster e per versioni precedenti come 2008, 2016 consente 999 indici non cluster per tabella.


2

Indice cluster : un indice cluster definisce l'ordine in cui i dati vengono archiviati fisicamente in una tabella. I dati della tabella possono essere ordinati in un solo modo, pertanto può esserci un solo indice cluster per tabella. In SQL Server, il vincolo della chiave primaria crea automaticamente un indice cluster su quella particolare colonna.

Indice non cluster- Un indice non cluster non ordina i dati fisici all'interno della tabella. In effetti, un indice non cluster viene archiviato in una posizione e i dati della tabella vengono archiviati in un'altra posizione. Questo è simile a un libro di testo in cui il contenuto del libro si trova in una posizione e l'indice si trova in un'altra. Ciò consente più di un indice non cluster per tabella. È importante menzionare qui che all'interno della tabella i dati verranno ordinati in base a un indice cluster. Tuttavia, all'interno dell'indice non cluster i dati vengono archiviati nell'ordine specificato. L'indice contiene i valori di colonna su cui viene creato l'indice e l'indirizzo del record a cui appartiene il valore di colonna. Quando viene generata una query su una colonna su cui viene creato l'indice, il database passerà prima all'indice e cercherà l'indirizzo della riga corrispondente nella tabella. Andrà quindi a quell'indirizzo di riga e recupererà altri valori di colonna. È a causa di questo passaggio aggiuntivo che gli indici non cluster sono più lenti degli indici cluster

Differenze tra indice cluster e non cluster

  1. Può esserci un solo indice cluster per tabella. Tuttavia, è possibile creare più indici non cluster su una singola tabella.
  2. Gli indici cluster solo ordinano le tabelle. Pertanto, non consumano spazio di archiviazione aggiuntivo. Gli indici non cluster vengono archiviati in un luogo separato dalla tabella effettiva, richiedendo più spazio di archiviazione.
  3. Gli indici cluster sono più veloci degli indici non cluster poiché non comportano alcun passaggio di ricerca aggiuntivo.

Per ulteriori informazioni, consultare questo articolo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.