Question

J'ai une table de table avec deux index non groupés.

create table people(
 id_person int,
 first_name varchar(50),
 last_name varchar(50),
 city varchar(100),
 state char(2),
 zip_code int
)

CREATE INDEX id_first_name_last_name ON people(first_name, last_name, id_person)
CREATE INDEX id_last_name_first_name ON people(id_person, last_name, first_name)

Chaque index fait référence aux mêmes colonnes mais dans un ordre différent.

- Insérez quelques lignes

insert into people values(1,'joe','smith','new york', 'NY', 10701)
insert into people values(2,'john','smith','new york', 'NY', 10701)
insert into people values(3,'joyce','smith','new york', 'NY', 10701)
insert into people values(4,'jocelyn','smith','new york', 'NY', 10701)

La taille de chaque index est la suivante

TableName   IndexName            IndexID    Indexsize(KB)
people          NULL                     0           16
people          id_first_name_last_name  2           16
people          id_last_name_first_name  3           16

Chaque index utilise 16 Ko.

Maintenant, si j'ajoute un index en cluster sur id_person

create clustered index ix_id_people on people(id_person)

Je me retrouve avec la même quantité d'espace utilisée par chaque index.

TableName   IndexName            IndexID    Indexsize(KB)
people          NULL                     1           16
people          id_first_name_last_name  2           16
people          id_last_name_first_name  3           16

La seule différence est maintenant au lieu d'un tas, j'ai un index en cluster.

Je m'attendais à ce qu'avec un index en cluster sur id_person, le moteur de stockage n'aurait plus besoin d'inclure ID_PERSON dans chaque index non cluster.

Des questions:

Les valeurs pour chaque colonne sont-elles référencées par un index non groupé stocké uniquement pour le premier index non cluster, puis référencés par tous les index non clumpants supplémentaires?

Si un index non cluster fait référence à la colonne d'index en cluster, les valeurs de cette colonne ont-elles été copiées physiquement sur chaque index non cluster ou simplement référencées?

Mise à jour 14:55

Voici la requête utilisée pour calculer la taille de l'index

SELECT
OBJECT_NAME(i.OBJECT_ID) AS TableName,
i.name AS IndexName,
i.index_id AS IndexID,
8 * SUM(a.used_pages) AS 'Indexsize(KB)'
FROM sys.indexes AS i
JOIN sys.partitions AS p ON p.OBJECT_ID = i.OBJECT_ID AND p.index_id = i.index_id
JOIN sys.allocation_units AS a ON a.container_id = p.partition_id
GROUP BY i.OBJECT_ID,i.index_id,i.name
ORDER BY OBJECT_NAME(i.OBJECT_ID),i.index_id

Pas de solution correcte

Licencié sous: CC-BY-SA avec attribution
Non affilié à dba.stackexchange
scroll top