0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

多表物化视图的需求分析及实现应用设计

OSC开源社区 ? 来源:StarRocks Summit Asia 2022 ? 作者:StarRocks Summit Asia ? 2022-11-17 10:49 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

作者: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 是刷新中的核心技术。

1Task 调度框架

首先给大家介绍一下 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 技术。

3Insert 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,优化刷新效率、增加部分刷新的语法和配置来应对复杂的刷新问题和各种复杂场景,大家可以尽请期待。

审核编辑:郭婷


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    7269

    浏览量

    92457
  • SQL
    SQL
    +关注

    关注

    1

    文章

    786

    浏览量

    45497

原文标题:多表物化视图的设计与实现

文章出处:【微信号:OSC开源社区,微信公众号:OSC开源社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    市场上的工控机改如何选择?接口与扩展性需求分析

    在边缘计算时代,工控机的选择需紧密围绕实时性、可靠性、环境适应性三大工业核心需求,同时兼顾算力、接口与扩展性的平衡。以下是关键考量因素及选型策略: 一、算力需求分析:从场景出发分层选型 传感器数据
    的头像 发表于 08-06 16:52 ?194次阅读
    市场上的工控机改如何选择?接口与扩展性<b class='flag-5'>需求</b><b class='flag-5'>分析</b>

    物化工厂为何需要引入人车定位系统

    在现代化生物化工厂的复杂运营环境里,安全与效率一直是企业发展的两大核心关注点。从高度专业化的生产流程到危险品潜藏的各类风险,再到人员与车辆的频繁流动,生物化工厂常常面临着传统管理模式难以解决的诸多
    的头像 发表于 07-30 16:27 ?174次阅读
    生<b class='flag-5'>物化</b>工厂为何需要引入人车定位系统

    电源变换器EMC整改:需求分析到整改报告的标准化流程

    南柯电子|电源变换器EMC整改:需求分析到整改报告的标准化流程
    的头像 发表于 06-24 11:12 ?260次阅读

    智能防雷监测系统的行业需求分析与应用解决方案

    Protection Monitoring System,ILPMS)应运而生,通过在线采集雷电击参数、环境电磁数据,并结合云平台与大数据分析实现对防雷装置状态和雷电风险的实时监控与预警,从而大幅提升防雷体系的智能化水平。 一、行业
    的头像 发表于 04-22 11:55 ?418次阅读
    智能防雷监测系统的行业<b class='flag-5'>需求</b><b class='flag-5'>分析</b>与应用解决方案

    Xgig 1000 24 Gbps 分析仪/干扰器JDSU

    双mini-SAS HD接口,支持24 Gbps SAS,能够对单端口和宽端口SAS链路进行双向分析。每个端口配备32 GB RAM,最大可实现256 GB的跟踪能力。其创新的前进后出空气流动设计使得
    发表于 02-17 09:30

    电池充放电测试系统:定制需求与适用厂家分析

    的多样性,许多厂家纷纷寻求定制化的电池充放电测试系统,以满足其特定应用需求。本文将探讨电池充放电测试系统适用于哪些厂家定制,并分析其定制化需求的背后逻辑。 新能源汽车制造商 新能源汽车制造商是电池充放电测试系
    的头像 发表于 01-15 17:44 ?451次阅读

    MVTRF:多视图特征预测SSD故障

    多任务随机森林( MVTRF )方案。MVTRF基于从SSD的长期和短期监测数据中提取的多视图特征预测SSD故障。特别地,采用多任务学习,通过同一模型同时预测什么类型的故障以及何时发生。本文还提取了MVTRF的关键决策来分析为什么会发生故障。这些故障细节将有助于验证和处理
    的头像 发表于 12-30 11:04 ?712次阅读
    MVTRF:多<b class='flag-5'>视图</b>特征预测SSD故障

    蔡司软件 | 高效变形分析能力,满足多行业需求

    。该软件与蔡司的硬件设备(如ARAMIS,Argus等)以及非蔡司的第三方设备无缝对接,实现数据的快速导入和处理。通过直观易用的用户界面和强大的功能,ZEISS CORRELATE为用户提供了一个高效、准确且可靠的解决方案。 ? 亮点功能 ? 01 动态分析 ? 捕捉物体
    发表于 12-25 14:10 ?403次阅读
    蔡司软件 | 高效变形<b class='flag-5'>分析</b>能力,满足多行业<b class='flag-5'>需求</b>

    SSM框架的优缺点分析 SSM在移动端开发中的应用

    :Spring框架是企业型开发使用的成熟的开源框架,能够节省成本。SSM框架使用起来更加轻快,能够更合理地分配资源,使用最小的资源完成当前的需求。 节省开发时间 :SSM框架采用典型的三层结构MVC(模型、视图、控制器),允许开发人员降低重新开发的复杂性,及时更改解决方
    的头像 发表于 12-16 18:18 ?2579次阅读

    ipc系统的网络带宽需求分析

    IPC(Internet Protocol Camera)系统的网络带宽需求分析涉及多个因素,包括IPC的码流大小、网络架构、监控需求等。以下是对IPC系统网络带宽需求
    的头像 发表于 11-15 14:28 ?1296次阅读

    建筑物边缘感知和边缘融合的多视图立体三维重建方法

    航空建筑深度估计是三维数字城市重建中的一项重要任务,基于深度学习的多视图立体(MVS)方法在该领域取得了较好的成果。目前的主要方法通过修改MVS 框架实现建筑物的深度估计,缺乏对建筑物内在结构的考虑,易导致精度不足等问题。
    的头像 发表于 11-07 10:16 ?1032次阅读
    建筑物边缘感知和边缘融合的多<b class='flag-5'>视图</b>立体三维重建方法

    智慧交通系统的需求分析和建设目标

    实现 智慧交通 系统的有效建设和持续优化。 1. 需求分析: a. 交通拥堵问题:针对城市交通拥堵严重的情况,需要智能化的交通管理系统,实现交通信号灯智能控制、交通流量优化等功能,减少
    的头像 发表于 11-05 18:26 ?978次阅读

    UWB技术如何实现不同维度的定位需求

    ,正在逐渐成为室内定位领域的明星技术。 UWB技术通过发送和接收超宽带信号来定位目标。这种技术相较于其他定位技术,具有更高的定位精度和更低的信号干扰。那么,UWB定位技术是如何实现不同维度的定位需求呢?本文将为您详细解答。 0维定位:存在性
    的头像 发表于 11-01 10:43 ?915次阅读
    UWB技术如何<b class='flag-5'>实现</b>不同维度的定位<b class='flag-5'>需求</b>

    智慧交通的需求分析与建设内容

    的关注和重视。 1. 需求分析 交通拥堵问题: 城市交通拥堵导致通勤时间延长、能源浪费增加。需要通过智慧交通系统实现交通流量优化、智能信号控制等措施来缓解拥堵。 交通安全隐患: 交通事故频发、行人、车辆安全受威胁。
    的头像 发表于 10-18 15:08 ?761次阅读

    浅谈虚拟电厂标准化现状与需求分析

    了虚拟电厂各环节的标准化现状,依据自上而下和自下而上的系统工程方法,结合引导性、协调性、系统性和开放性的虚拟电厂标准体系构建原则,设计了涵盖15个子类、52个标准系列的体系架构,并基于未来需求分析提出了重点布局
    的头像 发表于 10-16 15:35 ?1352次阅读
    浅谈虚拟电厂标准化现状与<b class='flag-5'>需求</b><b class='flag-5'>分析</b>