适用于:Azure Synapse Analytics
分析平台系统 (PDW)
按细分提供聚集列存储索引信息,以帮助管理员在 Azure Synapse Analytics 中做出系统管理决策。 sys.pdw_nodes_column_store_row_groups 具有物理存储的行总数(包括标记为已删除的行数)的列,以及标记为已删除的行数的列。 使用 sys.pdw_nodes_column_store_row_groups 确定哪些行组具有较高百分比的已删除行,应重新生成。
| 列名称 | 数据类型 | 说明 |
|---|---|---|
| object_id | int | 基础表的 ID。 这是计算节点上的物理表,而不是控制节点上逻辑表的object_id。 例如,object_id与 sys.tables 中的object_id不匹配。 若要与 sys.tables 联接,请使用sys.pdw_index_mappings。 |
| index_id | int | object_id表上的聚集列存储索引的 ID。 |
| partition_number | int | 保存行组 row_group_id的表分区的 ID。 可以使用 partition_number 将此 DMV 联接到 sys.partitions。 |
| row_group_id | int | 此行组的 ID。 这在分区中是唯一的。 |
| delta_store_hobt_id | bigint | delta 行组的 hobt_id;或如果行组类型不是 delta,则为 NULL。 delta 行组是正在接受新记录的读/写行组。 增量行组具有 OPEN 状态。 delta 行组仍采用行存储格式,并且尚未压缩成列存储格式。 |
| State | tinyint | 与 state_description 关联的 ID 号。 1 = 开局 2 = 闭合 3 = 压缩 |
| state_description | nvarchar(60) | 行组的持久状态的说明: OPEN - 接受新记录的读/写行组。 开放的行组仍采用行存储格式,并且尚未压缩成列存储格式。 CLOSED - 已填充但尚未由元组移动器进程压缩的行组。 COMPRESSED - 已填充和压缩的行组。 |
| total_rows | bigint | 行组中物理存储的总行数。 一些行可能已删除,但它们仍被存储。 一个行组中的最大行数为 1,048,576(十六进制 FFFFF)。 |
| deleted_rows | bigint | 物理存储在标记为要删除的行组中的行数。 对于 DELTA 行组,始终为 0。 |
| size_in_bytes | int | 此行组中所有页面的组合大小(以字节为单位)。 此大小不包括存储元数据或共享字典所需的大小。 |
| pdw_node_id | int | Azure Synapse Analytics 节点的唯一 ID。 |
| distribution_id | int | 分发的唯一 ID。 |
注解
针对每个表中具有聚合或非聚合列存储索引的每个列存储行组返回一行。
使用 sys.pdw_nodes_column_store_row_groups 来确定行组中包含的行数和行组的大小。
当行组中的已删除行数量增长到占总行数的较大百分比时,该表的效率将下降。 重新生成列存储索引以减少表的大小,同时减少读取该表所需的磁盘 I/O。 要重建列存储索引,请使用语句中的ALTER INDEX重建选项。
可更新列存储首先将新数据 插入 OPEN 行组,该行组采用行存储格式,有时也称为增量表。 打开的行组已满后,其状态将更改为 CLOSED。 关闭的行组由元组移动器压缩为列存储格式,状态更改为 COMPRESSED。 元组搬运者是一个后台进程,它定期唤醒并检查是否有任何关闭的行组正准备要压缩成列存储行组。 元组搬运者还取消分配其中已删除每个行的行组。 已解除分配的行组标记为 已停用。 要立即运行元组移动器,请使用语句中的ALTER INDEX重组选项。
如果列存储行组已填充,它将进行压缩并停止接受新行。 当从压缩组中删除行时,这些行将保留但标记为已删除。 对压缩组的更新将实现为压缩组中的删除以及对打开组的插入。
权限
需要 VIEW 服务器状态 权限。
示例:Azure Synapse Analytics 和 Analytics Platform System (PDW)
以下示例将 sys.pdw_nodes_column_store_row_groups 表联接到其他系统表,以返回有关特定表的信息。 计算的 PercentFull 列是对行组效率的估计。 若要查找有关单个表的信息,请删除 WHERE 子句前面的注释连字符并提供表名。
SELECT IndexMap.object_id,
object_name(IndexMap.object_id) AS LogicalTableName,
i.name AS LogicalIndexName, IndexMap.index_id, NI.type_desc,
IndexMap.physical_name AS PhyIndexNameFromIMap,
CSRowGroups.*,
100*(ISNULL(deleted_rows,0))/total_rows AS PercentDeletedRows
FROM sys.tables AS t
JOIN sys.indexes AS i
ON t.object_id = i.object_id
JOIN sys.pdw_index_mappings AS IndexMap
ON i.object_id = IndexMap.object_id
AND i.index_id = IndexMap.index_id
JOIN sys.pdw_nodes_indexes AS NI
ON IndexMap.physical_name = NI.name
AND IndexMap.index_id = NI.index_id
JOIN sys.pdw_nodes_column_store_row_groups AS CSRowGroups
ON CSRowGroups.object_id = NI.object_id
AND CSRowGroups.pdw_node_id = NI.pdw_node_id
AND CSRowGroups.distribution_id = NI.distribution_id
AND CSRowGroups.index_id = NI.index_id
WHERE total_rows > 0
--WHERE t.name = '<table_name>'
ORDER BY object_name(i.object_id), i.name, IndexMap.physical_name, pdw_node_id;
以下 Azure Synapse Analytics 示例计算聚集列存储的每个分区的行数,以及打开、关闭或压缩行组中的行数:
SELECT
s.name AS [Schema Name]
,t.name AS [Table Name]
,rg.partition_number AS [Partition Number]
,SUM(rg.total_rows) AS [Total Rows]
,SUM(CASE WHEN rg.State = 1 THEN rg.Total_rows Else 0 END) AS [Rows in OPEN Row Groups]
,SUM(CASE WHEN rg.State = 2 THEN rg.Total_Rows ELSE 0 END) AS [Rows in Closed Row Groups]
,SUM(CASE WHEN rg.State = 3 THEN rg.Total_Rows ELSE 0 END) AS [Rows in COMPRESSED Row Groups]
FROM sys.pdw_nodes_column_store_row_groups rg
JOIN sys.pdw_nodes_tables pt
ON rg.object_id = pt.object_id
AND rg.pdw_node_id = pt.pdw_node_id
AND pt.distribution_id = rg.distribution_id
JOIN sys.pdw_table_mappings tm
ON pt.name = tm.physical_name
INNER JOIN sys.tables t
ON tm.object_id = t.object_id
INNER JOIN sys.schemas s
ON t.schema_id = s.schema_id
GROUP BY s.name, t.name, rg.partition_number
ORDER BY 1, 2
另请参阅
Azure Synapse Analytics 和并行数据仓库目录视图
CREATE COLUMNSTORE INDEX (Transact-SQL)
sys.pdw_nodes_column_store_segments (Transact-SQL)
sys.pdw_nodes_column_store_dictionaries (Transact-SQL)