Le «signet» est le localisateur d'origine de l'index columnstore (selon «Pro SQL Server Internals» de Dmitri Korotkevitch). Il s'agit d'une valeur de 8 octets, avec l'index columnstore row_group_id
dans les 4 premiers octets et un décalage dans les seconds 4 octets.
Si vous utilisez DBCC PAGE
pour consulter l'index non clusterisé, le localisateur d'origine de l'index columnstore de 8 octets apparaît dans la colonne "uniquifier" de la DBCC PAGE
sortie. Cela montre qu'un index non cluster unique n'a pas besoin d'inclure le localisateur de lignes columnstore, contrairement à un index non cluster non unique .
Le code suivant crée une table organisée en magasin de colonnes avec un index non cluster unique et non unique b-tree sur la même colonne:
CREATE TABLE dbo.Heapish
(
c1 bigint NOT NULL,
c2 bigint NOT NULL,
INDEX CCI_dbo_Heapish CLUSTERED COLUMNSTORE
);
GO
INSERT dbo.Heapish WITH (TABLOCKX)
(c1, c2)
SELECT TOP (1024 * 1024 * 8)
c1 = ROW_NUMBER() OVER
(ORDER BY C1.[object_id], C1.column_id),
c2 = ROW_NUMBER() OVER
(ORDER BY C1.[object_id], C1.column_id)
FROM master.sys.columns AS C1
CROSS JOIN master.sys.columns AS C2
ORDER BY
c1
OPTION (MAXDOP 1);
GO
CREATE UNIQUE NONCLUSTERED INDEX UNIQUE_c2 ON dbo.Heapish (c2) WITH (MAXDOP = 1);
CREATE NONCLUSTERED INDEX NONUNIQUE_c2 ON dbo.Heapish (c2) WITH (MAXDOP = 1);
Nous pouvons voir la taille de la ligne d'index à différents niveaux de l'arbre b en utilisant sys.dm_db_index_physical_stats
:
SELECT
DDIPS.index_level,
DDIPS.page_count,
DDIPS.record_count,
DDIPS.min_record_size_in_bytes,
DDIPS.max_record_size_in_bytes
FROM sys.dm_db_index_physical_stats
(
DB_ID(),
OBJECT_ID(N'dbo.Heapish', N'U'),
INDEXPROPERTY(OBJECT_ID(N'dbo.Heapish', N'U'), N'UNIQUE_c2', 'IndexID'),
NULL, 'DETAILED'
) AS DDIPS;
SELECT
DDIPS.index_level,
DDIPS.page_count,
DDIPS.record_count,
DDIPS.min_record_size_in_bytes,
DDIPS.max_record_size_in_bytes
FROM sys.dm_db_index_physical_stats
(
DB_ID(),
OBJECT_ID(N'dbo.Heapish', N'U'),
INDEXPROPERTY(OBJECT_ID(N'dbo.Heapish', N'U'), N'NONUNIQUE_c2', 'IndexID'),
NULL, 'DETAILED'
) AS DDIPS;
La sortie est:
Les deux structures ont la même taille de ligne au niveau feuille, mais l'index non cluster non unique est 12 octets plus grand que l'index non cluster unique aux niveaux non feuille en raison du localisateur de magasin de colonnes de 8 octets, plus 4 octets de surcharge pour la première variable - colonne de longueur dans une ligne (l'uniquificateur est de longueur variable).