“书签”是列存储索引的原始定位符(根据Dmitri Korotkevitch的“ Pro SQL Server内部原理”)。这是一个8字节的值,列存储索引row_group_id
在前4个字节中,而偏移量在后4个字节中。
如果DBCC PAGE
用于查看非聚集索引,则8字节列存储索引原始定位符将出现在DBCC PAGE
输出的“ uniquifier”列中。这表明唯一的非聚集索引不需要包括列存储行定位符,而非唯一的非聚集索引却需要。
以下代码创建一个由列存储组织的表,该表在同一列上具有唯一和非唯一的b树非聚集索引:
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);
我们可以使用sys.dm_db_index_physical_stats
以下命令在b树的不同级别看到索引行的大小:
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;
输出为:
两种结构在叶级具有相同的行大小,但是由于8字节的列存储定位符,因此非唯一的非聚集索引比非叶级别的唯一非聚集索引大12字节。行中的-length列(分隔符是可变长度)。