网易首页 > 网易号 > 正文 申请入驻

多表物化视图的设计与实现

0
分享至

作者:StarRocks Committer 李雪岩,国双科技技术架构师、StarRocks Active Contributor 龚磊(本文为作者在 StarRocks Summit Asia 2022 上的分享)

本文先介绍物化视图的一些需求分析,看看现在的物化视图哪些地方做得好、哪些地方做得不好,然后再针对这些需求进行设计。然后再讲一下具体的实现原理,最后再讲一下 StarRocks 2.5 版本的物化视图还会开发哪些功能。

#01

物化视图的需求分析

1

什么是物化视图

要了解物化视图可以先了解视图的概念。视图是一个虚拟表(也可以认为是一条语句),基于它创建时指定的查询语句返回的结果集。而物化视图则是将这个虚拟表进行实体化,其本身可以理解为是一个特殊的表。

2

物化视图的应用场景

物化视图最常见的场景是,由基础的 Base 表通过创建物化视图的 SQL 生成物化视图,当用户查询相似的 SQL 时,查询优化器可以自动 QueryRewrite 复用物化视图,从而达到查询加速的效果。

在 2.4 之前,我们仅支持的是单表同步的物化视图,但它缺乏一些复杂场景的支持,例如只能支持一些简单的 SQL。

对于一个实时的场景,比如用户有两张实时表进行 Join 操作,由于单表同步物化视图不支持多表 Join 操作,这种场景就无法支持了。

对于离线多表加速建模的场景,通常需要事实表和维度表的 Join 的操作。这里面有两方面的需求,一方面是加速的需求,希望我们在查这些 Base 表时通过 QueryRewrite 加速查询;另一方面是建模的需求,希望物化视图能够屏蔽后面的事实表和维度表,也就是说希望物化视图可以直接进行查询。

还有一类场景,这类场景虽然也可以支持,但是支持得不是很好,就是当物化视图的计算结果比较少的时候,希望分区分桶比较少,这样查询性能才会比较好。之前同步的模型,物化视图与 Base 表是一对一的关系,可能就会出现创建物化视图虽然结果很少,但是分区分桶很多,反而出现查询性能下降的现象。

根据这些场景和问题,接下来我们看看可以怎么去解决这些问题。

#02

物化视图的设计

1

同步解决方案

我们观察到 SQL 复杂度越低,数据的同步性越好做,当 SQL 复杂度越高,数据的同步性越来越难做。之前的同步物化视图,其实是选择了同步性最佳的点,但它的弊端就是 SQL 很复杂的时候很难做。但是用户的大部分场景 SQL 可能是很复杂的,并且可以接受一定的异步延迟,所以可以牺牲一定的同步性,满足复杂 SQL 加速的场景。于是就有了异步刷新的解决方案。

2

异步刷新的解决方案

首先我们看看怎么解决之前的实时场景的问题。在我们使用新版创建物化视图时,可以通过 PARTITION BY 关键字来指定物化视图跟某一个 Base 表的一个分区进行绑定,当前的版本分桶是必填的,但是分桶是可以灵活变化的,然后还可以指定刷新的起始时间点和间隔。

我们创建物化视图语句里面的 Query 语句本身是基本没有任何限制的,可以写得很复杂,只要是可以查询的基本都可行。对于实时的场景,它其实是只刷新某一个分区的小部分数据量。对于实时表,导入非常频繁的,用户可以接受分钟级刷新的场景下,用户可以使用周期性刷新,例如每 1 分钟刷新一次,这样可以避免刷新频率过高导致物化视图刷新触发过于频繁。

然后我们再看看离线的场景,离线场景 Base 表,通常事时表基本上只有每天才会去刷新某一个分区,维表会全量刷新一个分区。这里我们在创建物化视图时,可以指定 REFRESH ASYNC,当每个 Base 表有数据变化的时候,它会自动去判定哪些分区需要刷新并进行智能刷新,对于不需要刷新的分区就不刷新。离线场景也可以支持以天为周期进行调度。离线的场景下由于数据量比较大,有可能查询需要调整一些特殊的 Session Variable 参数才能够刷新成功,这些特殊的参数可以通过 Query 里面的 SELECT hint 来传入。

但是物化视图其是一个需要长期打磨的功能。周期性刷新和触发式刷新覆盖不了所有的场景,有可能用户在不需要刷新的时候,还花费了很多刷新的成本。所以我们提供了一个手动刷新的功能,让用户能灵活地控制刷新的时机,也就是通过指定 REFRESH MANUAL。等到物化视图在后面的版本越来越完善的时候,使用手动刷新的情况会渐渐较少。

另外之前还提到了分区分桶浪费的问题,关于解决这个问题的方法,可以通过指定PARTITION BY DATE_TRUNC("month", dt),这样我们就可以把 dt 这一列本来按天的 Base 表上卷到按月分区的表,从而来减少分区浪费的问题。同时我们也可以指定 Bucket 的数量,而不是跟 Base 表保持一致。这样在物化视图的结果很少的情况下,我们可以灵活减少分区和分桶,从而提高查询性能,避免分区分桶的浪费。

以上讲的这些都是 StarRocks 2.4 已经实现的功能,这些功能是 StarRocks 和社区共同讨论并实现的。在这里要感谢社区的小伙伴们。

#03

物化视图的实现原理

先来了解一下多表物化视图的框架,即数据模型。在早期的版本中,我们实际上支持的是单表同步物化视图,也就是我们基于一个原始表去创建物化视图,实际上物化视图是以索引的形式去存在的。

在左图中可以看到表的基础索引中的 Tablet 和物化视图索引的 Tablet 是一一对应,但是在多表异步的物化视图的框架中,Tablet 不是一一的对应关系,物化视图实际上是以表的模型去做实现的。以右图为例,假设 Base 表有两个 Partition A 和 B,假设物化视图有 Partition C,那么 Partition A、Partition B 的 Tablet 和物化视图的 Partition C 中的 Tablet 是映射关系,这种关系不是一一对应的关系。

再来看一下物化视图的整体框架。我们在新的版本中主要实现了多表异步物化视图,那么就需要一个异步物化视图的调度框架及相应的一些实现逻辑。以上图举例,比如在创建物化视图以及刷新物化视图的时候,我们都需要有对应的 Task,以及 TaskRun 执行单元去做相应的处理。

核心的实现内容实际上包含以下三方面的技术:Task 调度框架、分区刷新维护、Insert Overwrite。Task 调度框架解决的是物化视图异步刷新的问题,分区刷新维护解决的是分区同步增删以及刷新的问题,Insert Overwrite 是刷新中的核心技术。

1

Task 调度框架

首先给大家介绍一下 Task 调度框架。Task 实际上是一个可重用的对象,是任务的存储模板。TaskRun 是其中真正的计算对象,每一个 TaskRun 都是基于 Task 这个模板去做实现的,是计算的最小单元。可以类比成 Java 的 Class,以及 Class 相应的一些实现 Object。在 Task 调度框架中,支持手动刷新、触发式刷新以及周期性刷新等三种刷新方式。

再来看调度框架的核心架构。调度框架包含这几方面的内容,一个是调度器,然后是 Task 和 TaskRun,Pending 队列、Running 队列以及 TaskRun history 集合。以手动刷新任务举例,首先基于 Task 去创建 TaskRun 对象,存放在 Pending 队列中。调度器会取出 Pending 队列中的 TaskRun 做相应的执行,并存放到 Running 队列中,同时会基于 TaskRun 运行的状态,进入到 TaskRun history 集合中。在调度框架中也有一些参数可以配置,比如现在我们队列长度默认是 500,并发数默认是 20,TaskRun 默认是清除是三天以上的历史。有了 Task 框架,我们还需要进行分区的刷新维护。

2

分区刷新维护

在创建物化视图的时候,实际上我们指定了物化视图跟某一个 Base 表分区的绑定关系,刷新框架会在刷新前增删分区,以保证物化视图的分区大于 Base 表绑定的分区。以图中举例,假设我们有这样一个表,它有三个分区 A、B、C,物化视图也有三个分对应的分区 A、B、C,它们是一一对应关系。除了这么种 1:1 的映射关系,实际上其中还有 1:n、n:1 以及 n:n 的映射关系。

有了分区映射关系,就可以基于分区的映射关系去做对应的一些刷新。我们是基于分区的版本去判断哪些分区需要做刷新。以图上举例,假设 Base 表有 1、2、3 三个分区,物化视图也有 1、2、3 三个分区,Base 表分区 1 的版本是 2,物化视图分区 1 的版本也是 2,这个时候我们是不需要去做刷新的。假设 Base 表的分区 2 版本是 4,而物化视图的分区 2 版本是 3,这个时候我们判断需要去做进一步刷新。那么怎么样去做刷新,实际上是依靠于我们底层的 Insert Overwrite 技术。

3

Insert Overwrite

相信有很多同学用过临时分区,实际上 Insert Overwrite 的原理就是内置的这一过程。通常有三个步骤,首先创建一个临时分区,然后把数据写到临时分区,最终将临时分区和目标分区做原子级别的替换。

那么以上是多表异步物化设图的三种核心技术的实现原理。除此我们还需要考虑物化视图失效的问题。

当用户修改 Base 表的结构时,比如删除了 Base 表的一个列时,这个时候物化视图可能会失效。在当前的版本中,物化视图仍然可以查询,但是它不能够被刷新。

以上就是物化视图核心技术实现原理。

上述这些都是 2.4 版本已经实现的功能。StarRocks 2.4 版本是一个预览版本,需要通过设置 FE 参数 enable_experimental_mv 开启使用。

#04

StarRocks 2.5 版本展望

2.4 版本还有三个比较重要的功能没有实现。一是不支持从外表去创建物化视图,2.4 的版本只支持在一个数据 DB 上去创建物化视图,并不支持跨 DB 创建物化视图;二是不支持创建基于物化视图的物化视图;三是还不支持最重要的 QueryRewrite 功能。

2.5 版本会支持物化视图的查询改写,支持从外表创建物化视图,支持从物化视图创建物化视图,支持物化视图 TTL,优化刷新效率、增加部分刷新的语法和配置来应对复杂的刷新问题和各种复杂场景,大家可以尽请期待。

【OSCHINA 2022 中国开源开发者问卷】来啦

你的反馈将有助于反映中国开源的全貌

问卷结尾还可抽取我们的周边好物哦~

期待来自你的反馈!

企业投身开源,挂羊头卖狗肉行不通

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
腾讯有没有被肢解的可能?网友:飞信当年是QQ的最大威胁,决定收费后把自己搞死

腾讯有没有被肢解的可能?网友:飞信当年是QQ的最大威胁,决定收费后把自己搞死

老郭在学习
2024-06-16 23:58:26
不装了?马科斯命令菲律宾军队做好准备,新西兰外长罕见发声

不装了?马科斯命令菲律宾军队做好准备,新西兰外长罕见发声

阿离家居
2024-06-17 05:52:22
笑死了,原来每个省份都有自己的噩梦!果然,人类的悲喜并不相通

笑死了,原来每个省份都有自己的噩梦!果然,人类的悲喜并不相通

小怪吃美食
2024-06-16 18:31:18
甘肃一母亲将4个孩子砍死后服毒自杀,3封遗书令人泪目

甘肃一母亲将4个孩子砍死后服毒自杀,3封遗书令人泪目

莉雅细细谈
2024-02-28 19:58:08
回顾二婚女子带娃相亲被拒,对男子发飙:我吃香得很,还瞧不上你

回顾二婚女子带娃相亲被拒,对男子发飙:我吃香得很,还瞧不上你

佑宛故事汇
2024-06-16 21:28:37
老公花8万买了钻戒,妻子嫌贵去退掉,导购1句话让她含泪选择离婚

老公花8万买了钻戒,妻子嫌贵去退掉,导购1句话让她含泪选择离婚

星辰故事屋
2024-06-17 21:27:04
国足痛失天才球员,国足名宿之子选择为日本效力,成日本豪门核心

国足痛失天才球员,国足名宿之子选择为日本效力,成日本豪门核心

小豆豆赛事
2024-04-24 07:30:46
国运来了挡都挡不住?俄乌战争最起码给中国又争取了五年时间

国运来了挡都挡不住?俄乌战争最起码给中国又争取了五年时间

曾经年少
2024-03-05 11:38:53
突然换帅!正式决定退出CBA!中国男篮又一个新时代开启……

突然换帅!正式决定退出CBA!中国男篮又一个新时代开启……

篮球实战宝典
2024-06-09 18:02:40
1988年,于凤至晚年在美国别墅里的珍贵留影

1988年,于凤至晚年在美国别墅里的珍贵留影

视点历史
2024-06-15 18:11:58
我在香港入境被罚了4000港币

我在香港入境被罚了4000港币

童童聊娱乐啊
2024-06-17 20:05:44
第二批试点城市!汕头入选推荐名单!

第二批试点城市!汕头入选推荐名单!

ilove汕头
2024-06-17 14:12:08
发现一个迹象,俄乌战争很可能打不了多久了

发现一个迹象,俄乌战争很可能打不了多久了

文雅笔墨
2024-06-17 18:17:39
章子怡哽咽致谢张艺谋,74岁国师鞠躬回应,网友:两个人释怀了

章子怡哽咽致谢张艺谋,74岁国师鞠躬回应,网友:两个人释怀了

陈述影视
2024-06-17 20:27:16
凯特王妃携3宝亮相,对话被唇语专家破译,没有一句跟威廉有关

凯特王妃携3宝亮相,对话被唇语专家破译,没有一句跟威廉有关

红袖说事
2024-06-16 09:52:11
果然女人到了一定年龄就会“血脉觉醒”!网友的分享不要太真实!

果然女人到了一定年龄就会“血脉觉醒”!网友的分享不要太真实!

奇特短尾矮袋鼠
2024-06-14 11:07:05
王思聪躺在21岁新女友大腿上,让女友给他做头部按摩,网友:羡慕

王思聪躺在21岁新女友大腿上,让女友给他做头部按摩,网友:羡慕

兰子记
2024-06-16 19:46:34
港星许绍雄证实自己出身于广州名门望族,他却强调自己是大树枯枝

港星许绍雄证实自己出身于广州名门望族,他却强调自己是大树枯枝

司妮说娱
2024-06-16 23:03:42
泪目!黑龙江车祸5人遇难,知情人:4人刚高考完,父母的天要塌了

泪目!黑龙江车祸5人遇难,知情人:4人刚高考完,父母的天要塌了

校长侃财
2024-06-16 13:22:34
阿里巴巴全球数学竞赛的历届冠军是谁

阿里巴巴全球数学竞赛的历届冠军是谁

猫小狸同学
2024-06-17 08:21:36
2024-06-17 23:46:44
开源中国
开源中国
每天为开发者推送最新技术资讯
6331文章数 34225关注度
往期回顾 全部

科技要闻

为什么你的iPhone,肯定用不上"苹果AI"?

头条要闻

瑞典智库称中国核弹头数量增加总数达500枚 中方回应

头条要闻

瑞典智库称中国核弹头数量增加总数达500枚 中方回应

体育要闻

飞翔的斗牛士 如今也迎来最后一舞

娱乐要闻

上影节红毯:倪妮好松弛,娜扎吸睛

财经要闻

人均养老金上调3% 怎么年轻人吵翻了?

汽车要闻

传奇新篇章 全新一代大众迈腾来了

态度原创

本地
游戏
亲子
健康
公开课

本地新闻

能动司法尽“执”履责 ——“交叉执行”高效能

黄月英一橙带两紫,三国谋定天下这样的组合也能轻松开荒毫无压力

亲子要闻

弟弟用力掐姐姐的脸,姐姐一声不吭看了一眼妈妈,站起来一顿操作

晚餐不吃or吃七分饱,哪种更减肥?

公开课

近视只是视力差?小心并发症

无障碍浏览 进入关怀版