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 - SPILLOVER:仅适用于内存中表上的列存储。 如果 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 数据库性能状态权限。

示例

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)