sys.dm_db_column_store_row_group_physical_stats (Transact-SQL)

适用于:SQL Server 2016 (13.x) 及更高版本 Azure SQL 数据库 Azure SQL 托管实例

提供有关当前数据库中所有列存储索引的当前行组级信息。

这会扩展目录视图sys.column_store_row_groups(Transact-SQL)。

列名称 数据类型 说明
object_id int 基础表的 ID。
index_id int object_id 表上的此列存储索引的 ID。
partition_number int 保存 row_group_id的表分区的 ID。 您可以使用 partition_number 将此 DMV 联接到 sys.partitions。
row_group_id int 此行组的 ID。 对于已分区表,值在分区中是唯一的。

-1 表示内存中尾部。
delta_store_hobt_id bigint 增量存储区中行组的hobt_id。

如果行组不在增量存储中,则为 NULL。

内存中表尾的 NULL。
State tinyint state_description关联的 ID 号。

0 = INVISIBLE

1 = OPEN

2 = CLOSED

3 = COMPRESSED

4 = TOMBSTONE

COMPRESSED 是应用于内存中表的唯一状态。
state_desc nvarchar(60) 行组状态的说明:

0 - INVISIBLE -正在生成的行组。 例如:
在压缩数据时,列存储中的行组是 INVISIBLE。 压缩完成后,元数据开关会将列存储行组的状态从 INVISIBLE 更改为 COMPRESSED,并将增量存储行组的状态从 CLOSED 更改为 TOMBSTONE。

1 - OPEN - 接受新行的增量存储行组。 开放的行组仍采用行存储格式,并且尚未压缩成列存储格式。

2 - CLOSED - 增量存储区中包含最大行数的行组,并正在等待元组移动器进程将其压缩到列存储中。

3 - COMPRESSED - 使用列存储压缩进行压缩并存储在列存储中的行组。

4 - TOMBSTONE - 以前在增量存储中且不再使用的行组。
total_rows bigint 以物理方式存储在行组中的行数。 对于压缩行组。 包括标记为已删除的行。
deleted_rows bigint 以物理方式存储在压缩行组中且标记为要删除的行数。

对于增量存储中的行组,值为 0。
size_in_bytes bigint 此行组中所有页面的组合大小(以字节为单位)。 此大小不包括存储元数据或共享字典所需的大小。
trim_reason tinyint 触发 COMPRESSED 行组小于最大行数的原因。

0 - UNKNOWN_UPGRADED_FROM_PREVIOUS_VERSION

1 - NO_TRIM

2 - BULKLOAD

3 - REORG

4 - DICTIONARY_SIZE

5 - MEMORY_LIMITATION

6 - RESIDUAL_ROW_GROUP

7 - STATS_MISMATCH

8 - 溢出

9 - AUTO_MERGE
trim_reason_desc nvarchar(60) trim_reason的说明。

0 - UNKNOWN_UPGRADED_FROM_PREVIOUS_VERSION:从以前的 SQL Server 版本升级时发生。

1 - NO_TRIM:行组未剪裁。 行组已压缩,最多包含 1,048,576 行。 如果在关闭增量行组后删除了行的子集,则行数可能更少

2 - BULKLOAD:大容量加载批大小限制行数。

3 - REORG:强制压缩作为 REORG 命令的一部分。

4 - DICTIONARY_SIZE:字典大小太大,无法压缩所有行。

5 - MEMORY_LIMITATION:没有足够的可用内存来压缩所有行。

6 - RESIDUAL_ROW_GROUP:在索引生成操作期间,作为最后一行组的一部分关闭,其中行 < 数为 100 万。 注意:具有多个核心的分区生成可能会导致此类型的多个剪裁。

7 - STATS_MISMATCH:仅适用于内存中表上的列存储。 如果统计信息未正确指示 >= 结尾中的 100 万个限定行,但我们发现更少,则压缩行组将有 < 100 万行

8 - 溢出:仅适用于内存中表上的列存储。 如果 tail 有 > 100 万个限定行,则如果计数介于 10 万到 100 万之间,则会压缩最后一批剩余的行

9 - AUTO_MERGE:在后台运行的元组移动器合并操作将一个或多个行组合并到此行组中。
transition_to_compressed_state tinyint 显示此行组是如何从增量存储移动到列存储中的压缩状态的。

1- NOT_APPLICABLE

2 - INDEX_BUILD

3 - TUPLE_MOVER

4 - REORG_NORMAL

5 - REORG_FORCED

6 - BULKLOAD

7 - MERGE
transition_to_compressed_state_desc nvarchar(60) 1 - NOT_APPLICABLE - 操作不适用于增量存储。 或者,在升级到 SQL Server 2016(13.x)之前压缩了行组,在这种情况下,历史记录不会保留。

2 - INDEX_BUILD - 索引创建或索引重新生成压缩行组。

3 - TUPLE_MOVER - 在后台运行的元组移动器压缩行组。 在行组将状态从 OPEN 更改为 CLOSED 之后,元组移动器将发生。

4 - REORG_NORMAL - 重组操作,ALTER INDEX ...REORG,将 CLOSED 行组从增量存储移动到列存储。 这发生在元组移动器有时间移动行组之前。

5 - REORG_FORCED - 此行组在增量存储中处于打开状态,并被迫进入列存储,然后才具有完整行数。

6 - BULKLOAD - 大容量加载操作直接压缩行组,而无需使用增量存储。

7 - MERGE - 合并操作将一个或多个行组合并到此行组中,然后执行列存储压缩。
has_vertipaq_optimization bit VertiPaq 优化通过重新排列行组中行的顺序来提高列存储压缩,以实现更高的压缩。 在大多数情况下,会自动进行此优化。 在以下两种情况下,未使用 VertiPaq 优化:
a. 当增量行组移动到列存储并且列存储索引上存在一个或多个非聚集索引时 -在这种情况下,将跳过 VertiPaq 优化以最大程度地减少对映射索引的更改;
b. 用于内存优化表上的列存储索引。

0 = 否

1 = 是
bigint 与此行组关联的行组生成。
created_time datetime2 创建此行组时的时钟时间。

NULL - 内存中表的列存储索引。
closed_time datetime2 此行组关闭时的时钟时间。

NULL - 内存中表的列存储索引。

结果

返回当前数据库中每个行组的一行。

权限

CONTROL需要对表具有权限和VIEW DATABASE STATE数据库权限。

SQL Server 2022 及更高版本的权限

需要对数据库拥有 VIEW DATABASE PERFORMANCE STATE 权限。

示例

A. 计算碎片以决定何时重新组织或重新生成列存储索引。

对于列存储索引,已删除行的百分比是行组中碎片的良好度量值。 当碎片为 20% 或更多时,请删除已删除的行。 有关更多示例,请参阅 重新组织索引和重新生成索引

此示例将sys.dm_db_column_store_row_group_physical_stats与其他系统表联接 然后计算 Fragmentation 列作为当前数据库中每一行组的效率的估计值。 若要查找有关单个表的信息,请删除 WHERE 子句前面的注释连字符并提供表名。

SELECT i.object_id,   
    object_name(i.object_id) AS TableName,   
    i.name AS IndexName,   
    i.index_id,   
    i.type_desc,   
    CSRowGroups.*,  
    100*(ISNULL(deleted_rows,0))/NULLIF(total_rows,0) AS 'Fragmentation'
FROM sys.indexes AS i  
JOIN sys.dm_db_column_store_row_group_physical_stats AS CSRowGroups  
    ON i.object_id = CSRowGroups.object_id AND i.index_id = CSRowGroups.index_id   
-- WHERE object_name(i.object_id) = 'table_name'   
ORDER BY object_name(i.object_id), i.name, row_group_id;  

另请参阅

对象目录视图 (Transact-SQL)
目录视图 (Transact-SQL)
列存储索引体系结构
查询 SQL Server 系统目录常见问题
sys.columns (Transact-SQL)
sys.all_columns (Transact-SQL)
sys.computed_columns (Transact-SQL)
sys.column_store_dictionaries (Transact-SQL)
sys.column_store_segments (Transact-SQL)