StarRocks 物化视图创建与刷新全流程解析
最近在为 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()
这个函数的主要作用如下:
检查数据库和物化视图是否存在。
初始化物化视图的基本信息:
- 获取物化视图的列定义(schema)
- 验证列定义的合法性
- 初始化物化视图的属性(如分区信息)。
处理刷新策略:
- 根据刷新类型(如
ASYNC
、SYNC
、MANUAL
或INCREMENTAL
)设置刷新方案。 - 对于异步刷新,设置刷新间隔、开始时间等,并进行参数校验。
- 根据刷新类型(如
创建物化视图对象:
- 根据运行模式(存算分离和存算一体)创建不同类型的物化视图对象
- 设置物化视图的索引、排序键、注释、基础表信息等。
处理分区逻辑:
- 如果物化视图是非分区的,创建单一分区并设置相关属性。
- 如果是分区的,解析分区表达式并生成分区映射关系
绑定存储卷:
- 如果物化视图是云原生类型,绑定存储卷。
- 如果物化视图是云原生类型,绑定存储卷。
序列化关键数据
对于一些核心数据,比如分区表达式、原始的创建 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 的分区与基础表的分区一致;核心流程:
- 计算分区差异:根据指定的分区范围,计算物化视图与基础表之间的分区差异。
- 同步分区:
- 删除旧分区:删除物化视图中与基础表不再匹配的分区。
- 添加新分区:根据计算出的差异,添加新的分区到物化视图。
分区同步完成之后就可以计算需要刷新的分区了:
以上内容再结合之前的两篇文章:
就可以将整个物化视图的创建与刷新的核心流程掌握了。
StarRocks 物化视图创建与刷新全流程解析的更多相关文章
- 定位导致物化视图无法快速刷新的原因 分类: H2_ORACLE 2013-08-08 23:04 335人阅读 评论(0) 收藏
转载自:http://yangtingkun.itpub.net/post/468/13318 物化视图的快速刷新采用了增量的机制,在刷新时,只针对基表上发生变化的数据进行刷新.因此快速刷新是物化视图 ...
- Oracle数据库入门——如何根据物化视图日志快速刷新物化视图
Oracle物化视图的快速刷新机制是通过物化视图日志完成的.Oracle如何通过一个物化视图日志就可以支持多个物化视图的快速刷新呢,本文简单的描述一下刷新的原理. 首先,看一下物化视图的结构:SQL& ...
- oracle物化视图创建及删除
--删除物化表的日志表 DROP MATERIALIZED VIEW LOG ON 表名; --为将要创建物化视图的表添加带主键的日志表 CREATE MATERIALIZED VIEW LOG ON ...
- oracle 11g 使用物化视图远程增量刷新数据
① 源数据库建立物化视图日志 drop MATERIALIZED VIEW LOG ON ORG_BASEINFO/ CREATE MATERIALIZED VIEW LOG ON ORG_BASEI ...
- Oracle 物化视图创建
create materialized view MV_XXXXrefresh fast on commitwith rowidenable query rewriteasselect * from ...
- Oracle 物化视图创建以及常见问题
create materialized view MV_XXXXrefresh fast on commitwith rowidenable query rewriteasselect * from ...
- 【Spring】容器刷新(refresh)流程解析
一.概述 二.prepareRefresh() 三.obtainFreshBeanFactory() 四.prepareBeanFactory(beanFactory); 五.postProcessB ...
- Sift算子特征点提取、描述及匹配全流程解析
Sift之前的江湖 在Sift横空出世之前,特征点检测与匹配江湖上占据霸主地位的是角点检测家族.先来探究一下角点家族不为人知的恩怨情仇. 角点家族的族长是Moravec在1977年提出的Moravec ...
- Oracle物化视图的创建及使用
oracle物化视图 一.oracle物化视图基本概念 物化视图首先需要创建物化视图日志, oracle依据用户创建的物化视图日志来创建物化视图日志表, 物化视图日志表的名称为mlog$_后面跟 ...
- Oracle 10g通过创建物化视图实现不同数据库间表级别的数据同步
摘自:http://blog.csdn.net/javaee_sunny/article/details/53439980 目录(?)[-] Oracle 10g 物化视图语法如下 实例演示 主要步骤 ...
随机推荐
- Oracle return exit continue
常在循环体中看到下面3种语句: return exit continue 举例说明 啥都没有 -- none begin for i in 1 .. 10 loop if i < 5 then ...
- BotSharp + MCP 三步实现智能体开发
1. 简介 1.1 什么是MCP Model Context Protocol(MCP)模型上下文协议是一种标准化协议,它让大模型能够更容易地和外部的数据.工具连接起来.你可以把MCP想象成一个通用的 ...
- mybatis报错Cause: java.lang.IllegalArgumentException: invalid comparison: java.util.ArrayList and java
原因 传入参数为List<String>不能用lists != '' 判断 解决 将lists != '' 的判断去掉或者改为lists .size>0 其他 如果是Integer类 ...
- 干货分享!MCP 实现原理,小白也能看懂
不知道大家有没有发现?对于添加到 MCP 服务市场的成千上万个 MCP 服务(而且这个数字每天还在增加),我们可以不写一行代码,轻松实现调用,但背后的原因究竟是啥呢? MCP 虽然用起来很方便,但搞不 ...
- UTC时间与正常时间相互转换的shell脚本
UTC时间转换的shell脚本 前言 摸鱼感想 昨天被UTC时间,系统时间的转换的代码绕得有点晕, 最后,不饶了,我当天的任务是搞一个嵌入式测试而已!!!开摆! 于是在网上找了半天没找到合适的时间转换 ...
- MySQL安装入门第一篇
[1]MySQL的版本:近期主要历史版本有5.0/5.1/5.5/5.6/5.7,目前最新版本是MySQL8.6.0曾经是个内部试验版本,已取消了. MySQL8.0的版本历史 1) 2016-09- ...
- CTF实验吧加了料的报错注入
实验吧地址 http://ctf5.shiyanbar.com/web/baocuo/index.php F12审查元素发现源码中的提示是这样一整句的查询 基本确定此题为一个SQL注入 /# = un ...
- Web前端入门第 44 问:CSS 循环动画 animation 效果演示
相关属性 @keyframes 定义动画的关键帧序列 animation-name 指定 @keyframes 动画的名称 animation-duration 动画单次循环的持续时间(必需属性,否则 ...
- 【笔记】reko 0.10.2 反编译工具安装和使用记录|(2) user‘s guide
Reko user's guide Reko是一个二进制可执行文件的反编译器.它接受输入的一个或多个二进制可执行文件,然后反编译成高级语言.它可以在GUI shell中被交互地使用,作为一个命令行项目 ...
- RISC介绍
CPU中包含了控制部件和运算部件,即中央处理器.1971 年,Intel 将运算器和控制器集成在一个芯片上,称为 4004 微处理器,这标志着 CPU 的诞生.到了 1978 年,开发的 8086 处 ...