risposta-alla-domanda-sullo-sviluppo-web-bd.com

Cosa significa in realtà l'indice Clustered e Non clustered?

Ho un'esposizione limitata al DB e ho usato solo DB come programmatore di applicazioni. Voglio sapere Clustered e 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 i record nella tabella sono fisicamente immagazzinato. Pertanto la tabella può avere solo un indice in cluster. I nodi foglia di un indice cluster contengono i dati pagine. Un indice non cluster è un tipo speciale di indice in cui il l'ordine logico dell'indice non è corrisponde all'ordine fisico memorizzato di le righe sul disco. Il nodo foglia di un l'indice non cluster non comprende le pagine di dati. Invece, la foglia i nodi 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 inglese semplice?

897
P.K

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

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

È generalmente più veloce leggere da un indice cluster se si desidera recuperare tutte le colonne. Non devi andare prima all'indice e poi al tavolo.

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

902
Shiraz Bhaiji

Un indice cluster indica che stai dicendo al database di memorizzare valori vicini in realtà vicini l'uno all'altro sul disco. Ciò ha il vantaggio di una scansione/recupero rapida di record che rientrano in alcuni range di valori di indice cluster.

Ad esempio, hai due tabelle, Cliente e Ordine:

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

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

Se desideri recuperare rapidamente tutti gli ordini di un particolare cliente, potresti voler creare un indice cluster sulla colonna "CustomerID" della tabella Ordini. In questo modo i record con lo stesso CustomerID verranno fisicamente memorizzati l'uno vicino all'altro su disco (in cluster) che ne velocizza il recupero.

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

Riguardo a più indici. È possibile avere un solo indice cluster per tabella poiché ciò definisce il modo in cui i dati sono disposti fisicamente. Se desideri un'analogia, immagina una grande stanza con molti tavoli. Puoi mettere queste tabelle per formare più righe o trascinarle tutte insieme per formare un grande tavolo da conferenza, ma non in entrambi i modi contemporaneamente. Una tabella può avere altri indici, quindi indirizzerà le voci nell'indice cluster che a sua volta dirà infine dove trovare i dati effettivi.

553
user151323

Mi rendo conto che questa è una domanda molto vecchia, ma ho pensato di offrire un'analogia per illustrare le risposte di cui sopra.

INDICE CLUSTERED

Se entri in una biblioteca pubblica, scoprirai che i libri sono tutti organizzati in un ordine particolare (molto probabilmente il Dewey Decimal System, o DDS). Questo corrisponde al "indice cluster" dei libri. Se il numero DDS del libro che vuoi è 005.7565 F736s, inizieresti a localizzare la fila di scaffali etichettati come 001-099 o qualcosa del genere. (Questo segno di estremità alla fine della pila corrisponde a un "nodo intermedio" nell'indice.) Eventualmente si scaverebbe verso il basso sullo specifico scaffale con etichetta 005.7450 - 005.7600, quindi si scansionerebbe finché non si trovasse il libro con il DDS specificato, e a quel punto hai trovato il tuo libro.

INDICE NON CLUSTERED

Ma se non sei entrato nella biblioteca con il numero DDS del tuo libro memorizzato, allora ti servirà un secondo indice per aiutarti. Nei tempi antichi si trovava di fronte alla biblioteca un meraviglioso ufficio di cassetti noto come il "catalogo di carte". In esso c'erano migliaia di carte 3x5 - una per ogni libro, ordinate in ordine alfabetico (per titolo, forse). Questo corrisponde al "indice non cluster" . Questi cataloghi di carte erano organizzati in una struttura gerarchica, in modo che ogni cassetto fosse etichettato con l'intervallo di carte che conteneva (Ka - Kl, per esempio, cioè il "nodo intermedio"). Ancora una volta, eseguiresti un drill-in finché non avrai trovato il tuo libro, ma in this case, una volta trovato (cioè il "nodo foglia"), non hai il libro stesso, ma solo una carta con un indice numero (il 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 cataloghi di questo tipo: uno ordinato per nome dell'autore e uno per titolo.) In linea di principio, potresti avere tanti di questi indici "non in cluster" come desideri. 

103
kmote

Trova di seguito 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 in cluster

  1. Gli indici non in cluster sono come indici semplici. Sono solo utilizzati per il recupero rapido dei dati. Non sono sicuro di avere dati unici.
66
Anirudh Sood

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

45
Dan Diplo

Indice di gruppo

Un indice cluster determina l'ordine fisico di DATA in una tabella. Per questa ragione una tabella ha solo 1 indice cluster.

come "dizionario" Non c'è bisogno di nessun altro Indice, è già indicizzato secondo le parole 

Indice non cluster

Un indice non cluster è analogo a un indice in un libro. I dati sono archiviati in un unico punto. l'indice è archiviato in un altro posto e l'indice ha i puntatori al percorso di archiviazione dei dati. Per questo motivo una tabella ha più di 1 indice Non cluster.

come "Libro della chimica" al momento di fissare c'è un indice separato per indicare la posizione del capitolo e alla "FINE" c'è un altro indice che indica la posizione della parola comune 

13
abdul rehman kk

Indice cluster

Gli indici raggruppati ordinano e memorizzano le righe di dati nella tabella o 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 sono 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 indice cluster, le sue righe di dati sono memorizzate 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 della chiave di indice non cluster e ogni voce di valore chiave ha un puntatore alla riga di dati che contiene il valore della chiave . Il puntatore da una riga di indice in un indice non cluster a una riga di dati è denominato localizzatore di riga. La struttura del localizzatore di riga dipende dal fatto che le pagine di dati siano archiviate in un heap o in una tabella in cluster. Per un heap, un localizzatore di riga è un puntatore alla riga. Per una tabella in cluster, il localizzatore di riga è la chiave di indice cluster.

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

Riferimento: https://docs.Microsoft.com/en-us/sql/relational-databases/indexes/clustered-and-nonclustered-indexes-described

3
marvelTracker

Indice cluster: Il vincolo della chiave primaria crea automaticamente l'indice cluster se nessun indice cluster esiste già sulla tabella. I dati effettivi dell'indice cluster possono essere memorizzati a livello foglia dell'indice. 

Indice non raggruppato: I dati effettivi dell'indice non cluster non si trovano direttamente nel nodo foglia, ma deve compiere un ulteriore passaggio per trovare perché ha solo valori di localizzatori di riga che puntano ai dati effettivi .Non l'indice cluster non può essere ordinato come indice cluster. Possono esserci più indici non cluster per tabella, in realtà dipende dalla versione di SQL Server che stiamo utilizzando. Fondamentalmente, il server Sql 2005 consente 249 indici non clusterizzati e per le versioni precedenti come 2008, 2016, consente 999 indici non clusterizzati per tabella.

0
Abhishek Duppati

Consentitemi di offrire una definizione da manuale su "indice di clustering", che è presa da 15.6.1 da Database Systems: The Complete Book :

Potremmo anche parlare di clustering indexes, 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 approssimativamente su pochi blocchi che possono tenerle.

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

Una relazione R(a,b) che è ordinata sull'attributo a e memorizzata in quello l'ordine, imballato in blocchi, è sicuramente clusterd. Un indice su a è a indice di clustering, poiché per un dato valore a- a1, tutte le tuple con quel valore per a è consecutivo. Appaiono quindi imballati in blocchi, execept possibilmente per il primo e l'ultimo blocco che contengono a- valore a1, come suggerito in Fig.15.14. Tuttavia, un indice su b è improbabile che si tratti di clustering, poiché le tuple con un valore fisso b- sarà distribuito su tutto il file a meno che i valori di a e b siano strettamente correlato.

 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 è relazione cluster. Una relazione è "raggruppata" se le sue tuple sono impacchettate in pochi blocchi quante possono contenere quelle tuple. In altre parole, dal punto di vista del blocco del disco, se contiene tuple di relazioni diverse, allora tali relazioni non possono essere raggruppate (cioè c'è un modo più compatto per memorizzare tale relazione scambiando le tuple di quella relazione da altri blocchi del disco con il tupla che non appartiene alla relazione nel blocco attuale del disco). Chiaramente, R(a,b) nell'esempio sopra è in cluster. 

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

"Cluster" come Word è spammato su tutti i livelli di astrazione del lato di archiviazione del database (tre livelli di astrazione: tuple, blocchi, file). Un concetto chiamato " clustered file ", 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 di indice di clustering poiché è a livello di file.

Tuttavia, alcuni materiale didattico mi piace definire l'indice di clustering in base alla definizione del file cluster. Questi due tipi di definizioni sono gli stessi a livello di relazione cluster, indipendentemente dal fatto che definiscano la relazione cluster in termini di blocco o file del disco di dati. Dal link in questo paragrafo, 

Un indice su attributo (i) A su un file è un indice di raggruppamento quando: Tutte le tuple con valore di attributo A = a sono archiviate sequenzialmente (= consecutivamente) nel file di dati

Memorizzare le tuple consecutivamente equivale a dire "le tuple sono impacchettate all'incirca come pochi blocchi che possono contenere quelle tuple" (con una differenza minore su una che parla di file, l'altra che parla di disco). È perché archiviare Tuple in modo consecutivo è il modo per ottenere "impacchettato in meno blocchi che possono contenere quelle tuple".

0
xxks-kkk