sys.column_store_segments (Transact-SQL)
适用于: SQL Server 2012(11.x)及更高版本Azure SQL 托管实例
为列存储索引中的每个列段返回一行。 每个行组每个列有一个列段。 例如,包含 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 | 1 如果列段具有 Null 值。 |
base_id | bigint | 如果使用编码类型 1 的基值 ID。 如果未使用编码类型 1,则base_id设置为 -1。 |
magnitude | float | 如果使用编码类型 1,则数量级。 如果未使用编码类型 1,则数量级设置为 -1。 |
primary_dictionary_id | int | 值为 0 表示全局字典。 值为 -1 表示没有为此列创建全局字典。 |
secondary_dictionary_id | int | 非零值指向当前段(例如行组)中此列的本地字典。 值为 -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 升级到支持字符串 min/max 段消除的 SQL Server 版本(SQL Server 2022 (16.x) 及更高版本后, min_deep_data
max_deep_data
将使用 NULL
REBUILD 或 DROP/CREATE 重新生成列存储索引之后。 重新生成后,包含可受益于字符串 min/max 段消除的数据类型的段将包含数据。
注解
列存储段编码类型由数据库引擎选择,目标是通过分析段数据来实现最低的存储成本。 如果数据大多不同,则数据库引擎使用基于值的编码。 如果数据大多不不同,则数据库引擎使用基于哈希的编码。 基于字符串的编码和基于值的编码的选择与所存储的数据类型(无论是字符串数据还是二进制数据)相关。 所有编码都尽可能利用位打包和运行长度编码。
列存储段消除适用于数值、日期和时间数据类型,以及刻度小于或等于 2 的 datetimeoffset 数据类型。 从 SQL Server 2022 (16.x) 开始,段消除功能扩展到字符串、二进制文件、guid 数据类型以及用于小数位数大于 2 的 datetimeoffset 数据类型。 段消除不适用于 LOB 数据类型,如 (max) 数据类型长度。
权限
所有列至少 VIEW DEFINITION
需要对表具有权限。 除非用户还具有权限,否则以下列将返回NULL
:has_nulls
、、base_id
magnitude
、min_data_id
、 max_data_id
和null_value
。SELECT
目录视图中仅显示用户拥有的安全对象的元数据,或用户对其拥有某些权限的安全对象的元数据。 有关详细信息,请参阅 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