Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Tas de SQL Server vs. index clusterisé

Le stockage en tas n'a rien à voir avec ces tas .

Le tas signifie simplement que les enregistrements eux-mêmes ne sont pas ordonnés (c'est-à-dire qu'ils ne sont pas liés les uns aux autres).

Lorsque vous insérez un enregistrement, il est simplement inséré dans l'espace libre trouvé par la base de données.

La mise à jour d'une ligne dans une table basée sur le tas n'affecte pas les autres enregistrements (bien que cela affecte les index secondaires)

Si vous créez un index secondaire sur un HEAP table, le RID (une sorte de pointeur physique vers l'espace de stockage) est utilisé comme pointeur de ligne.

L'index clusterisé signifie que les enregistrements font partie d'un B-Tree . Lorsque vous insérez un enregistrement, le B-Tree doit être reconnecté.

La mise à jour d'une ligne dans une table en cluster provoque la reconnexion du B-Tree, c'est-à-dire. e. mise à jour des pointeurs internes dans d'autres enregistrements.

Si vous créez un index secondaire sur une table clusterisée, la valeur de la clé d'index clusterisé est utilisée comme pointeur de ligne.

Cela signifie qu'un index clusterisé doit être unique. Si un index clusterisé n'est pas unique, une colonne cachée spéciale appelée uniquifier est ajouté à la clé d'index qui le rend unique (et de plus grande taille).

Il convient également de noter que la création d'un index secondaire sur une colonne fait que les valeurs ou la clé de l'index clusterisé font partie de la clé de l'index secondaire.

En créant un index sur une table clusterisée, vous obtenez en fait toujours un index composite

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

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

Indexer IX_mytable_5678 est en fait un index sur les colonnes suivantes :

col5
col6
col7
col8
col1
col2
col3
col4

Cela a un autre effet secondaire :

Un DESC condition dans un index à colonne unique sur une table en cluster a un sens dans SQL Server

Cet indice :

CREATE INDEX IX_mytable ON mytable (col1)

peut être utilisé dans une requête comme celle-ci :

SELECT  TOP 100 *
FROM    mytable
ORDER BY
       col1, id

, tandis que celui-ci :

CREATE INDEX IX_mytable ON mytable (col1 DESC)

peut être utilisé dans une requête comme celle-ci :

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