首页 > 其他分享 >StarRocks 物化视图刷新流程及原理

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

时间:2024-11-19 09:17:54浏览次数:1  
标签:par StarRocks 视图 物化 k1 datekey 刷新 test

前段时间给 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

刷新流程

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 a
         left join test.par_tbl2 b on a.datekey = b.datekey and a.k1 = b.k1
         left 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 a
         left join test.par_tbl2 b on a.datekey = b.datekey and a.k1 = b.k1
         left 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 将它排除掉了。

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

参考链接:

标签:par,StarRocks,视图,物化,k1,datekey,刷新,test
From: https://www.cnblogs.com/crossoverJie/p/18554223

相关文章

  • OSG开发笔记(三十二):深入理解相机视口、制作支持与主视图同步变换旋转的相机HUD
    前言  深入理解相机视口,摸索相机视口旋转功能,背景透明或者不透明。  本篇,实现了一个左下角旋转HUD且背景透明的相机视口。 Demo           HUD相机的坐标  抬头HUD就是通过投影矩阵来实现,具体可参看《OSG开发笔记(二十):OSG使用HUD......
  • 数据库基础(13) . MySQL视图
    1.介绍1.1.什么是视图MySQL中的视图是一种虚拟表,它并不存储实际的数据,而是存储了一条SELECT查询语句的结果集。视图可以简化复杂的查询操作,保护数据,并且可以使数据库结构更加清晰易懂。1.2.视图的作用简化查询:视图可以将复杂的查询包装起来,使得最终用户只需要执行简单......
  • thinkphp6 使用自定义命令,生成数据库视图
    在ThinkPHP命令行工具中,你可以为选项设置别名,通过为选项指定一个简短的别名来简化命令输入。例如,如果你希望--force-recreate选项有一个简短的别名-f,你可以通过在addOption方法中设置第二个参数来实现这一点。示例:为选项设置别名在addOption方法的第二个参数中设置别......
  • HowTo—— Swift2.0在视图中显示地图
    HowTo——Swift2.0在视图中显示地图东坡肘子​ ​关注他 4人赞同了该文章HowTo系列只提供代码和简单的说明,XcodeVersion12.0beta2(12A6163b)Swift2.0中,苹果添加了Map,让开发者可以非常容易的在View中添加需要的地图元素。importSwiftUIimpor......
  • Flask新手教程之- 视图函数的装饰器
    除了@app.route,Flask还支持其他装饰器,用于实现更复杂的功能。 示例:@app.before_request:在每个请求处理之前运行的函数。@app.after_request:在每个请求处理之后运行的函数。@app.teardown_request:在请求结束后运行的函数,用于清理工作。  实例:@app.before_requestd......
  • 界面控件DevExpress WPF中文教程:TreeList视图及创建分配视图
    DevExpressWPF拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpressWPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。无论是Office办公软件的衍伸产品,还是以数据为中心......
  • QT: 操作主从视图及XML
    按钮绑定信号、槽控件属性  运行效果:  connectdlg.h #ifndefCONNECTDLG_H#defineCONNECTDLG_H#include<QDialog>#include<QMessageBox>classQSqlError;namespaceUi{classConnDlg;}classConnDlg:publicQDialog{Q_OBJECTpublic:......
  • 编写starrocks的自定义函数
    编写StarRocks的自定义函数前提条件StarRocks使用udf函数需要满足以下条件:安装jdk1.8开启udf功能,在FE的配置文件fe/conf/fe.conf中设置配置项enable_udf为true,并且重启FE节点使配置生效开发使用UDF函数创建maven项目,并且用java实现udf函数创建maven项目并且添加以......
  • ThinkPHP6,视图的安装及模板渲染和变量赋值
    tp6视图功能由\think\View类配合视图驱动(也即模板引擎驱动)类一起完成,新版仅内置了PHP原生模板引擎(主要用于内置的异常页面输出),如果需要使用其它的模板引擎需要单独安装相应的模板引擎扩展。使用think-template模板引擎,只需要安装think-view模板引擎驱动。composercreate-proje......
  • GA/T1400视图库平台EasyCVR多品牌摄像机视频平台前端监控摄像头镜头的基础知识
    在现代安全监控系统中,摄像机镜头作为捕捉图像的关键组件,其选择和应用直接影响到监控图像的质量和系统的整体性能。随着技术的发展,摄像机镜头的种类和功能也在不断扩展,以适应各种复杂的监控环境和需求。对于相机成像来讲,镜头是不可或缺的一部分,本篇文章在于帮助大家熟悉摄像机镜头......