O "marcador" é o localizador original do índice columnstore (por "Pro SQL Server Internals" de Dmitri Korotkevitch). Esse é um valor de 8 bytes, com o índice columnstore row_group_id
nos primeiros 4 bytes e um deslocamento nos segundos 4 bytes.
Se você usar DBCC PAGE
o índice não agrupado em cluster, o localizador original do índice columnstore de 8 bytes será exibido na coluna "uniquifier" da DBCC PAGE
saída. Isso mostra que um índice não clusterizado exclusivo não precisa incluir o localizador de linhas columnstore, enquanto um índice não clusterizado não exclusivo faz.
O código a seguir cria uma tabela organizada por columnstore com um índice não clusterizado exclusivo e não exclusivo da árvore-b na mesma coluna:
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);
Podemos ver o tamanho da linha do índice em diferentes níveis da árvore b usando 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;
A saída é:
Ambas as estruturas têm o mesmo tamanho de linha no nível folha, mas o índice não clusterizado não exclusivo é 12 bytes maior que o índice não clusterizado exclusivo nos níveis não folha devido ao localizador de armazenamento de colunas de 8 bytes, mais 4 bytes de sobrecarga para a primeira variável coluna de comprimento em uma linha (o uniquificador é o comprimento variável).