最近在为 StarRocks 的物化视图增加多表达式支持的能力,于是便把物化视图(MV)的创建刷新流程完成的捋了一遍。

之前也写过一篇:StarRocks 物化视图刷新流程和原理,主要分析了刷新的流程,以及刷新的条件。

这次从头开始,从 MV 的创建开始来看看 StarRocks 是如何管理物化视图的。

创建物化视图

CREATE
MATERIALIZED VIEW mv_test99
REFRESH ASYNC EVERY(INTERVAL 60 MINUTE)
PARTITION BY p_time
PROPERTIES (
"partition_refresh_number" = "1"
)
AS
select date_trunc("day", a.datekey) as p_time, sum(a.v1) as value
from par_tbl1 a
group by p_time, a.item_id

创建物化视图的时候首先会进入这个函数:com.starrocks.sql.analyzer.MaterializedViewAnalyzer.MaterializedViewAnalyzerVisitor#visitCreateMaterializedViewStatement

其实就是将我们的创建语句结构化为一个 CreateMaterializedViewStatement 对象,这个过程是使用 ANTLR 实现的。

这个函数负责对创建物化视图的 SQL 语句进行语义分析、和基本的校验。

比如:

  • 分区表达式是否正确
  • 基表、数据库这些的格是否正确

校验分区分区表达式的各种信息。

然后会进入函数:com.starrocks.server.LocalMetastore#createMaterializedView()

这个函数的主要作用如下:

  1. 检查数据库和物化视图是否存在

  2. 初始化物化视图的基本信息

    • 获取物化视图的列定义(schema)
    • 验证列定义的合法性
    • 初始化物化视图的属性(如分区信息)。
  3. 处理刷新策略

    • 根据刷新类型(如 ASYNCSYNCMANUALINCREMENTAL)设置刷新方案。
    • 对于异步刷新,设置刷新间隔、开始时间等,并进行参数校验。
  4. 创建物化视图对象

    • 根据运行模式(存算分离和存算一体)创建不同类型的物化视图对象
    • 设置物化视图的索引、排序键、注释、基础表信息等。
  5. 处理分区逻辑

    • 如果物化视图是非分区的,创建单一分区并设置相关属性。
    • 如果是分区的,解析分区表达式并生成分区映射关系
  6. 绑定存储卷

    • 如果物化视图是云原生类型,绑定存储卷。

序列化关键数据

对于一些核心数据,比如分区表达式、原始的创建 SQL 等,需要再重启的时候可以再次加载到内存里供后续使用时;

就需要将这些数据序列化到元数据里。

这些数据定期保存在 fe/meta 目录中。

我们需要序列化的字段需要使用 @SerializedName注解。

@SerializedName(value = "partitionExprMaps")
private Map<ExpressionSerializedObject, ExpressionSerializedObject> serializedPartitionExprMaps;

同时在 com.starrocks.catalog.MaterializedView#gsonPreProcess/gsonPostProcess 这两个函数中将数据序列化和反序列化。

元数据的同步与加载

当 StarRocks 的 FE 集群部署时,会由 leader 的 FE 启动一个 checkpoint 线程,定时扫描当前的元数据是否需要生成一个 image.${JournalId} 的文件。

其实就是判断当前日志数量是否达到上限(默认是 5w)生成一次。

具体的流程如下:



更多元数据同步和加载流程可以查看我之前的文章:深入理解 StarRocks 的元数据管理

刷新物化视图

创建完成后会立即触发一次 MV 的刷新逻辑。

同步分区



刷新 MV 的时候有一个很重要的步骤:同步 MV 和基表的分区

这个步骤在每次刷新的时候都会做,只是如果基表分区和 MV 相比没有变化的话就会跳过。

这里我们以常用的 Range 分区为例,核心的函数为:com.starrocks.scheduler.mv.MVPCTRefreshRangePartitioner#syncAddOrDropPartitions

它的主要作用是同步物化视图的分区,添加、删除分区来保持 MV 的分区与基础表的分区一致;核心流程:

  1. 计算分区差异:根据指定的分区范围,计算物化视图与基础表之间的分区差异。
  2. 同步分区:
    1. 删除旧分区:删除物化视图中与基础表不再匹配的分区。
    2. 添加新分区:根据计算出的差异,添加新的分区到物化视图。

分区同步完成之后就可以计算需要刷新的分区了:

以上内容再结合之前的两篇文章:

就可以将整个物化视图的创建与刷新的核心流程掌握了。

StarRocks 物化视图创建与刷新全流程解析的更多相关文章

  1. 定位导致物化视图无法快速刷新的原因 分类: H2_ORACLE 2013-08-08 23:04 335人阅读 评论(0) 收藏

    转载自:http://yangtingkun.itpub.net/post/468/13318 物化视图的快速刷新采用了增量的机制,在刷新时,只针对基表上发生变化的数据进行刷新.因此快速刷新是物化视图 ...

  2. Oracle数据库入门——如何根据物化视图日志快速刷新物化视图

    Oracle物化视图的快速刷新机制是通过物化视图日志完成的.Oracle如何通过一个物化视图日志就可以支持多个物化视图的快速刷新呢,本文简单的描述一下刷新的原理. 首先,看一下物化视图的结构:SQL& ...

  3. oracle物化视图创建及删除

    --删除物化表的日志表 DROP MATERIALIZED VIEW LOG ON 表名; --为将要创建物化视图的表添加带主键的日志表 CREATE MATERIALIZED VIEW LOG ON ...

  4. oracle 11g 使用物化视图远程增量刷新数据

    ① 源数据库建立物化视图日志 drop MATERIALIZED VIEW LOG ON ORG_BASEINFO/ CREATE MATERIALIZED VIEW LOG ON ORG_BASEI ...

  5. Oracle 物化视图创建

    create materialized view MV_XXXXrefresh fast on commitwith rowidenable query rewriteasselect * from ...

  6. Oracle 物化视图创建以及常见问题

    create materialized view MV_XXXXrefresh fast on commitwith rowidenable query rewriteasselect * from ...

  7. 【Spring】容器刷新(refresh)流程解析

    一.概述 二.prepareRefresh() 三.obtainFreshBeanFactory() 四.prepareBeanFactory(beanFactory); 五.postProcessB ...

  8. Sift算子特征点提取、描述及匹配全流程解析

    Sift之前的江湖 在Sift横空出世之前,特征点检测与匹配江湖上占据霸主地位的是角点检测家族.先来探究一下角点家族不为人知的恩怨情仇. 角点家族的族长是Moravec在1977年提出的Moravec ...

  9. Oracle物化视图的创建及使用

    oracle物化视图 一.oracle物化视图基本概念  物化视图首先需要创建物化视图日志,  oracle依据用户创建的物化视图日志来创建物化视图日志表,  物化视图日志表的名称为mlog$_后面跟 ...

  10. Oracle 10g通过创建物化视图实现不同数据库间表级别的数据同步

    摘自:http://blog.csdn.net/javaee_sunny/article/details/53439980 目录(?)[-] Oracle 10g 物化视图语法如下 实例演示 主要步骤 ...

随机推荐

  1. 【Windows】如何关闭Windows10、Windows11自动更新

    如何关闭Windows10自动更新 零.问题 Windows10老是自动更新,有时候第二天起来又得重新打开软件,真麻烦,Win10自动更新的时候还有点卡. 如何关闭? 经过上网查询,发现完全关闭难度比 ...

  2. 使用 gitee 托管你的 go 模块

    前言 实话实说, github 作为这个球上顶级的代码托管平台, 公司/企业/开发者的认可和参与度是非常高的. 但是因为某些原因 特色墙, 国内使用 github 的体验不是非常好 速度慢 不靠谱同学 ...

  3. javascript 数值交换技巧

    需求 现在存在var a = 1,b = 2;,要求使用javascript实现a & b数值的交换,让a = 2,b = 1. 中间变量(常规实现方式) var a = 1, b = 2; ...

  4. 机器人SLAM导航书重磅来袭

    机器人SLAM导航书重磅来袭 互联网和人工智能技术可以看成是对人类大脑的进一步延展,而机器人技术则可以看成是对人类躯体的进一步延展.如果人工智能技术仅仅停留在虚拟的网络和数据之中,那么其挖掘并利用新知 ...

  5. FastAPI中实现动态条件必填字段的实践

    title: FastAPI中实现动态条件必填字段的实践 date: 2025/04/03 00:06:20 updated: 2025/04/03 00:06:20 author: cmdragon ...

  6. 洛谷 - B4276 [蓝桥杯青少年组国赛 2023] 八进制回文平方数 - 题解

    题目传送门 主要思路 首先,这道题范围在 \(10^9\),我们不可能直接从 \(1\) 循环到 \(N\).我们不难看出,这道题是求平方数的八进制是否回文,那些不是平方数的例如 \(2\) 呀,\( ...

  7. Python 潮流周刊#96:MCP 到底是什么?(摘要)

    本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...

  8. 🎀腾讯云nodejs SDK打包体积过大吐槽事件

    简介 2025年2月1日有位开发同学batchor在GitHub上提出了issue(你们是把***打包了吗?)对腾讯云Node.js的SDK打包体积过大进行吐槽(言语偏贴吧风格略显激进),SDK打包体 ...

  9. 宽带带宽和网速的关系,为什么1m等于128kb

    带宽单位是:b(比特/位) 网速单位/文件下载上传单位:B(字节) 所以,1Mbps = 1/8Mbps = 128kb/s

  10. CF1573B题解

    题意: 对于给定的序列 aA1,aA2,-,aAna_{A1},a_{A2},-,a_{An}aA1​,aA2​,-,aAn​.bB1,bB2,-,bBnb_{B1},b_{B2},-,b_{Bn}b ...