StarRocks information_schema.materialized_views 系统表:物化视图全量状态与刷新元数据详解
StarRocks information_schema.materialized_views 系统表物化视图全量状态与刷新元数据详解【免费下载链接】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/starrocksmaterialized_views是 StarRocksinformation_schema库中一张描述集群内**所有物化视图Materialized View**的元数据系统表覆盖同步物化视图rollup与异步物化视图ASYNC两类对象是 DBA 与平台开发者做物化视图资产盘点、刷新任务排障、查询改写Query Rewrite状态审计的核心入口。本文以官方文档为骨架结合 FE 侧源码MaterializedViewsSystemTable.java、ShowMaterializedViewStatus.java 等逐字段讲解其含义、取值与底层生成逻辑帮助你熟练用一条 SQL 掌握全部物化视图的健康度与刷新历史。一、表是什么一张表、两类物化视图、三种关键状态从源码看materialized_views是一张由 FE 端驱动的 Schema 系统表SystemTable通过 thrift 接口SCH_MATERIALIZED_VIEWS对外暴露。查询时 FE 会遍历本地元数据LocalMetastore中的数据库与表并按对象类型分两条路径收集状态异步物化视图表类型为MATERIALIZED_VIEW读取MaterializedView对象的刷新方案、活动状态、查询改写校验结果并结合调度器TaskManager的历史任务运行记录TaskRunStatus汇总出最近一次刷新任务的完整信息同步物化视图表类型为OLAP表上的MaterializedIndexMeta仅填充少量字段见下文“同步物化视图”小节。因此这张表天然适合回答三类问题有哪些物化视图、属于哪个库、由谁创建、定义 SQL 是什么资产盘点最近一次刷新是否成功、耗时多久、刷了哪些分区、报了什么错任务排障物化视图是否可用于查询改写、为什么不能改写优化器诊断。二、完整字段清单与含义官方文档全量继承下表完整列出materialized_views提供的全部字段。其中与刷新相关的字段仅在存在最近一次刷新任务记录时才有值同步物化视图大多为空。字段说明MATERIALIZED_VIEW_ID物化视图的 ID。TABLE_SCHEMA物化视图所在的数据库。TABLE_NAME物化视图的名称。REFRESH_TYPE物化视图的刷新类型。有效值SYNC同步物化视图和ASYNC异步物化视图无论刷新如何触发。当值为SYNC时所有与激活状态和刷新相关的字段均为空刷新方式见REFRESH_TRIGGER与REFRESH_POLICY。IS_ACTIVE物化视图是否处于激活状态。处于非激活inactive状态的物化视图无法被刷新或查询。INACTIVE_REASON物化视图处于非激活状态的原因。PARTITION_TYPE物化视图的分区策略类型。TASK_ID负责刷新该物化视图的任务 ID。TASK_NAME负责刷新该物化视图的任务名称。LAST_REFRESH_START_TIME最近一次刷新任务的开始时间。LAST_REFRESH_FINISHED_TIME最近一次刷新任务的结束时间。LAST_REFRESH_DURATION最近一次刷新的墙钟耗时秒等于最后一次任务运行的结束时间减去首次任务运行的处理开始时间。与materialized_view_refresh_jobs.DURATION_TIME对该任务取值一致。LAST_REFRESH_STATE最近一次刷新任务的状态。LAST_REFRESH_FORCE_REFRESH最近一次刷新任务是否为强制刷新。LAST_REFRESH_START_PARTITION最近一次刷新任务的起始分区。LAST_REFRESH_END_PARTITION最近一次刷新任务的结束分区。LAST_REFRESH_BASE_REFRESH_PARTITIONS最近一次刷新任务涉及的基础表分区。LAST_REFRESH_MV_REFRESH_PARTITIONS最近一次刷新任务中实际刷新的物化视图分区。LAST_REFRESH_ERROR_CODE最近一次刷新任务的错误码。LAST_REFRESH_ERROR_MESSAGE最近一次刷新任务的错误信息。TABLE_ROWS物化视图的数据行数基于后台近似统计。MATERIALIZED_VIEW_DEFINITION物化视图的 SQL 定义。EXTRA_MESSAGE物化视图的附加信息。QUERY_REWRITE_STATUS物化视图的查询改写状态。CREATOR物化视图的创建者。LAST_REFRESH_PROCESS_TIME最近一次刷新任务的处理时间进程开始时间。LAST_REFRESH_JOB_ID最近一次刷新任务的 Job ID。LAST_REFRESH_TIME物化视图所反映的基础表数据更新截止时间数据版本时间用于新鲜度判断。WAREHOUSE异步物化视图刷新任务所使用的 Warehouse 名称。共享无状态shared-nothing模式下或同步rollup物化视图为空。REFRESH_MODE异步物化视图配置的刷新模式。有效值PCT分区变更追踪只刷新发生变更的分区和INCREMENTAL增量物化视图维护。同步物化视图为空。REFRESH_TRIGGER刷新的触发方式。有效值NONE同步物化视图、MANUAL仅通过REFRESH MATERIALIZED VIEW触发、SCHEDULED按EVERY间隔周期性触发、ON_BASE_TABLE_CHANGE基础表发生数据加载或变更时自动触发。REFRESH_POLICY人类可读的刷新策略。有效值NONE、MANUAL、ON_BASE_TABLE_CHANGE或形如START(yyyy-MM-dd HH:mm:ss) EVERY(INTERVAL n unit)的调度表达式仅当定义了开始时间时才会包含START子句。RESOURCE_GROUP物化视图刷新任务使用的资源组来自物化视图的resource_group属性。未设置时默认为default_mv_wg。QUERY_REWRITE_STATUS_REASONQUERY_REWRITE_STATUS背后的原因。有效值OK、MV_INACTIVE、QUERY_REWRITE_DISABLED、UNSUPPORTED_DEFINITION、UNKNOWN。LAST_FRESHNESS_CONFIRMED_AT最近一次成功刷新的开始时间在整次刷新含全部任务运行完成后记录若刷新发现没有需要应用的基础表变更同样视为确认了新鲜度。物化视图反映的是该时刻之前的基础表数据。与LAST_REFRESH_TIME基础表数据版本时间不同这里是墙钟时间。首次成功刷新前以及同步物化视图为NULL。分区级部分REFRESH不会推进该值。BASE_TABLE_REFRESH_VERSION_TIMES各基础表的数据版本时间是一个 JSON 对象将每个基础表的catalog.database.table名称映射到其观察到的最新数据版本时间。这是LAST_REFRESH_TIME它们共同的最大值背后的逐表明细外部/数据湖基础表报告分区源的修改时间OLAP内部基础表报告可见版本提交时间。当没有任何基础表有记录时间时为{}。该列只在成功刷新时推进失败或跳过的刷新保持不变其时间精度为 1 秒因此同一秒内的写入与刷新无法区分。2.1 同步物化视图的特殊性对于同步rollup 型物化视图源码中通过ShowMaterializedViewStatus.of(dbName, olapTable, indexMeta)单独构造状态关键字段固定取值REFRESH_TYPE恒为SYNCIS_ACTIVE恒为trueREFRESH_TRIGGER、REFRESH_POLICY均为NONE对应文档“所有与激活状态和刷新相关的字段均为空”WAREHOUSE、REFRESH_MODE为空RESOURCE_GROUP固定为默认资源组分区字段与刷新任务相关字段不适用。实现见 ShowMaterializedViewStatus.java。三、基本查询全量与按库/按名过滤materialized_views位于information_schema库可通过标准的SELECT查询并支持在TABLE_SCHEMA、TABLE_NAME列上使用等值过滤条件下推给 FE 求值源码中SUPPORTED_EQUAL_COLUMNS仅包含这两列见 MaterializedViewsSystemTable.java从而避免全量扫描、提升大集群下的查询效率。-- 1. 查看集群内所有物化视图的基本信息 SELECT TABLE_SCHEMA, TABLE_NAME, REFRESH_TYPE, IS_ACTIVE, PARTITION_TYPE, TABLE_ROWS FROM information_schema.materialized_views; -- 2. 查看某个数据库中所有物化视图的刷新策略 SELECT TABLE_NAME, REFRESH_TYPE, REFRESH_TRIGGER, REFRESH_POLICY, REFRESH_MODE, WAREHOUSE, RESOURCE_GROUP FROM information_schema.materialized_views WHERE TABLE_SCHEMA dwd; -- 3. 按物化视图名精确过滤 SELECT * FROM information_schema.materialized_views WHERE TABLE_SCHEMA dwd AND TABLE_NAME mv_order_daily;四、刷新诊断最近一次刷新任务的完整画像刷新相关字段是这张表最有排障价值的部分它们由 FE 将同一刷新 Job 下的一次或多次任务运行TaskRunStatus按创建时间排序后聚合而成ShowMaterializedViewStatus.fromTaskRuns。典型用法-- 找出最近一次刷新失败或尚未完成的物化视图 SELECT TABLE_SCHEMA, TABLE_NAME, TASK_ID, TASK_NAME, LAST_REFRESH_START_TIME, LAST_REFRESH_FINISHED_TIME, LAST_REFRESH_DURATION, LAST_REFRESH_STATE, LAST_REFRESH_ERROR_CODE, LAST_REFRESH_ERROR_MESSAGE FROM information_schema.materialized_views WHERE REFRESH_TYPE ASYNC AND LAST_REFRESH_STATE NOT IN (SUCCESS, MERGED);4.1 几个需要区分的“时间”字段LAST_REFRESH_START_TIMEJob 中首次任务运行的创建时间LAST_REFRESH_PROCESS_TIMEJob 中首次任务运行的处理开始时间真正进入执行阶段的时刻LAST_REFRESH_FINISHED_TIMEJob 中末次任务运行的完成时间仅在整次刷新结束时填充LAST_REFRESH_DURATION末次运行完成时间减去首次运行处理开始时间的墙钟秒数当处理开始时间未知时回退到提交时间并对时钟偏差做非负钳制由getRefreshJobWallClockDurationMs计算与materialized_view_refresh_jobs.DURATION_TIME严格一致源码注释明确二者共享同一口径见 ShowMaterializedViewStatus.javaLAST_REFRESH_TIME物化视图所反映的基础表数据版本时间新鲜度判断基准与墙钟时间无关LAST_FRESHNESS_CONFIRMED_AT最近一次成功刷新全部任务运行完成的墙钟开始时间用于确认“物化视图反映的是这一时刻之前的基础表数据”。4.2 分区级刷新的痕迹当异步物化视图按分区刷新时LAST_REFRESH_START_PARTITION与LAST_REFRESH_END_PARTITION记录本次刷新的分区范围LAST_REFRESH_BASE_REFRESH_PARTITIONS与LAST_REFRESH_MV_REFRESH_PARTITIONS则分别记录基础表侧与物化视图侧实际参与/被刷新的分区。一次刷新产生多次任务运行时这些多值字段在 thrift 侧以|MULTI_TASK_RUN_SEPARATOR连接。配合REFRESH_MODEPCT或INCREMENTAL即可确认分区变更追踪是否按预期只刷新了增量分区。4.3 强制刷新与错误码LAST_REFRESH_FORCE_REFRESH标记最近一次刷新是否为REFRESH MATERIALIZED VIEW ... FORCE式强制刷新LAST_REFRESH_ERROR_CODE与LAST_REFRESH_ERROR_MESSAGE仅在刷新结束后填充前者是最后一次任务运行的错误码后者是对应的错误信息。若刷新为挂起PENDING状态且被清理机制标记失败源码会回退取批次内各子运行完成时间的最大值避免已完成的子任务耗时被丢失见 ShowMaterializedViewStatus.java。五、查询改写状态从 QUERY_REWRITE_STATUS 到原因物化视图的核心价值之一是透明改写加速查询。QUERY_REWRITE_STATUS与QUERY_REWRITE_STATUS_REASON由 FE 对物化视图定义查询计划Query Plan做校验后得出二者共享同一次校验结果源码中特意“只计算一次”避免状态与原因出现不一致见 ShowMaterializedViewStatus.java。对应枚举定义在 MVPlanValidationResult.javaQUERY_REWRITE_STATUS_REASON含义OK定义校验通过可用于查询改写。MV_INACTIVE物化视图处于非激活状态可结合INACTIVE_REASON排查。QUERY_REWRITE_DISABLED物化视图的查询改写开关被关闭如enable_query_rewrite属性为 false。UNSUPPORTED_DEFINITION物化视图的定义 SQL 当前不被改写优化器支持。UNKNOWN校验结果未知源码中该枚举还预留了STALE值当前版本未实际产出。结合IS_ACTIVE与INACTIVE_REASON可以定位“物化视图建好了却不生效”的问题-- 找出所有当前不可用无法刷新/查询/改写的物化视图 SELECT TABLE_SCHEMA, TABLE_NAME, IS_ACTIVE, INACTIVE_REASON, QUERY_REWRITE_STATUS, QUERY_REWRITE_STATUS_REASON FROM information_schema.materialized_views WHERE IS_ACTIVE false OR QUERY_REWRITE_STATUS_REASON OK;需要注意的是IS_ACTIVE false的对象无法被刷新或查询这通常是定义依赖的表被删除、表结构变更或刷新连续失败等场景导致QUERY_REWRITE_DISABLED则属于“配置层面关闭”而非对象损坏。六、刷新策略的底层生成逻辑REFRESH_TRIGGER与REFRESH_POLICY并非独立存储而是由 FE 依据物化视图的刷新方案MvRefreshScheme与异步刷新上下文AsyncRefreshContext动态推导实现在 MaterializedView.java刷新方案类型为SYNC→ 两者均为NONE类型为MANUAL→ 两者均为MANUAL只接受REFRESH MATERIALIZED VIEW手动触发类型为ASYNC且未定义时间步长与时间单位step 0 timeUnit null→ 两者均为ON_BASE_TABLE_CHANGE基础表数据加载/变更时自动触发对应isLoadTriggeredRefresh()判定其余异步场景 →REFRESH_TRIGGER为SCHEDULEDREFRESH_POLICY为人类可读的调度表达式例如START(2025-01-01 00:00:00) EVERY(INTERVAL 1 HOUR)其中START(...)子句仅在创建时定义了开始时间时出现EVERY(INTERVAL n unit)直接来自异步刷新上下文中配置的步长与时间单位。因此用下面这条 SQL 就能一眼看出每个异步物化视图的自动刷新节奏SELECT TABLE_SCHEMA, TABLE_NAME, REFRESH_TRIGGER, REFRESH_POLICY FROM information_schema.materialized_views WHERE REFRESH_TYPE ASYNC;RESOURCE_GROUP字段同理来自物化视图的resource_group表属性未显式配置时回填默认资源组名default_mv_wg见 MaterializedView.java。WAREHOUSE仅在共享数据shared-data模式下、且物化视图配置了 Warehouse 时返回非空值。七、与 SHOW MATERIALIZED VIEWS、materialized_view_refresh_jobs 的关系information_schema.materialized_views与SHOW MATERIALIZED VIEWS命令共享同一套状态生成逻辑ShowMaterializedViewStatus二者字段顺序与口径一致区别在于系统表可以用标准 SQL 做过滤、投影与关联更适合被监控平台与自动化脚本消费。此外表中有两个字段与 materialized_view_refresh_jobs 系统表存在明确的对应关系LAST_REFRESH_DURATION↔materialized_view_refresh_jobs.DURATION_TIME同一刷新任务的耗时口径完全一致可用作两表交叉验证LAST_REFRESH_JOB_ID↔materialized_view_refresh_jobs.JOB_IDJob 级维度StartTaskRunId可按MATERIALIZED_VIEW_ID关联查询。若要查看一个物化视图的多轮历史刷新记录而非仅最近一次应查询materialized_view_refresh_jobsmaterialized_views只保留最近一次刷新的聚合结果。EXTRA_MESSAGE 字段则以 JSON 形式携带最近一次刷新的补充信息如queryIds、是否手动触发isManual、是否同步执行isSync、任务优先级priority、末次任务运行状态lastTaskRunState等可用于还原一次刷新的执行上下文。八、典型实践一条 SQL 完成物化视图健康巡检将以上字段组合起来即可构建一条物化视图健康巡检 SQLSELECT TABLE_SCHEMA, TABLE_NAME, REFRESH_TYPE, IS_ACTIVE, INACTIVE_REASON, QUERY_REWRITE_STATUS, QUERY_REWRITE_STATUS_REASON, LAST_REFRESH_STATE, LAST_REFRESH_FINISHED_TIME, ROUND(LAST_REFRESH_DURATION, 2) AS last_duration_sec, LAST_REFRESH_ERROR_MESSAGE FROM information_schema.materialized_views ORDER BY TABLE_SCHEMA, TABLE_NAME;按输出逐项核对即可完成巡检所有异步物化视图的IS_ACTIVE是否为trueINACTIVE_REASON是否有告警性内容QUERY_REWRITE_STATUS_REASON是否全部为OK非OK项决定改写是否可用LAST_REFRESH_STATE是否为成功状态失败项的LAST_REFRESH_ERROR_CODE/LAST_REFRESH_ERROR_MESSAGE指向具体原因REFRESH_TRIGGER/REFRESH_POLICY是否符合预期的自动刷新节奏是否存在应配置自动刷新却仍为MANUAL的对象LAST_REFRESH_DURATION是否有异常长耗时用于后续调优刷新窗口。九、小结information_schema.materialized_views是 StarRocks 物化视图运维中信息密度最高的一张系统表35 个字段完整覆盖了对象身份、激活状态、分区策略、刷新任务画像、刷新策略推导、查询改写校验与新鲜度确认等维度。理解其字段语义与 FE 侧生成逻辑同步/异步双路径收集、多任务运行聚合、改写状态单一校验来源即可用它搭建可落地的物化视图资产盘点、刷新排障与改写可用性监控体系。更深入的历史任务分析可结合materialized_view_refresh_jobs系统表与SHOW MATERIALIZED VIEWS命令交叉使用。【免费下载链接】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),仅供参考