クラスター化列ストアの非クラスター化インデックスストレージ


18

SQL Serverでは、行ストアテーブルの一意でない非クラスター化インデックスに、非クラスター化インデックス構造のすべてのレベルでベースオブジェクトのブックマーク(RIDまたはクラスター化キー)が組み込まれます。ブックマークは、すべてのインデックスレベルで非クラスター化インデックスキーの一部として保存されます。

一方、非クラスター化インデックスが一意である場合、ブックマークはキーの一部としてではなく、インデックスのリーフレベルにのみ存在します(実際には、ブックマークは1つ以上の含まれる列として存在します)。

SQL Server 2016では、列指向のテーブル(クラスター化された列ストアインデックスを持つテーブル)に非クラスター化Bツリーインデックスを構築できます。

  1. クラスター化された列ストアテーブルの非クラスター化Bツリーインデックスに使用される「ブックマーク」とは何ですか?
  2. 上記の一意および非一意の非クラスタ化インデックスの違いは引き続き適用されますか?

回答:


17
  1. 「ブックマーク」は、列ストアインデックスの元のロケーターですDmitri Korotkevitchによる「Pro SQL Server Internals」による)。これは、row_group_id最初の4バイトに列ストアインデックスがあり、2番目の4バイトにオフセットがある8バイトの値です。

  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);

を使用して、bツリーのさまざまなレベルでインデックス行のサイズを確認できます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;

出力は次のとおりです。

一意のインデックス

Nonunqiueインデックス

両方の構造はリーフレベルで同じ行サイズを持ちますが、非一意の非クラスター化インデックスは、8バイトの列ストアロケーターと最初の変数の4バイトのオーバーヘッドにより、非リーフレベルの一意の非クラスター化インデックスより12バイト大きくなります行の長さの列(uniquifierは可変長)。


また、対応する行がデルタストアにある場合はどうなりますか?デルタストアが圧縮されるとどうなりますか?
アータッシュハチャトリアン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.