在 SQL Server 中,行存储表上的非唯一非聚集索引在非聚集索引结构的所有级别合并了基础对象的书签(RID 或聚集键)。书签作为非聚集索引键的一部分存储在所有索引级别。
另一方面,如果非聚集索引是唯一的,则书签仅存在于索引的叶级别 - 不作为键的一部分(实际上,书签作为一个或多个包含列存在)。
在 SQL Server 2016 中,可以在面向列的表(具有聚集列存储索引的表)上构建非聚集 b 树索引。
- 用于聚集列存储表上的非聚集 b 树索引的“书签”是什么?
- 上面描述的唯一和非唯一非聚集索引之间的差异是否仍然适用?
“书签”是列存储索引原始定位器(根据 Dmitri Korotkevitch 的“Pro SQL Server Internals”)。这是一个 8 字节的值,列存储索引
row_group_id
位于前 4 字节中,偏移量位于后 4 字节中。如果您使用
DBCC PAGE
查看非聚集索引,则 8 字节列存储索引原始定位器出现在输出的“uniquifier”列中DBCC PAGE
。这表明唯一非聚集索引不需要包含列存储行定位符,而非唯一非聚集索引则需要。以下代码创建一个列存储组织表,该表在同一列上具有唯一和非唯一 b 树非聚集索引:
我们可以使用以下命令查看 b-tree 不同级别的索引行的大小
sys.dm_db_index_physical_stats
:输出是:
两种结构在叶级别具有相同的行大小,但由于 8 字节列存储定位器,非唯一非聚集索引比非叶级别的唯一非聚集索引大 12 字节,加上第一个变量的 4 字节开销-length 一行中的列(唯一符是可变长度)。