sys.column_store_segments (Transact-SQL)

適用対象: SQL Server 2012 (11.x) 以降 Azure SQL Managed Instance

列ストア インデックス内の列セグメントごとに 1 行を返します。 行グループごとに列ごとに 1 つの列セグメントがあります。 たとえば、10 個の行グループと 34 列のテーブルでは、340 行が返されます。

列名 データ型 説明
partition_id bigint パーティション ID を示します。 データベース内で一意です。
hobt_id bigint この列ストア インデックスを持つテーブルのヒープまたは B ツリー インデックス (HoBT) の ID。
column_id int 列ストア列の ID。
segment_id int 行グループの ID。 旧バージョンとの互換性のために、行グループ ID であっても、列名は引き続きsegment_id呼び出されます。 <hobt_id、partition_id、column_id>、<segment_id>を使用してセグメントを一意に識別できます。
version int 列セグメント形式のバージョン。
encoding_type int そのセグメントに使用されるエンコードの種類:

1 = VALUE_BASED - 辞書のない非文字列/バイナリ (いくつかの内部バリエーションを含む 4 に似ています)

2 = VALUE_HASH_BASED - ディクショナリ内の共通値を持つ非文字列/バイナリ列

3 = STRING_HASH_BASED - ディクショナリ内の共通値を持つ文字列/バイナリ列

4 = STORE_BY_VALUE_BASED - ディクショナリのない非文字列/バイナリ

5 = STRING_STORE_BY_VALUE_BASED - ディクショナリのない文字列/バイナリ

詳細については、「解説」を参照してください。
row_count int 行グループ内の行数。
has_nulls int 列セグメントに null 値がある場合は 1。
base_id bigint エンコード・タイプ 1 が使用されている場合の基本値 ID。 エンコード・タイプ 1 が使用されていない場合、base_idは -1 に設定されます。
magnitude float エンコードの種類 1 が使用されている場合の大きさ。 エンコード・タイプ 1 が使用されていない場合、大きさは -1 に設定されます。
primary_dictionary_id int 値 0 は、グローバル ディクショナリを表します。 値 -1 は、この列にグローバル ディクショナリが作成されていないことを示します。
secondary_dictionary_id int 0 以外の値は、現在のセグメント (行グループなど) 内のこの列のローカル ディクショナリを指します。 値 -1 は、このセグメントにローカル ディクショナリがないことを示します。
min_data_id bigint 列セグメント内の最小データ ID。
max_data_id bigint 列セグメント内の最大データ ID。
null_value bigint NULL を表すために使用される値。
on_disk_size bigint セグメントのサイズ (バイト単位)。
collation_id int SQL Server 2022 (16.x) 以降に適用されます。
セグメントが作成されたときの現在の照合順序。 内部 ID にマップされます。 現在は内部のみであり、開発用ではありません。
min_deep_data varbinary(18) SQL Server 2022 (16.x) 以降に適用されます。
セグメントの削除に使用されます。1 内部使用の場合のみ。
max_deep_data varbinary(18) SQL Server 2022 (16.x) 以降に適用されます。
セグメントの削除に使用されます。1 内部使用の場合のみ。

1文字列最小/最大セグメントの削除 (SQL Server 2022 (16.x) 以降) をサポートする SQL Server のバージョンにアップグレードした後、max_deep_dataは、REBUILD または DROP/CREATE を使用して、列ストア インデックスが再構築されるまでNULLされます。 再構築後、文字列の最小/最大セグメントの削除のメリットを得ることができるデータ型を含むセグメントには、データが含まれます。

解説

列ストア セグメントのエンコードの種類は、セグメント データを分析することによって、ストレージ コストを最も低くすることを目的として、データベース エンジンによって選択されます。 データがほとんど異なる場合、データベース エンジンでは値ベースのエンコードが使用されます。 データがほとんど異なる場合、データベース エンジンはハッシュベースのエンコードを使用します。 文字列ベースと値ベースのエンコードのどちらを選択するかは、格納されるデータの種類 (文字列データかバイナリ データかに関係なく) に関連します。 可能であれば、すべてのエンコードでビット パッキングと実行長のエンコードが利用されます。

列ストア セグメントの削除は、数値、日付、時刻のデータ型、および小数点以下桁数が 2 以下の datetimeoffset データ型に適用されます。 SQL Server 2022 (16.x) からは、セグメントの削除機能が、文字列、バイナリ、guid データ型、およびスケールが 2 より大きい datetimeoffset データ型まで拡張されます。 セグメントの削除は、(max) データ型の長さなどの LOB データ型には適用されません。

アクセス許可

すべての列には、テーブルに対する少なくとも VIEW DEFINITION 権限が必要です。 次の列は、ユーザーにもSELECTアクセス許可がない限り、NULLを返します:has_nullsbase_idmagnitudemin_data_idmax_data_id、およびnull_value

カタログ ビューでのメタデータの可視性は、ユーザーが所有しているか、ユーザーに何らかのアクセス許可が付与されているセキュリティ保護可能なリソースに限定されます。 詳細については、「 Metadata Visibility Configuration」を参照してください。

次のクエリは、列ストア インデックスのセグメントに関する情報を返します。

SELECT i.name, p.object_id, p.index_id, i.type_desc,
    COUNT(*) AS number_of_segments
FROM sys.column_store_segments AS s
INNER JOIN sys.partitions AS p
    ON s.hobt_id = p.hobt_id
INNER JOIN sys.indexes AS i
    ON p.object_id = i.object_id
WHERE i.type = 5 OR i.type = 6
GROUP BY i.name, p.object_id, p.index_id, i.type_desc ;
GO

次のステップ