通过AI算法在Apache Spark上智能推荐高性能物化视图——OmniMV
发表于 2025/05/10
0
作者:张鑫/徐立
1 特性介绍
OmniMV物化视图特性是通过AI算法从历史SQL查询中推荐出最优物化视图,并在大数据组件Spark中自动对用户SQL进行物化视图匹配,将匹配成功的物化视图替换用户执行计划的部分SQL,大幅减少重复计算,提升查询性能。2 开源地址
代码地址:https://gitee.com/kunpengcompute/boostkit-bigdata/tree/br_feature_omnimv_spark343/omnimv
安装指南:
安装指南在鲲鹏社区,大家自取。
https://www.hikunpeng.com/document/detail/zh/kunpengbds/appAccelFeatures/sqlqueryaccelf/kunpengbds_omniruntime_20_0403.html
3 架构介绍

OmniMV物化视图主要包含两大模块:物化视图候选视图生成模块、物化视图SQL写模块。
- 物化视图候选视图生成模块:生成候选视图。
- 物化视图SQL写模块:修改SQL的物理执行计划。
1. 收集历史查询日志,例如Yarn logs的日志。
2. 从历史日志中解析得到SQL相关的信息,包括SQL文本、SQL执行计划、SQL运行时间等。
3. 从2得到的信息中,进行候选视图生成,然后使用贪心选择TOP N的候选视图。
4 应用场景
Spark作为一个常见的大数据计算引擎,在大数据典型硬件配置的场景下,运行标准测试用例TPC-DS,采用OmniMV,开启物化视图的11条SQL平均性能提升50%以上。5 逻辑计划重写源码解读
本文主要是对相关逻辑进行源码解读,特性使能参考上面的安装指南下图展示了Spark中基于物化视图的逻辑计划重写流程:优化规则从 HDFS 加载元数据,经逻辑计划检查等流程,提取引用表并筛选候选视图,遍历候选视图时通过视图逻辑计划检查、引用表匹配程度计算等操作,在物化视图 join 补偿、谓词补偿等过程辅助下,实现逻辑计划的重写功能,以优化查询执行。

代码链接:
https://gitee.com/kunpengcompute/boostkit-bigdata/blob/br_feature_omnimv_spark343/omnimv/omnimv-spark-extension/plugin/src/main/scala/org/apache/spark/sql/catalyst/optimizer/rules/AbstractMaterializedViewRule.scala5.1 元数据加载
5.1.1 加载时机
(1) 在OmniMV插件规则第一次被加载的时候,会进行元数据的加载。(2) 执行create、drop命令时,也会进行元数据的更新。
5.1.2 元数据内容
(1) 物化视图查询SQL对应的逻辑计划。(2) 物化视图的表逻辑计划。
5.2 逻辑计划检查
5.2.1 基础检查
深度遍历逻辑计划中的所有节点,节点的类型只允许以下类型。- Table
− HiveTableRelation
− SubqueryAlias
- Table
- Project
- Filter
- Join
5.2.2 Aggregate检查
5.3 引用表提取
(2) 统计每个表的同名序号(从0开始),封装成表比较类(TableEqual)。TableEqual:数据库、表名、同名序号。
5.4 遍历候选视图
获取和当前逻辑计划可能匹配的候选物化视图,然后遍历执行后续的逻辑。5.5 视图逻辑计划检查
同逻辑计划检查5.6 引用表匹配程度计算
(1) 查询引用表包含视图引用表
(2) 视图引用表包含查询引用表
(3) 两者存在部分交集,部分独有
5.7 物化视图Join补偿
5.7.1 MaterializedViewJoinRule
(1) 每个表创建一个Join逻辑计划,包装原先的视图表逻辑计划,最终生成补偿后的视图表逻辑计划。
(2) 每个表创建一个Join逻辑计划,包装原先的视图查询逻辑计划,最终生成新物化视图(join上这些表之后当做物化视图)的视图查询逻辑计划。
5.7.2 MaterializedViewAggregateRule
(3) 每个表创建一个Join逻辑计划,包装原先的视图表逻辑计划,最终生成补偿后的视图表逻辑计划。
(4) 每个表创建一个Join逻辑计划,包装原先的视图查询逻辑计划(Agg)的子计划,再包装个Agg(groupingExpressions和aggregateExpressions,加上新增表的所有字段),最终生成新物化视图(join上这些表之后当做物化视图)的视图查询逻辑计划。
(5) 在新物化视图的视图查询逻辑计划上,再包装个Project,最终生成新物化视图(join上这些表之后当做物化视图)的视图查询Project逻辑计划。
5.8 谓词补偿
5.8.1 谓词提取
(2)遍历化简后的逻辑计划。
对Filter算子的condition做splitConjunctivePredicates运算,将所有用And谓词连接的谓词放到conjunctivePredicates中保存。
对Join算子的condition做splitConjunctivePredicates运算,将所有用And谓词连接的谓词放到conjunctivePredicates中保存。
(3)遍历conjunctivePredicates。
算子类型是EqualTo
左右子表达式都是AttributeReference类型,则该算子算作equiColumnsPreds(等价谓词)
左右子表达式其中一个是AttributeReference类型,另一个是常量,则该算子算作rangePreds(比较谓词)
左右子表达式没有一个是AttributeReference类型,则该算子算作是residualPreds(其他谓词)
算子类型是LessThan、GreaterThan、LessThanOrEqual、GreaterThanOrEqual
左右子表达式其中一个是AttributeReference类型,另一个是常量,则该算子算作rangePreds(比较谓词)
其余情况,该算子都算作residualPreds(其他谓词)
算子类型不属于上面的类型都算做residualPreds(其他谓词)
(4)使用equiColumnsPreds(等价谓词)构造等价类EquivalenceClasses。
5.8.2 等价字段谓词
如果存在不能用来补偿的视图,那么当前视图是不符合条件的。
遍历所有的查询等价字段谓词集合,检查Multimap中是否存在可用来补偿的视图等价字段谓词集合。
(1)不存在,查询等价字段谓词集合中的字段依次构建EqualTo,加入补偿结果。
(2)存在,遍历所有可用来补偿的视图等价字段谓词集合。
计算查询和视图的差异字段集合。
遍历差异字段集合,和视图等价字段谓词集合的第一个字段构建EqualTo,加入补偿结果。
5.8.3 范围谓词
对视图谓词进行等价表映射、等价字段映射(使用查询的等价字段字典)。
对查询谓词和视图谓词进行重排序。
(1)用OR分割谓词。
分割后的视图谓词和查询谓词相同,返回TRUE。
分割后的视图谓词包含查询谓词,返回查询谓词。
其他继续往下。
(2)用AND分割谓词。
分割后的视图谓词和查询谓词相同,返回TRUE。
其他继续往下。
(3)视图谓词 AND NOT(查询谓词),判断是否存在极端不可能的情况。
将视图谓词 AND NOT(查询谓词)的结果,按AND条件分到NORMAL和NOT类型的集合里。
NORMAL中有FALSE类型的,那么当前视图是不符合条件的。
NOT中有TRUE类型的,那么当前视图是不符合条件的。
遍历NOT类型的谓词,按AND分解,如果是NORMAL的子集,那么当前视图是不符合条件的。
其他继续往下。
(4)重排序后的查询谓词 AND 重排序后的视图谓词,再进行简化和重排序。
新谓词不总为False,并且新谓词和重排序后的视图谓词用AND分割后是相同的。
按AND条件分割新谓词和重排序后的视图谓词,从新谓词中移除在视图谓词中已经存在的。将剩余的谓词用AND拼接,返回。
其他,该视图不满足要求。
5.8.4 其他谓词
逻辑和范围谓词一致。5.9 逻辑计划重写
5.9.1 MaterializedViewJoinRule
(2) 利用物化视图中的字段进行重写,新的projectList中的表达式Alias为1中projectList的表达式。
(3) 基于2的结果创建新的Project。
5.9.2 MaterializedViewAggregateRule
提取物化视图的aggExpressions和groupExpressions。
比较两者的groupExpressions。
(1)相同。
利用物化视图中的字段进行重写查询的aggExpressions和groupExpressions。
(2)查询的是物化视图的子集。
- 如果查询中的aggExpressions可以进行rollUp,那么进行rollUp替换。
例如view: select count(1) as ct from t group by c1,c2 ;
query:select count(1) from t group by c1;
rollUp:select sum(ct) from view group by c1;
min,max,sum,count
- 利用物化视图中的字段进行重写查询的aggExpressions和groupExpressions。