集群列存储上的非集群索引存储


18

在SQL Server中,行存储表上的非唯一非聚集索引在非聚集索引结构的所有级别上都包含基础对象的书签(RID或群集键)。书签作为所有索引级别上非聚集索引键的一部分存储。

另一方面,如果非聚集索引是唯一的,则书签仅在索引的级别存在-不作为键的一部分(实际上,书签作为一个或多个包含的列存在)。

在SQL Server 2016中,可以在面向列的表(具有群集列存储索引的表)上构建非群集b树索引。

  1. 集群列存储表上非集群b树索引使用的“书签”是什么?
  2. 上述唯一索引和非唯一非聚集索引之间的区别是否仍然适用?

Answers:


17
  1. “书签”是列存储索引的原始定位符(根据Dmitri Korotkevitch的“ Pro SQL Server内部原理”)。这是一个8字节的值,列存储索引row_group_id在前4个字节中,而偏移量在后4个字节中。

  2. 如果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列(分隔符是可变长度)。


如果对应的行在增量存储中,该怎么办?压缩增量存储时会发生什么?
Artashes Khachatryan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.