ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

StarRocks 物化视图刷新信息诊断函数 inspect_mv_refresh_info 深入解析

StarRocks 物化视图刷新信息诊断函数 inspect_mv_refresh_info 深入解析 StarRocks 物化视图刷新信息诊断函数 inspect_mv_refresh_info 深入解析【免费下载链接】starrocksThe worlds fastest open query engine for sub-second analytics both on and off the data lakehouse. With the flexibility to support nearly any scenario, StarRocks provides best-in-class performance for multi-dimensional analytics, real-time analytics, and ad-hoc queries. A Linux Foundation project.项目地址: https://gitcode.com/GitHub_Trending/st/starrocksinspect_mv_refresh_info是 StarRocks 提供的一个元数据Meta诊断函数用于以 JSON 形式返回指定异步物化视图的刷新状态信息包括其基表待刷新分区元信息、OLAP 基表与外部基表已刷新版本映射等。本指南将结合官方 SQL 参考文档inspect_mv_refresh_info与 FE 源码实现完整讲解该函数的语法、返回 JSON 结构逐字段含义、实际执行示例以及它在物化视图刷新排查、基表分区追踪等场景中的实战用法帮助读者快速定位物化视图数据是否过期、哪些分区需要刷新等问题。一、函数概述inspect_mv_refresh_info属于 StarRocks 的meta 类函数isMetaFunction true其作用是返回一个物化视图的刷新信息。刷新信息以 VARCHAR 字符串形式返回内容为 JSON 格式涵盖三类核心数据tableToUpdatePartitions物化视图各基表中待刷新分区的元信息baseOlapTableVisibleVersionMap物化视图各OLAP 基表已刷新版本映射baseExternalTableInfoVisibleVersionMap物化视图各外部基表如 Hive、Iceberg、Paimon 等已刷新版本映射。从源码注册信息可以确认该函数的类型签名见 MetaFunctions.javaConstantFunction(name inspect_mv_refresh_info, argTypes {VARCHAR}, returnType VARCHAR, isMetaFunction true) public static ConstantOperator inspectMVRefreshInfo(ConstantOperator mvName)它接受一个 VARCHAR 参数物化视图名返回一个 VARCHAR 类型的 JSON 字符串。二、语法与参数inspect_mv_refresh_info(mv_name)参数类型说明mv_nameVARCHAR物化视图的名称支持catalog.database.mv_name或database.mv_name形式的全限定名参数校验逻辑位于inspectMVRefreshInfo方法中MetaFunctions.java若mv_name为 NULL抛出ERR_INVALID_PARAMETER语义异常通过TableName.fromString解析表名并调用inspectTable定位对应的库与表若目标对象不是物化视图!table.isMaterializedView()抛出ERR_INVALID_PARAMETER错误信息形如xxx is not materialized view校验通过后将对象强转为MaterializedView进入信息采集流程。三、返回 JSON 结构详解函数返回一个 JSON 字符串。结合 MVRefreshInfoMeta 类的SerializedName字段定义完整结构如下{ mvName: 物化视图名, mvToRefreshPartitions: [物化视图待刷新分区名列表], tableToUpdatePartitions: { 基表名1: [该基表待刷新分区名列表] }, tablePartitionInfos: { 基表名1: 该基表各分区当前版本信息的 JSON 字符串 }, baseOlapTableVisibleVersionMap: { OLAP基表名: { 分区名: { id: 分区ID, version: 可见版本号, lastRefreshTime: 上次刷新时间戳(毫秒), lastFileModifiedTime: 分区数据路径最后修改时间(-1表示不适用), fileNumber: 分区数据文件数(-1表示不适用) } } }, baseExternalTableInfoVisibleVersionMap: { 外部基表标识: { 分区名: { id: -1, version: 外部表分区版本, lastRefreshTime: 修改时间戳, lastFileModifiedTime: -1, fileNumber: -1 } } } }各字段含义如下JSON 字段含义mvName物化视图名称mvToRefreshPartitions物化视图自身需要刷新的分区集合tableToUpdatePartitions基表名 → 待刷新分区名集合的映射只有存在待刷新分区的基表才会出现在该映射中tablePartitionInfos基表名 → 该基表全部分区当前版本信息JSON 字符串的映射baseOlapTableVisibleVersionMapOLAP 基表名 →分区名 →BasePartitionInfo的映射记录刷新时已消费的版本baseExternalTableInfoVisibleVersionMap外部基表标识 →分区名 →BasePartitionInfo的映射记录外部基表已刷新的版本信息其中每个分区条目对应的BasePartitionInfo类定义于 MaterializedView.java字段含义id分区 ID。OLAP 表取分区真实 ID外部表统一为-1不可用version分区可见版本号。对 OLAP 表取defaultPhysicalPartition.getVisibleVersion()对外部表取连接器提供的分区版本lastRefreshTime上次刷新时间戳。OLAP 表经fromOlapTable构造时该值固定为-1由刷新流程另行填充真实时间外部表取连接器的分区修改时间见fromExternalTableMaterializedView.javalastFileModifiedTime分区数据路径的最后修改时间未设置时为-1fileNumber分区数据路径下的文件数未设置时为-1。四、使用示例4.1 官方示例查看刷新状态mysql select inspect_mv_refresh_info(test_mv1); ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | inspect_mv_refresh_info(test_mv1) | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | {tableToUpdatePartitions:{},baseOlapTableVisibleVersionMap:{ss:{ss:{id:28672,version:4,lastRefreshTime:1751439875145,lastFileModifiedTime:-1,fileNumber:-1}}},baseExternalTableInfoVisibleVersionMap:{}} | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 1 row in set (0.00 sec)对该返回结果逐字段解读tableToUpdatePartitions: {}当前没有任何基表分区需要刷新说明物化视图处于最新状态baseOlapTableVisibleVersionMap包含一个名为ss的 OLAP 基表其ss分区的id为28672version为4lastRefreshTime为1751439875145毫秒时间戳对应 2025 年 7 月 2 日左右说明该分区已刷新到版本 4lastFileModifiedTime与fileNumber为-1表示这两个字段当前不适用baseExternalTableInfoVisibleVersionMap: {}该物化视图没有外部基表。4.2 判断是否存在待刷新分区当数据湖/数仓中的基表分区有新数据写入后tableToUpdatePartitions会列出对应基表的待刷新分区mysql select inspect_mv_refresh_info(test_mv1)\G *************************** 1. row *************************** inspect_mv_refresh_info(test_mv1): { mvName: test_mv1, mvToRefreshPartitions: [p1], tableToUpdatePartitions: { base_table_1: [p1] }, tablePartitionInfos: { base_table_1: {\p1\:{\id\:28673,\version\:5,\lastRefreshTime\:1751500000000}} }, baseOlapTableVisibleVersionMap: { base_table_1: { p1: {id: 28672, version: 4, lastRefreshTime: 1751439875145, lastFileModifiedTime: -1, fileNumber: -1} } }, baseExternalTableInfoVisibleVersionMap: {} }此时可对比baseOlapTableVisibleVersionMap中已刷新的version: 4与tablePartitionInfos中基表当前version: 5即可确认p1分区因版本落后而进入待刷新集合。五、源码级实现原理5.1 信息采集主流程核心实现位于inspectMVRefreshInfo(Database db, MaterializedView mv)MetaFunctions.java整体流程分为两个阶段阶段一计算物化视图待刷新分区加锁前执行MvUpdateInfo mvUpdateInfo MvRefreshArbiter.getMVTimelinessUpdateInfo( mv, MVTimelinessArbiter.QueryRewriteParams.ofRefresh()); if (mvUpdateInfo.getMVToRefreshType() MvUpdateInfo.MvToRefreshType.FULL) { // 全量刷新场景下分区级追踪为空直接取 MV 实际分区名 mvToRefreshPartitions mv.getPartitionNames(); } else { mvToRefreshPartitions mvUpdateInfo.getMVToRefreshPCells().getPartitionNames(); }源码注释明确说明先在获取锁之前计算待刷新分区以避免在持锁期间执行可能昂贵的远程 IO例如 Iceberg PartitionsTable 扫描。判断逻辑上若刷新类型为FULL全量刷新不做分区级追踪则直接使用物化视图的实际分区名否则使用MVTimelinessArbiter计算的待刷新分区单元PCell分区名。对应的刷新模式参数通过MVTimelinessArbiter.QueryRewriteParams.ofRefresh()构造MVTimelinessArbiter.java表示以刷新而非查询改写的视角评估 MV 时效性。阶段二加锁采集基表信息LockType.READ表锁遍历mv.getBaseTableInfos()获取所有基表对每个基表计算待刷新分区OLAP 基表调用mv.getUpdatedPartitionNamesOfOlapTable(baseTable, false)外部基表调用mv.getUpdatedPartitionNamesOfExternalTable(baseTable, false)两处实现分别位于 MaterializedView.java 与 MaterializedView.java若待刷新分区非空则写入tableToUpdatePartitions通过getTablePartitionInfo(baseTable)采集基表全部分区当前版本信息OLAP 表取各分区visibleVersion与visibleVersionTime外部表经ConnectorPartitionTraits.build(table).getPartitionNameWithPartitionInfo()获取连接器分区信息分别从AsyncRefreshContext读取两类版本映射getBaseTableVisibleVersionMap()OLAP 基表版本映射键为基表 ID再通过tableIdToTableNameMap转换为基表名getBaseTableInfoVisibleVersionMap()外部基表版本映射键为BaseTableInfo通过getReadableString()转换为可读标识组装MVRefreshInfoMeta并调用meta.inspect()内部使用GsonUtils.GSON.toJson序列化输出最后在finally中释放表锁。AsyncRefreshContext的定义见 MaterializedView.java其中baseTableVisibleVersionMap的注释特别指出分区 ID 在 insert overwrite 后可能变化因此使用分区名作为键而BasePartitionInfo中的分区 ID 可用于检测分区是否发生变更。5.2 与同类 meta 函数的协同在同一 MetaFunctions.java 中还定义了另外两个可配合使用的 meta 函数inspect_mv_meta(mv_name)L164返回物化视图的详细元数据mv.inspectMeta()适合查看 MV 定义本身inspect_table_partition_info(table_name)L303返回指定表的分区版本信息复用getTablePartitionInfo实现可用来独立核对某张基表的分区版本。三者配合即可形成完整的MV 状态 基表状态对照视图先看inspect_mv_refresh_info判断差多少再用inspect_table_partition_info核对基表真实分区版本最后用inspect_mv_meta确认 MV 定义与刷新配置。六、典型应用场景与排查技巧6.1 判断物化视图是否需要刷新异步物化视图在基表数据更新后可能处于过期状态。执行SELECT inspect_mv_refresh_info(test_mv1);观察tableToUpdatePartitions为空说明当前无待刷新分区MV 数据为最新非空则说明对应基表分区存在更新可结合REFRESH MATERIALIZED VIEW test_mv1触发刷新。6.2 对比已刷新版本与基表当前版本baseOlapTableVisibleVersionMap记录的是刷新时已消费的版本而tablePartitionInfos记录的是基表当前版本。两者对比可以精确判断版本一致 → 该分区数据已同步版本落后 → 该分区有增量数据待刷新分区 ID 变化 → 该分区经历过 insert overwrite 等重建操作。6.3 外部基表数据湖刷新状态核查对于基于 Hive/Iceberg/Paimon 等外部表构建的物化视图baseExternalTableInfoVisibleVersionMap会展示外部基表的已刷新版本映射。注意外部表条目的id固定为-1其版本信息以连接器提供的分区修改时间/版本为准fromExternalTable中直接透传info.getVersion()与info.getModifiedTime()不做有损换算。6.4 注意事项该函数仅对物化视图有效对普通表调用会返回错误xxx is not materialized view函数执行时会申请LockType.READ表锁属于轻量级只读诊断操作但对待刷新分区的计算发生在加锁之前以规避扫描 Iceberg 等外部目录时的长耗时持锁返回值为 JSON 字符串在复杂解析场景下可配合 SQL 字符串函数或客户端 JSON 工具进一步处理该函数为 meta 函数属于系统诊断能力生产环境使用前建议在测试库中先行验证输出格式。七、小结inspect_mv_refresh_info是 StarRocks 异步物化视图运维中定位刷新落后问题的高效诊断工具。通过一条 SELECT 即可拿到物化视图待刷新分区tableToUpdatePartitions、OLAP 基表已刷新版本映射baseOlapTableVisibleVersionMap与外部基表已刷新版本映射baseExternalTableInfoVisibleVersionMap再配合inspect_table_partition_info与inspect_mv_meta即可形成从基表数据变更到MV 刷新状态的完整可观测闭环。其底层实现见 MetaFunctions.java通过MVTimelinessArbiter评估刷新时效性、以AsyncRefreshContext维护版本映射并在锁外完成昂贵的分区扫描计算兼顾了诊断信息的完整性与集群操作的轻量性。【免费下载链接】starrocksThe worlds fastest open query engine for sub-second analytics both on and off the data lakehouse. With the flexibility to support nearly any scenario, StarRocks provides best-in-class performance for multi-dimensional analytics, real-time analytics, and ad-hoc queries. A Linux Foundation project.项目地址: https://gitcode.com/GitHub_Trending/st/starrocks创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表