Domanda

Ho una tavola con due indici non cluster.

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)

Ogni indice si riferisce alle stesse colonne ma in un ordine diverso.

- Inserire alcune righe

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 dimensione di ciascun indice è la seguente

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

Ogni indice sta usando 16kb.

Ora se aggiungo un indice cluster su id_person

create clustered index ix_id_people on people(id_person)

Finisco con la stessa quantità di spazio utilizzata da ciascun indice.

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

L'unica differenza è ora invece di un heap, ho un indice cluster.

Mi aspettavo che con un indice cluster su ID_person, il motore di archiviazione non avrebbe dovuto più includere ID_person in ciascun indice non cluster.

Domande:

I valori per ciascuna colonna si riferiscono da un indice non cluster archiviati solo per il primo indice non cluster e quindi referenziati da tutti gli indici non cluster aggiuntivi?

Se un indice non cluster fa riferimento alla colonna indice cluster, i valori di quella colonna sono copiati fisicamente su ciascun indice non cluster o semplicemente referenziati?

Aggiornamento 14:55

Ecco la query utilizzata per calcolare la dimensione dell'indice

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

Nessuna soluzione corretta

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a dba.stackexchange
scroll top