Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Heap di SQL Server vs. indice raggruppato

L'archiviazione heap non ha nulla a che fare con questi heap .

Heap significa semplicemente che i record stessi non sono ordinati (cioè non collegati tra loro).

Quando inserisci un record, questo viene semplicemente inserito nello spazio libero trovato dal database.

L'aggiornamento di una riga in una tabella basata su heap non influisce sugli altri record (sebbene influisca sugli indici secondari)

Se crei un indice secondario su un HEAP tabella, il RID (una specie di puntatore fisico allo spazio di archiviazione) viene utilizzato come puntatore di riga.

Indice cluster significa che i record fanno parte di un B-Tree . Quando inserisci un record, il B-Tree deve essere ricollegato.

L'aggiornamento di una riga in una tabella raggruppata provoca il ricollegamento del B-Tree, i. e. aggiornamento dei puntatori interni in altri record.

Se crei un indice secondario su una tabella cluster, il valore della chiave dell'indice cluster viene utilizzato come puntatore di riga.

Ciò significa che un indice cluster deve essere univoco. Se un indice cluster non è univoco, una colonna nascosta speciale chiamata uniquifier viene aggiunto alla chiave di indice che rende unico (e di dimensioni maggiori).

Vale anche la pena notare che la creazione di un indice secondario su una colonna fa sì che i valori o la chiave dell'indice cluster facciano parte della chiave dell'indice secondario.

Creando un indice su una tabella cluster, ottieni infatti sempre un indice composto

CREATE UNIQUE CLUSTERED INDEX CX_mytable_1234 (col1, col2, col3, col4)

CREATE INDEX IX_mytable_5678 (col5, col6, col7, col8)

Indice IX_mytable_5678 è infatti un indice sulle seguenti colonne:

col5
col6
col7
col8
col1
col2
col3
col4

Questo ha un altro effetto collaterale:

Un DESC condizione in un indice a colonna singola su una tabella cluster ha senso in SQL Server

Questo indice:

CREATE INDEX IX_mytable ON mytable (col1)

può essere utilizzato in una query come questa:

SELECT  TOP 100 *
FROM    mytable
ORDER BY
       col1, id

, mentre questo:

CREATE INDEX IX_mytable ON mytable (col1 DESC)

può essere utilizzato in una query come questa:

SELECT  TOP 100 *
FROM    mytable
ORDER BY
       col1, id DESC