导读 物化视图(Materialized View,以下简称 MV)是将查询结果预先计算并存储的一种特殊的物理表,当执行相关查询时,可以自动复用预计算结果,提高查询性能。物化视图作为一种查询加速器,在云计算和大数据时代有着广泛的用途。今天和大家分享物化视图在 MaxCompute 的实践。
本次介绍将围绕下面四点展开:1. MaxCompute 和物化视图
2. 功能设计和具体实现
3. 智能推荐及自动物化视图
4. 总结和展望
分享嘉宾|雷春蔚 阿里云 MaxCompute SQL引擎技术专家,Apache Calcite PMC
编辑整理|李笑宇
内容校对|李瑶
出品社区|DataFun
01
MaxCompute 和物化视图MaxCompute 是一个多功能、高性能、易使用的企业级的数据仓库服务,已经为阿里巴巴集团提供服务达 14 年。目前每日 DML 的任务数超过了 2,600 万,单日的数据量规模达到 EB 级,服务集团内用户 4W+。在如此大的体量之下,也暴露出几个问题:随着业务的规模越来越大,重复计算越来越多,消耗了大量资源;对于计算结果的产出时效有了更高要求;通过大批量改造脚本来进行数据治理的成本高,难度大。最终物化视图成为解决以上问题的最佳方案。与普通视图(Virtual View)不同,物化视图存储的是查询结果的物理副本,而普通视图仅仅是一个虚拟的表,它在查询时才动态地生成结果。物化视图的发展历史与数据库技术的进步紧密相关。以下是物化视图发展的一些关键阶段。物化视图的设计和实现
在物化视图的设计阶段,我们关注物化视图的创建、维护和应用。1. 如何创建物化视图
MaxCompute 支持创建普通物化视图、分区物化视图、聚簇物化视图和穿透物化视图,具体的创建方式体现在建表语句中,PARTITIONED BY (col_name) 语句指定创建物化视图表为分区表,CLUSTERED BY (col_name) SORTED BY (col_name [ASC | DESC])INTO number_of_buckets BUCKETS 语句指定创建物化视图为聚簇表。 在物化视图创建的过程中有两个关键点,第一个是需要建立一个基表到物化视图的索引,这样在查询时就能快速地获取到相关的物化视图。第二个是基表数据版本保存,在物化视图的元数据中需要保存对应基表的数据版本;另外对于分区物化视图,要求分区物化视图的分区列和基表保持一致,这样的话,可以实现分区级的增量更新。2. 如何维护物化视图
MaxCompute 通过建表语句中的 TBLPROPERTIES 指定是否开启自动刷新,刷新时间间隔和分区增量刷新:"enable_auto_substitute"="true", --指定当分区不存在时是否转化视图来查询。"enable_auto_refresh"="true", --指定是否开启自动刷新。"refresh_interval_minutes"="120", --指定刷新时间间隔。"only_refresh_max_pt"="true" --针对分区物化视图,只自动刷新源表最新分区。3. 如何使用物化视图实现加速查询
自动查询改写:自动查询改写通过四个步骤实现,第一步,利用基表到 MV 的索引去获取相关物化视图;第二步是命中预判定,假如一个基表关联的 MV 的数目太多的话,通过命中预判定,以便尽早过滤无效的物化视图;第三步是把物化视图注册到优化器中;第四步是改写校验及执行,这主要包括的是基于 CALCITE 改写规则的二次开发,其中包含了一系列的校验,包括字段校验、谓词校验、关联校验以及分组和聚合校验等,通过这些校验来判断查询字段、查询条件、关联条件、分组和聚合条件等是否与物化视图一致,从而决定是否能用物化视图改写查询。比如一个查询 SQL 是:SELECT ds, count(uid) as pvFROM usersWHERE ds>=‘20230501’ AND ds<=‘20230507’GROUP BY ds;物化视图为:SELECT ds, count(uid) as pv
FROM users
WHERE ds>=‘20230401’
GROUP BY ds;
查询改写后的 SQL 就变成了:SELECT ds, pv
FROM mv
WHERE ds>=‘20230501’ AND ds<=‘20230507’ ;
自动查询改写是基于 SPJG 的匹配。匹配会自动忽略空格、换行、注释、别名等影响,除此之外查询 SQL 与物化视图 SQL 不完全相同的场景下,自动查询改写会尝试改写查询 SQL,补偿物化视图 SQL 和查询 SQL 之间缺少的计算动作,比如当 SQL 查询的 SELECT 列与物化视图 SQL 的 SELECT 列不完全相同时,自动查询改写对 SELECT 列支持情况如下:(1)支持查询 SQL 的 SELECT 列的顺序与物化视图 SQL 不同。(2)支持物化视图 SQL 中的 SELECT 列没有出现在查询 SQL 中。(3)支持查询 SQL 中的 SELECT 列不在物化视图 SQL 的 SELECT 列中,但是可以由物化视图 SQL 的 SELECT 列组合计算得到。(4)不支持查询 SQL 中的 SELECT 列不在物化视图 SQL 的 SELECT 列中,且无法由物化视图 SQL 的 SELECT 列组合计算得到。自动穿透:自动穿透的关键是区分物化数据和非物化数据。通过 SQL 解析后的执行计划,确定查询 SQL 的目标分区,然后去 MV 里面看相应的分区是否得到了物化,如果存在没有物化的分区,就将该分区转化为视图去执行。比如有个查询 SQL 是:select key from src where ds >= ‘20230530’group by key,存在一个按天增量的 MV 只有 20230601 到 20230605 的数据,自动穿透功能会直接读取 20230601到 20230605 已物化的分区,并将未物化的分区 20230530 和 20230531 转化为视图执行,最后将两部分数据 UNION ALL 起来。自动穿透既节省了存储,又实现了灵活扩展。 03智能推荐及自动物化视图
物化视图在推广的过程中存在以下三个问题:1. 智能推荐
通过对执行任务进行分析,智能选择资源消耗大、任务耗时长、使用频率高、预期收益大的 SQL 进行语句拆分和合并,提取出公共表达式,基于公共表达式构建物化视图。在任务运行时选择匹配率高的物化视图进行推荐,比如:(1)优先全匹配,当不存在全匹配的物化视图时才会尝试选择需要进行补偿的物化视图。(2)当有多个需要进行补偿的物化视图时,查询 SQL 涉及的表与物化视图涉及的表匹配的数量越多,优先级越高。(3)当有多个需要进行补偿的物化视图与查询 SQL 涉及的表匹配数量相同时,根据物化视图的数据存储大小作为优先级标准,物化视图的数据存储大小越小,优先级越高。2. 自动物化视图
在自动物化视图的实现中,有三个关键点:(1)在线物化,利用延迟物化能力,先不生成数据,等到 SQL 执行时再生成数据。(2)QUATA 限制:物化视图不能没有限制的随意生成,我们会敲定一个配额,只有占用存储在这个阈值之内,才会自动生成物化视图。(3)收集反馈,根据反馈结果对物化视图进行迭代,只保留有价值的物化视图。用户可在 CONSOLE 页面,一站式生成和查看物化视图。04总结和展望
MaxCompute 物化视图的功能概览如下图所示: 我们针对业界产品做了一个分析,对比 MaxCompute 与 Hive、Spark、Snowflake、RedShift、BigQuery 等产品的物化视图功能,如下所示。 可以看到,MaxCompute 中的物化视图的功能还是很全的,囊括了分区、聚簇、查询改写、延时物化、穿透、自动生成和自动更新等功能。MaxCompute 物化视图在淘天业务线的应用效果如下: 在淘天业务线上,目前创建了超 5 千个物化视图,优化的查询任务超 2 万。优化后的查询平均资源的消耗降低了 20% 以上,甚至有一些查询消耗降低了 80%。目前自动物化视图这个功能还在灰度中,预计最终可以创建超 10 万个物化视图,查询的覆盖范围可以达到 50 万,预计将节省 14% 的 CU 资源。最后是对未来工作的展望。 未来,我们还将在以下方面进行完善:分享嘉宾
INTRODUCTION
雷春蔚
阿里云
MaxCompute SQL引擎技术专家,Apache Calcite PMC
雷春蔚,Apache Calcite PMC,具有多年大数据从业经验,主攻 SQL 引擎性能优化,先后负责了阿里云 MaxCompute 物化视图、dynamic filter、索引等核心功能的设计和开发。
往期推荐
ByteHouse如何将OLAP性能提升百倍?
第三代指标平台定义、能力与技术详解
ChatBI:基于文心一言的生成式数据分析技术探索
Kyligence 发布企业级 AI 解决方案,Data + AI 落地迈向新阶段
万亿数据的电商平台,如何做存储?
技术分享|揭秘第三代指标平台的查询加速技术
Apache Spark在小米的生产实践
Al Agent--大模型时代重要落地方向
基于因果推断的推荐系统:回顾和前瞻
点个在看你最好看
SPRING HAS ARRIVED