---
title: 通过AI算法在Apache Spark上智能推荐高性能物化视图——OmniMV -官方技术文章-鲲鹏社区
description: OmniMV物化视图特性是通过AI算法从历史SQL查询中推荐出最优物化视图，并在大数据组件Spark中自动对用户SQL进行物化视图匹配，将匹配成功的物化视图替换用户执行计划的部分SQL，大幅减少重复计算，提升查询性能。
keywords: AI,Apache,算法在,Spark,上智能推荐高,性能物化视图,OmniMV,官方技术文章
url: https://www.hikunpeng.com/developer/techArticles/20250510-1?envFlag=1
section: (其他)
---

# 通过AI算法在Apache Spark上智能推荐高性能物化视图——OmniMV -官方技术文章-鲲鹏社区

URL: https://www.hikunpeng.com/developer/techArticles/20250510-1?envFlag=1
描述: OmniMV物化视图特性是通过AI算法从历史SQL查询中推荐出最优物化视图，并在大数据组件Spark中自动对用户SQL进行物化视图匹配，将匹配成功的物化视图替换用户执行计划的部分SQL，大幅减少重复计算，提升查询性能。
关键词: AI,Apache,算法在,Spark,上智能推荐高,性能物化视图,OmniMV,官方技术文章

官方技术文章 [了解详情](https://www.hikunpeng.com/zh/developer/techArticles)

通过AI算法在Apache Spark上智能推荐高性能物化视图——OmniMV

通过AI算法在Apache Spark上智能推荐高性能物化视图——OmniMV

大数据

发表于 2025/05/10

0

作者：张鑫/徐立

# 1 特性介绍

OmniMV物化视图特性是通过AI算法从历史SQL查询中推荐出最优物化视图，并在大数据组件Spark中自动对用户SQL进行物化视图匹配，将匹配成功的物化视图替换用户执行计划的部分SQL，大幅减少重复计算，提升查询性能。

# 2 开源地址

代码地址：https://gitcode.com/boostkit/boostkit-bigdata/tree/br_feature_omnimv_spark343/omnimv [了解详情](https://gitcode.com/boostkit/boostkit-bigdata/tree/br_feature_omnimv_spark343/omnimv)安装指南：安装指南在鲲鹏社区，大家自取。https://www.hikunpeng.com/document/detail/zh/kunpengbds/appAccelFeatures/sqlqueryaccelf/kunpengbds_omniruntime_20_0403.html [了解详情](https://www.hikunpeng.com/document/detail/zh/kunpengbds/appAccelFeatures/sqlqueryaccelf/kunpengbds_omniruntime_20_0403.html)

# 3 架构介绍

OmniMV物化视图主要包含两大模块：物化视图候选视图生成模块、物化视图SQL写模块。

- 物化视图候选视图生成模块：生成候选视图。
- 物化视图SQL写模块：修改SQL的物理执行计划。

OmniMV物化视图的使用流程如下。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.scala [了解详情](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.scala)

## 5.1 元数据加载

### 5.1.1 加载时机

（1）	在OmniMV插件规则第一次被加载的时候，会进行元数据的加载。（2）	执行create、drop命令时，也会进行元数据的更新。

### 5.1.2 元数据内容

（1）	物化视图查询SQL对应的逻辑计划。（2）	物化视图的表逻辑计划。

## 5.2 逻辑计划检查

### 5.2.1 基础检查

深度遍历逻辑计划中的所有节点，节点的类型只允许以下类型。

- Table

−	LogicalRelation−	HiveTableRelation−	SubqueryAlias

- Table
- Project
- Filter
- Join

−	Inner

### 5.2.2 Aggregate检查

逻辑计划的根节点是Aggregate类型，并且所有子节点满足基础检查要求。

## 5.3 引用表提取

（1）	深度遍历逻辑计划，提取节点类型为HiveTableRelation和LogicalRelation的节点。（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 谓词提取

（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的索引映射。如果存在不能用来补偿的视图，那么当前视图是不符合条件的。遍历所有的查询等价字段谓词集合，检查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

（1）	提取查询的projectList，进行等价字段映射。（2）	利用物化视图中的字段进行重写，新的projectList中的表达式Alias为1中projectList的表达式。（3）	基于2的结果创建新的Project。

### 5.9.2 MaterializedViewAggregateRule

提取查询的aggExpressions和groupExpressions。提取物化视图的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。

本页内容
