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_nulls
、base_id
、magnitude
、min_data_id
、max_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