导读物化视图(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)不同,物化视图存储的是查询结果的物理副本,而普通视图仅仅是一个虚拟的表,它在查询时才动态地生成结果。物化视图的发展历史与数据库技术的进步紧密相关。以下是物化视图发展的一些关键阶段。
早期数据库阶段:早期的数据库系统中,并没有物化视图的概念。数据库主要关注于数据的存储和基本的查询操作。
RDBMS 视图阶段:视图允许用户通过 SQL 语句定义一个虚拟表,这个虚拟表是基于一个或多个实际表的查询结果。然而,早期的视图通常是非物化的,即它们在查询时才计算结果。
RDBMS 物化视图阶段:物化视图的概念在 20 世纪 90 年代初期被提出。物化视图将查询结果实际存储在数据库中,这样用户就可以像访问普通表一样访问物化视图,而不需要每次都执行复杂的查询。随着数据库技术的发展,物化视图的性能优化和自动化管理成为研究的重点。数据库管理系统(DBMS)提供了更多的功能来优化物化视图的性能,如增量更新、自动更新、并行处理等。
云原生大数据物化视图阶段:在云计算和大数据时代,物化视图的作用变得更加重要和普遍。基于云计算几乎无限的可扩展性,物化视图可以适应更大的数据集;实时计算引擎提高了物化视图的更新频率和更新效率;自动化和编排工具使得物化视图的创建、管理和刷新变得简单;云计算通常是按需付费模式,物化视图节约了计算资源,实现降本增效;物化视图可以作为数据质量的检查点,监控数据质量。
物化视图的优点如下:
提高查询性能:对于复杂的查询,由于物化视图存储了查询结果,对于频繁执行的查询,可以直接从物化视图中读取数据,而不需要每次都执行完整的查询,从而提高了查询效率。
保持数据一致性:物化视图可以定期刷新,以确保数据的一致性。在数据变化不频繁的情况下,这可以减少数据同步的开销。
应急查询:物化视图允许用户在数据库服务器关闭或网络连接中断时,仍然可以访问和分析数据。
物化视图也有一些缺点:
存储空间:物化视图需要额外的存储空间来保存查询结果。
数据更新:如果底层数据频繁变动,物化视图需要定期刷新,这可能会增加维护成本。
复杂性:对于某些复杂的查询,物化视图可能难以实现或者维护。
02
物化视图的设计和实现
在物化视图的设计阶段,我们关注物化视图的创建、维护和应用。
1. 如何创建物化视图
MaxCompute 支持创建普通物化视图、分区物化视图、聚簇物化视图和穿透物化视图,具体的创建方式体现在建表语句中,PARTITIONED BY (col_name) 语句指定创建物化视图表为分区表,CLUSTEREDBY (col_name) SORTED BY (col_name [ASC | DESC])INTOnumber_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 pv
FROM users
WHERE ds>=‘20230501’ AND ds
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
自动查询改写是基于 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’groupby key,存在一个按天增量的 MV 只有 20230601 到 20230605 的数据,自动穿透功能会直接读取 20230601到 20230605 已物化的分区,并将未物化的分区 20230530 和 20230531 转化为视图执行,最后将两部分数据 UNIONALL 起来。自动穿透既节省了存储,又实现了灵活扩展。
03
智能推荐及自动物化视图
物化视图在推广的过程中存在以下三个问题:
用户的 SQL 能力有限,对于物化视图的了解有限,无法很好利用。
用户具备相应 SQL 水平,但是不具备全局视角,无法确定哪些重复计算应该建立物化视图。
不能准确衡量物化视图的价值,就不具备大规模的宣传和推广的动力。
针对以上三个问题,MaxCompute 通过智能推荐和自动物化的方法降低物化视图的创建难度,提高用户使用体验。
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 资源。
最后是对未来工作的展望。
未来,我们还将在以下方面进行完善:
增量更新:虽然现在已经实现分区级的增量更新,可以满足大部分批处理的场景要求,但是对于更新频率要求更高的场景,更新的粒度还有待细化。
基于事件触发更新:目前支持定时刷新、手动刷新和分区增量刷新,未来希望可以做到基于事件的更新。
扩展外表的使用场景:湖仓一体的时代,大量的数据都存储在 OSS 和 HDFS 上,物化视图也可以作为一个外部数据的缓存去使用。
扩展查询改写算子:自动查询改写这块还有很大的扩展空间,比如扩展对 LEFT OUTER/RIGHT OUTER JOIN 的支持,扩展对 GROUPBY、HAVING、ORDER BY、LIMIT 和聚合函数表达式的支持。
以上就是本次分享的内容,谢谢大家。
分享嘉宾
INTRODUCTION
雷春蔚
阿里云
MaxCompute SQL引擎技术专家,Apache Calcite PMC
雷春蔚,Apache Calcite PMC,具有多年大数据从业经验,主攻 SQL 引擎性能优化,先后负责了阿里云 MaxCompute 物化视图、dynamic filter、索引等核心功能的设计和开发。
4000520066 欢迎批评指正
All Rights Reserved 新浪公司 版权所有