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

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

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

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

刷新条件

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

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

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

刷新流程

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

第一次触发刷新的时候是不会带上周期(比如时间范围),然后根据过滤计算出来的周期,默认情况下只会使用第一个周期(我们可以通过 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 将它排除掉了。

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

参考链接:

StarRocks 物化视图刷新流程及原理的更多相关文章

  1. 物化视图刷新慢--有可能是mv log被多个mv使用造成的

    同事说物化视图刷新慢,经检生产环境,发现部分物化视图刷新慢的原因是:由于同一个物化视图日志(mv log)被多个物化视图(mv)使用,不同的物化视图(mv)使用不同的刷新间隔,导致物化视图日志(mv ...

  2. 解决oracle 物化视图刷新失败

    oracle 物化视图刷新失败可能原因: 1.视图未建立物化视图日志 2.基表为授权给用户 1.物化视图语法 create materialized view [view_name] refresh ...

  3. [转]数据库物化视图刷新SQL命令和查询被delete掉的数据

    原文地址:http://blog.csdn.net/wangyong191212/article/details/8024161 刷新物化视图的SQL命令: 在sql语句的命令窗口并输入如下命令: e ...

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

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

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

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

  6. 42.oracle物化视图

    写在前面 先大概列一下数据库表设计的常规流程.方案.要遵循的规则 根据业务切分设计表 逻辑分层(数据库分层) 数据库结构设计与拆分:水平拆分(mysql分片)oracle分区物化视图中间表设计方案 优 ...

  7. ORACLE物化视图具体解释

    一.物化的一般使用方法物化视图是一种特殊的物理表,"物化"(Materialized)视图是相对普通视图而言的.普通视图是虚拟表.应用的局限性大,不论什么对视图的查询.oracle ...

  8. calcite物化视图详解

    概述 物化视图和视图类似,反映的是某个查询的结果,但是和视图仅保存SQL定义不同,物化视图本身会存储数据,因此是物化了的视图. 当用户查询的时候,原先创建的物化视图会注册到优化器中,用户的查询命中物化 ...

  9. Oracle数据库入门——物化视图日志结构

    物化视图的快速刷新要求基本必须建立物化视图日志,这篇文章简单描述一下物化视图日志中各个字段的含义和用途. 物化视图日志的名称为MLOG$_后面跟基表的名称,如果表名的长度超过20位,则只取前20位,当 ...

  10. Oracle 物化视图 说明

    一.    物化视图概述 Oracle的物化视图是包括一个查询结果的数据库对像,它是远程数据的的本地副本,或者用来生成基于数据表求和的汇总表.物化视图存储基于远程表的数据,也可以称为快照. 物化视图可 ...

随机推荐

  1. linux下开发编辑器vim常用指令

    1.vim的3种模式:编辑模式.插入模式.命令行模式(最后一行模式) 编辑模式:对代码的修改(复制.粘贴.剪切 插入模式:用户编辑代码等等) 命令行模式:保存 退出 另存为等 vim3种模式的切换 最 ...

  2. Linux 上的 AppImage、Snap、Flatpak 之间的区别和联系

    AppImage.Snap 和 Flatpak 是三种用于在 Linux 系统上分发和安装软件的包管理格式.它们都有助于解决软件依赖问题,使得应用程序可以在不同的 Linux 发行版上更容易地安装和运 ...

  3. Java 读取命令行输入

    在 Java 中,您可以使用 Scanner 类从命令行读取输入.这个类属于 java.util 包,因此在使用之前您需要导入该包. 下面是一个如何从命令行读取输入的 Java 程序示例: impor ...

  4. CMake构建学习笔记14-依赖库管理工具

    如果说做C/C++开发最大的痛点是什么,那么一定是缺少一个官方的统一的包管理器.认真的说,如果你要用C/C++干点什么,至少需要(Windows系统下): C/C++语言本身.标准库.以及操作系统AP ...

  5. C#自定义控件—文本显示、文本设值

    C#用户控件之文本显示.设定组件 如何绘制一个便捷的文本显示组件.文本设值组件(TextShow,TextSet)? 绘制此控件的目的就是方便一键搞定标签显示(可自定义方法显示文本颜色等),方便自定义 ...

  6. 使用 `Roslyn` 分析器和修复器对.cs源代码添加头部注释

    之前写过两篇关于Roslyn源生成器生成源代码的用例,今天使用Roslyn的代码修复器CodeFixProvider实现一个cs文件头部注释的功能, 代码修复器会同时涉及到CodeFixProvide ...

  7. c++ 命名的强制类型转换

    显式转换:显式将一种类型转换为另一种类型. References: C++中的显示数据类型转换 与命名的强制类型转换相比,旧式的强制类型转换从表现形式上来说不那么清晰明了,容易被看漏,所以一旦转换过程 ...

  8. 商业银行国际结算规模创新高,合合信息AI助力金融行业智能处理多版式文档

    随着我国外贸新业态的快速增长,银行国际结算业务在服务实体经济发展.促进贸易投资便利化进程中发挥了越来越重要的作用.根据中国银行业协会近日发布的<中国贸易金融行业发展报告(2023-2024)&g ...

  9. Asp.net core 学习笔记之 globalization & localization 复习篇

    更新: 2022-03-22 修订版: ASP.NET Core – Globalization & Localization 更新: 2021-06-15 之前有说过, 我没有使用默认的 f ...

  10. ASP.NET Core C# 反射 & 表达式树 (第三篇)

    前言 前一篇讲完了反射, 这一篇来讲一下和反射息息相关的表达式树. 首先搞清楚 Delegate, Action, Func, Anonymous Method, Lambda, Expression ...