当前位置: 首页 > news >正文

Starrocks异步物化视图的使用以及注意事项

最近在使用starrocks来进行实时数据项目的开发,尝试使用了一下starrocks的异步物化视图。
使用版本: 3.1.2-4f3a2ee

创建三个测试表, 注意只有test_mv_table1为分区表,其他两个都是非分区表:

CREATE TABLE `test_mv_table1` (`periodday` DATE NOT NULL COMMENT "",`fid` varchar(44) NOT NULL COMMENT "",`fnumber` int NULL COMMENT ""
) ENGINE=OLAP
PRIMARY KEY(`periodday`, `fid`)
COMMENT "数据1-分区"
PARTITION BY date_trunc('month', `periodday`)
DISTRIBUTED BY HASH(`fid`)
ORDER BY(`fid`, `fnumber`)
PROPERTIES ("replication_num" = "3","in_memory" = "false","enable_persistent_index" = "false","replicated_storage" = "true"
);CREATE TABLE `test_mv_table2` (`fid` varchar(44) NOT NULL COMMENT "",`fnumber` int NULL COMMENT ""
) ENGINE=OLAP
PRIMARY KEY(`fid`)
COMMENT "数据2-明细"
DISTRIBUTED BY HASH(`fid`)
ORDER BY(`fid`, `fnumber`)
PROPERTIES ("replication_num" = "3","in_memory" = "false","enable_persistent_index" = "false","replicated_storage" = "true"
);CREATE TABLE `test_mv_table3` (`fid` varchar(44) NOT NULL COMMENT "",`fnumber` int NULL COMMENT ""
) ENGINE=OLAP
PRIMARY KEY(`fid`)
COMMENT "数据3-明细"
DISTRIBUTED BY HASH(`fid`)
ORDER BY(`fid`, `fnumber`)
PROPERTIES ("replication_num" = "3","in_memory" = "false","enable_persistent_index" = "false","replicated_storage" = "true"
);

分别在三张表中插入初始化数据:

insert into test_mv_table1 (periodday, fid, fnumber) values
("2023-09-01", "aaa", 111),
("2023-09-02", "bbb", 222),
("2023-09-03", "ccc", 333),
("2023-10-01", "aaa", 111),
("2023-10-02", "bbb", 222),
("2023-10-03", "ccc", 333),
("2023-11-01", "aaa", 111),
("2023-11-02", "bbb", 222),
("2023-11-03", "ccc", 333);insert into test_mv_table2 (fid, fnumber) values
("aaa", 666),
("bbb", 777),
("ccc", 888);insert into test_mv_table3 (fid, fnumber) values
("aaa", 22200),
("bbb", 33300),
("ccc", 44400);

创建物化视图,物化视图的分区只能对应一个基表:

CREATE MATERIALIZED VIEW view_mv_test
COMMENT 'test-物化视图'
PARTITION BY `periodday`
DISTRIBUTED BY HASH(`fnumber`)
REFRESH ASYNC
PROPERTIES ("replication_num" = "3","excluded_trigger_tables"="test_mv_table2,test_mv_table3","session.exec_mem_limit"="9147483648","session.query_timeout"="259000","session.new_planner_optimize_timeout"="5000","session.parallel_fragment_exec_instance_num"="10"
)
AS
selecta.periodday as periodday,b.fnumber as fnumber,a.fid as fid,now() as insert_time
from test_mv_table1 a
left join test_mv_table2 b
on a.fid = t.fid
inner join test_mv_table3 c
on a.fid = c.fid
and b.fid = c.fid
;

注意这里创建的是自动刷新,也可以创建为定时刷新:

CREATE MATERIALIZED VIEW view_mv_test
COMMENT 'test-物化视图'
PARTITION BY `periodday`
DISTRIBUTED BY HASH(`fnumber`)
REFRESH ASYNC START('2023-11-20 10:00:00') EVERY (interval 1 minute) 
PROPERTIES ("replication_num" = "3","excluded_trigger_tables"="test_mv_table2,test_mv_table3","session.exec_mem_limit"="9147483648","session.query_timeout"="259000","session.new_planner_optimize_timeout"="5000","session.parallel_fragment_exec_instance_num"="10"
)
AS
selecta.periodday as periodday,b.fnumber as fnumber,a.fid as fid,now() as insert_time
from test_mv_table1 a
left join test_mv_table2 b
on a.fid = t.fid
inner join test_mv_table3 c
on a.fid = c.fid
and b.fid = c.fid
;

创建完成后,数据会进行初始化计算

小结:

  • 基表有刷新了,物化视图进行刷新(前提是 test_mv_table2 和 test_mv_table3都没有变更的情况下,物化视图刷新对应的分区)
  • 如果 test_mv_table2 和 test_mv_table3 存在变更,test_mv_table1基表未发生变更,此时不会触发刷新
  • 但是等到 test_mv_table1基表 发生变更的时候,会触发物化视图的全量刷新
  • 如果我只想让物化视图跟随基表的分区变化而刷新对应的分区,不管 test_mv_table2 和 test_mv_table3 的变更,这样该怎么实现呢?目前好像不支持

参考文档: https://docs.starrocks.io/zh-cn/latest/using_starrocks/data_modeling_with_materialized_views
通过物化视图将事实表和多个维度表进行关联:

  • 您需要在物化视图的分区键中指定特定基表(通常是事实表)的分区键来实现物化视图的分区关联(PARTITION BY fact_tbl.col)。一个物化视图仅能与一个基表做分区关联。
  • 当被关联基表的某个分区中的数据发生变化时,物化视图中相应的分区将被刷新,但不影响其他分区。
  • 当其他未被关联的基表发生变化时,默认情况下会刷新整个物化视图。
    然而,您可以选择忽略某些未关联表中的数据变化,以便在这些表中的数据发生变化时不刷新物化视图。

这种分区关联可以支持多种业务场景:

  • 事实表更新:您可以将事实表分区到细粒度级别,例如按日或按小时。
    在事实表更新后,物化视图中相应的分区将自动刷新。

注意这里,维度表的更新,是会触发整个物化视图的更新的

  • 维度表更新:通常,维度表中的数据更新将导致所有关联结果的刷新,刷新代价较大。
    您可以选择忽略某些维度表中的数据更新,以避免刷新整个物化视图,
    或者您可以指定一个时间范围,从而只有在该时间范围内的分区才能被刷新。
  • 外部表的自动刷新:在类似于 Apache Hive 或 Apache Iceberg 这样的外部数据源中,
    数据往往以分区的粒度进行变更。
    StarRocks 的物化视图可以订阅外表分区级别的数据更新,只刷新物化视图的相应分区。
  • TTL:在为物化视图设置分区策略时,您可以设置要保留的最近分区的数量,从而仅保留最新的数据。
    其对应的业务场景对数据时效性有较高要求,例如,分析师仅需要查询某个时间窗口内的最新数据,而无需保留所有历史数据。
http://www.lryc.cn/news/245959.html

相关文章:

  • SpringBoot整合Sharding-Jdbc实现分库分表和分布式全局id
  • 「江鸟中原」有关HarmonyOS-ArkTS的Http通信请求
  • vuex的使用笔记
  • 汇编:关于栈的知识
  • uniapp使用map标签
  • MacOS14 Sonoma 安装 Flutter 开发环境
  • 【Web】PHP反序列化刷题记录
  • C++标准模板库 STL 简介(standard template library)
  • Linux篇:文件系统
  • AI - Crowd Simulation(集群模拟)
  • <JavaEE> Java中线程有多少种状态(State)?状态之间的关系有什么关系?
  • 正则表达式 通配符 awk文本处理工具
  • 三、ts高级笔记,
  • 二十一、数组(6)
  • flask依据现有的库表快速生成flask实体类
  • .NET6 开发一个检查某些状态持续多长时间的类
  • 链表K个节点的组内逆序调整问题
  • 安卓隐私指示器学习笔记
  • 【Jenkins】jenkins发送邮件报错:Not sent to the following valid addresses:
  • CSS3制作3D爱心动画
  • Python Opencv实践 - 全景图片拼接stitcher
  • echarts 几千条分钟级别在小时级别图标上展示
  • 操作系统的中断与异常(408常考点)
  • linux下的工具---vim
  • 代码随想录算法训练营第六十天|84. 柱状图中最大的矩形
  • P14 C++局部静态变量static延长生命周期
  • C语言:写一个函数,求字符串的长度,在main函数中输入字符串并输出其长度(指针)
  • CentOS7安装Docker运行环境
  • 单片机调试技巧--栈回溯
  • 分布式锁之基于redis实现分布式锁(二)