StarRocks 物化视图刷新流程及原理

news/2024/11/19 9:30:09/文章来源:https://www.cnblogs.com/crossoverJie/p/18554223

前段时间给 StarRocks 的物化视图新增了一个特性,那也是我第一次接触 StarRocks,因为完全不熟悉这个数据库,所以很多东西都是从头开始了解概念。

为了能顺利的新增这个特性(具体内容可以见后文),我需要把整个物化视图的流程串联一遍,于是便有了这篇文章。

在开始之前简单了解下物化视图的基本概念:

image.png

简单来说,视图和 MySQL 这类传统数据库的概念类似,也是用于解决大量消耗性能的 SQL 的,可以提前将这些数据查询好然后放在一张单独的表中,这样再查询的时候性能消耗就比较低了。

刷新条件

为了保证视图数据的实时性,还需要在数据发生变化的时候能够及时刷新视图里的数据,目前有这几个地方会触发视图刷新:
image.png

  • 手动刷新视图,使用 REFRESH MATERIALIZED VIEW order_mv; 语句
  • 将视图设置为 active 状态:ALTER MATERIALIZED VIEW order_mv ACTIVE;
  • 基表数据发生变化时触发刷新。
    • image.png
  • truncate 基表时触发刷新:truncate table trunc_db.t1;
  • drop partition 时触发:ALTER TABLE <tbl_name> DROP PARTITION(S) p0, p1 [, ...];

这里的 truncate table 和 drop partition 目前的版本还存在 bug:当基表和物化视图不在一个数据库时不会触发自动刷新,目前已经修复了。

image.png

  • https://github.com/StarRocks/starrocks/pull/52618
  • https://github.com/StarRocks/starrocks/pull/52295

刷新流程

image.png

如图所示,当触发一次刷新之后主要就是需要计算出需要刷新的分区。

第一次触发刷新的时候是不会带上周期(比如时间范围),然后根据过滤计算出来的周期,默认情况下只会使用第一个周期(我们可以通过 partition_refresh_number 参数来调整单次刷新的分区数量)。

然后如果还有其余的周期,会将这些周期重新触发一次刷新任务(会带上刚才剩余的周期数据),这样进行递归执行。

通过日志会看到返回的分区数据。

新增优化参数

我们在使用物化视图的时候,碰到一个场景:

CREATE TABLE IF NOT EXISTS test.par_tbl1
(datekey DATETIME,k1      INT,item_id STRING,v2      INT
)PRIMARY KEY (`datekey`,`k1`)PARTITION BY date_trunc('day', `datekey`);CREATE TABLE IF NOT EXISTS test.par_tbl2
(datekey DATETIME,k1      INT,item_id STRING,v2      INT
)PRIMARY KEY (`datekey`,`k1`)PARTITION BY date_trunc('day', `datekey`);CREATE TABLE IF NOT EXISTS test.par_tbl3
(datekey DATETIME,k1      INT,item_id STRING,v2      INT
)PRIMARY KEY (`datekey`,`k1`);

但我们有三张基表,其中 1 和 2 都是分区表,但是 3 是非分区表。

此时基于他们新建了一个物化视图:

CREATE
MATERIALIZED VIEW test.mv_test
REFRESH ASYNC
PARTITION BY a_time
PROPERTIES (
"excluded_trigger_tables" = "par_tbl3"
)
AS
select date_trunc("day", a.datekey) as a_time, date_trunc("day", b.datekey) as b_time,date_trunc("day", c.datekey) as c_time
from test.par_tbl1 aleft join test.par_tbl2 b on a.datekey = b.datekey and a.k1 = b.k1left join test.par_tbl3 c on a.k1 = c.k1;

当我同时更新了分区表和非分区表的数据时:

UPDATE `par_tbl1` SET `v2` = 2 WHERE `datekey` = '2024-08-05 01:00:00' AND `k1` = 3;
UPDATE `par_tbl3` SET `item_id` = '3' WHERE `datekey` = '2024-10-01 01:00:00' AND `k1` = 3;

预期的结果是只有 par_tbl1 表里修改的数据会被同步到视图("excluded_trigger_tables" = "par_tbl3"已经被设置为不会触发视图刷新),但实际情况是 par_tbl1par_tbl2 表里所有的数据都会被刷新到物化视图中。

我们可以使用这个 SQL 查询无刷视图任务的运行状态:

SELECT * FROM information_schema.task_runs order by create_time desc;

这样就会造成资源损耗,如果这两张基表的数据非常大,本次刷新会非常耗时。

所以我们的需求是在这样的场景下也只刷新修改的数据。

因此我们在新建物化视图的时候新增了一个参数:

CREATE
MATERIALIZED VIEW test.mv_test
REFRESH ASYNC
PARTITION BY a_time
PROPERTIES (
"excluded_trigger_tables" = "par_tbl3",
"excluded_refresh_tables"="par_tbl3"
)
AS
select date_trunc("day", a.datekey) as a_time, date_trunc("day", b.datekey) as b_time,date_trunc("day", c.datekey) as c_time
from test.par_tbl1 aleft join test.par_tbl2 b on a.datekey = b.datekey and a.k1 = b.k1left join test.par_tbl3 c on a.k1 = c.k1;

这样当在刷新数据的时候,会判断 excluded_refresh_tables 配置的表是否有发生数据变化,如果有的话则不能将当前计算出来的分区(1,2 两张表的全量数据)全部刷新,而是继续求一个交集,只计算基表发生变化的数据。

这样就可以避免 par_tbl1、par_tbl2 的数据全量刷新,而只刷新修改的数据。

这样的场景通常是在关联的基表中有一张字典表,通常数据量不大,所以也不需要分区的场景。

这样在创建物化视图的时候就可以使用这两个参数 excluded_trigger_tables,excluded_refresh_tables 将它排除掉了。

整体的刷新逻辑并不复杂,主要就是几个不同的刷新入口以及刷新过程中计算分区的逻辑。

参考链接:

  • https://docs.starrocks.io/zh/docs/using_starrocks/async_mv/Materialized_view/#理解-starrocks-物化视图
  • https://docs.starrocks.io/zh/docs/using_starrocks/async_mv/use_cases/data_modeling_with_materialized_views/#分区建模
  • https://github.com/StarRocks/starrocks/pull/52295
  • https://github.com/StarRocks/starrocks/pull/52618

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/836653.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

不能用AI解决的RSA题目

RSA基础 e,n是公开钥匙 d是私用钥匙 c是密文 m是明文(包含flag) n = pq d = invert(e, (p-1)(q-1)) m = pow(c, d, n) # 解密 flag = long_to_bytes(m) #转文字1、相邻素数 q = gmpy2.next_prime(p) p和q挨得很近解题代码: from Crypto.Util.number import * from…

人工智能模型训练技术,正则化!

前一篇:《人工智能模型训练技术:随机失活,丢弃法,Dropout》 序言:让人工智能模型变得更“聪明”的方法之一,就是减少“过拟合”(读死书)的问题,从而提升模型的“泛化能力”,也就是它面对新问题时的适应能力。在前面,我们讲解了最常用的“随机丢弃”法,本节将带大家…

AlmaLinux 9.5 正式版发布 - RHEL 二进制兼容免费发行版

AlmaLinux 9.5 正式版发布 - RHEL 二进制兼容免费发行版AlmaLinux 9.5 正式版发布 - RHEL 二进制兼容免费发行版 由社区提供的免费 Linux 操作系统,RHEL 二进制兼容发行版 请访问原文链接:https://sysin.org/blog/almalinux-9/ 查看最新版。原创作品,转载请保留出处。 作者主…

尚硅谷Docker实战教程学习笔记

尚硅谷Docker实战教程学习笔记尚硅谷Docker实战教程学习笔记 我从没想过因为即将要学习dockerfile而激动,也因这激动而顿感羞愧。————20241029 目录尚硅谷Docker实战教程学习笔记写在前面1. Docker简介2. Docker安装3. Docker常用命令4. Docker镜像5. 本地镜像发布到阿里云…

20222405 2024-2025-1 《网络与系统攻防技术》实验五实验报告

1.实验内容 信息搜集是网络攻防的关键环节,通过分析目标系统获取有价值的信息,分为被动收集和主动扫描两种方式。被动收集利用 Google Hacking、WHOIS 等工具从公开资源中提取域名、IP 地址、子域等数据;主动扫描则借助 nmap 等工具识别目标的开放端口、服务及可能存在的漏洞…

京准电钟:北斗卫星同步时钟(NTP授时)助力智慧教育

京准电钟:北斗卫星同步时钟(NTP授时)助力智慧教育京准电钟:北斗卫星同步时钟(NTP授时)助力智慧教育 京准电钟:北斗卫星同步时钟(NTP授时)助力智慧教育 京准电子科技官微——ahjzsz 第一部分 网络时间同步显示系统概述: 医院、学校网络时间同步显示系统是由高精度GPS(…

织梦栏目伪静态出现Request Error!

问题:栏目伪静态出现Request Error! 解决办法:检查出现问题的栏目文件保存目录,确保目录路径末尾没有多余的 /。 将末尾的斜杠去掉,保存后页面访问应恢复正常。扫码添加技术【解决问题】专注中小企业网站建设、网站安全12年。熟悉各种CMS,精通PHP+MYSQL、HTML5、CSS3、Jav…

修改网站是修改源代码吗,了解网站修改的基本概念

什么是网站源代码:网站源代码是指构成网站的所有文件,包括HTML、CSS、JavaScript、PHP等。这些文件共同决定了网站的结构、样式和功能。修改网站的方式:通过后台管理界面:大多数现代网站都使用内容管理系统(CMS),如WordPress、Joomla等。通过后台管理界面,用户可以方便…

公司网站数据库修改软件,如何使用数据库管理软件修改公司网站数据库

使用数据库管理软件可以方便地修改公司网站的数据库。以下是具体步骤:安装数据库管理软件:下载并安装数据库管理软件,如phpMyAdmin、MySQL Workbench等。连接数据库:打开数据库管理软件,输入数据库的连接信息,包括服务器地址、用户名和密码。选择数据库:在数据库管理软件…

织梦网站的小图标修改,如何在织梦CMS中修改网站小图标

修改织梦CMS的网站小图标(Favicon)可以提升网站的视觉效果。以下是具体步骤:准备新的图标文件:准备一个16x16像素或32x32像素的PNG或ICO格式的图标文件。 例如,favicon.ico。上传图标文件:使用FTP工具(如FileZilla)连接到服务器,导航到网站根目录。 将新的图标文件上传…

懂了这个道理,人月神话不再是神话!

本文书接上回《解决DDD最大难题-如何划分领域》,关注公众号(老肖想当外语大佬)获取信息:最新文章更新;DDD框架源码(.NET、Java双平台);加群畅聊,建模分析、技术交流;视频和直播在B站。声明: 本文观点限定在重业务的软件系统研发场景下,其它场景不作为本文讨论的范围…