2015-10-06 14 views
8

Poiché PostgreSQL non supporta gli indici cluster, sto considerando il server MSSQL. Ho letto il article confrontando gli indici cluster e non in cluster. Il senso di questo articolo è che (sottolineare il mio):Capire indice cluster

indici non cluster negozio sia un valore e un puntatore alla fila effettivo che sostiene che il valore.

E

indici cluster non hanno bisogno di memorizzare un puntatore alla riga effettiva causa del fatto che le righe della tabella vengono memorizzati sul disco stesso ordine esatto come l'indice cluster

come mi è stato detto there e there è stato molto difficile per sostenere il fisico ordine dei dati della tabella, in particolare se la tabella è divisa tra più unità. E ora, incontro il concetto di indice in cluster assumendo che i dati siano memorizzati fisicamente in qualche ordine. Questo è quello di cui ero confuso.

Domanda: Qual è la struttura dell'indice cluster? Supporta la struttura simile a tree da attraversare, ad esempio PosgtreSQL per gli indici btree?

+3

Così si vuole migrare da PostgreSQL a MS SQL Server solo per ottenere gli indici cluster?!? – jarlh

+0

@jarlh Non esattamente, sto solo cercando di capire questo concetto con l'esempio di 'MSSQL'. In particolare, se un indice cluster misura solo ordinando fisicamente i dati (in qualche modo), sarà chiaro. Ma come posso legarmi con la struttura e l'ordine fisico. Non riesco a immaginare come è stato implementato .... –

+0

Che bit ti sta facendo saltare? L'idea che i dati possano essere ordinati o che i dati della riga possano far parte dell'indice? –

risposta

4

In SQL Server, gli indici sono organizzati come alberi B. Ogni pagina in un albero B dell'indice è chiamata nodo dell'indice. Il nodo superiore dell'albero B è chiamato il nodo radice. Il livello inferiore dei nodi nell'indice è chiamato i nodi foglia. Qualsiasi livello di indice tra la radice e i nodi foglia sono noti collettivamente come livelli intermedi. In un indice cluster, i nodi foglia contengono le pagine di dati della tabella sottostante. I nodi root e di livello intermedio contengono pagine indice contenenti righe indice. Ogni riga di indice contiene un valore chiave e un puntatore a una pagina di livello intermedio nell'albero B o a una riga di dati nel livello foglia dell'indice. Le pagine di ciascun livello dell'indice sono collegate in una lista doppiamente collegata.

Gli indici cluster hanno una riga in sys.partitions, con index_id = 1 per ogni partizione utilizzata dall'indice. Per impostazione predefinita, un indice cluster ha una singola partizione. Quando un indice cluster ha più partizioni, ogni partizione ha una struttura B-tree che contiene i dati per quella specifica partizione. Ad esempio, se un indice cluster ha quattro partizioni, ci sono quattro strutture B-tree; uno in ogni partizione.

per rif.

https://technet.microsoft.com/en-us/library/ms177443(v=sql.105).aspx http://www.sqlservercentral.com/blogs/practicalsqldba/2013/03/14/sql-server-part-4-explaining-the-non-clustered-index-structure-/

+0

Quindi, in aggiunta alla tabella fisicamente ordinata, abbiamo l'indice- Righe (Root e livello intermedio) l'attuall che attraversa la fila fisica viene eseguita, giusto? –

+0

Quindi stai dicendo che un indice cluster con una sola partizione NON ha un B-Tree? – Brain2000

1

In indice cluster esistono tre livelli

livello 1.Root

livello 2.Intermediate

livello 3.Leaf

L'indice cluster contiene le righe di dati a livello foglia. se stai cercando un valore nella colonna indicizzata, il motore di query dovrebbe prima cercare il valore a livello di root se il valore è disponibile a livello di root, quindi il motore di query non passerà al livello intermedio o al livello foglia. se il valore non è stabilito a livello di radice, cercherà il valore a livello intermedio o a livello foglia. se la quantità di righe di dati è troppo piccola, non vi è alcun livello intermedio disponibile nell'indice cluster.

schema qui sotto può aiutare a capire la base di indice cluster:

clustered index

Problemi correlati