华为云数据库内核专家为您揭秘MySQL Volcano模型迭代器性能提升千倍的秘密

(论文阅读-优化器)Volcano-An Extensible and Parallel Query Evaluation System 火山模型Volcano在数据库查询系统的设计中,为查询优化、并行执行和资源收集提供了丰富的环境。火山模型在代数运算符之间使用了一个标准接口,允许简单地添加新运算符和实现运算符。火山模型极具扩展性,它对于新的算子、算法、数据类型和限定类型的方法都提供了极大的扩展性。火山模型包含两个新颖的元操作符:choose-plan元操作符支持动态的查询评估计划,可以通过延迟执行进行优化。exchange-plan元操作符支持分布式数据集内部的操作符并行,以及横向和纵向的操作符并行。 阅读详情

林舒,20年以上数据库内核研发经验。原IBMDB2数据库内核专家,专长数据库内核性能优化、SQL查询优化、MPP分布式数据仓库技术等。现就职于华为加拿大研究所,全程参与了RDS for MySQL以及GaussDB(for MySQL)的研发工作,熟悉GaussDB(for MySQL) 全栈技术。负责NDP的总体架构设计和实现,并成功落地上线。拥有多项技术发明专利,并co-author了SIGMOD 2020 Taurus( GaussDB(for MySQL)) Paper,目前专注于下一代云数据库智能优化器的研究。

1.   背景介绍

MySQL 8.0.18引入了一个新的SQL执行引擎,它遵循了Volcano模型。该模型的关键思想是将所有操作建模为“迭代器”。迭代器提供基本迭代组件:初始化、迭代和终止。所有迭代器都提供如以上相同的接口,因此迭代器可以任意组合堆叠在一起,形成执行计划。

MySQL 8.0.18还包括一个新的连接方法:哈希连接。哈希连接有探测端和构建端。哈希表是使用构建端的连接列作为哈希键值构建的;然后使用探测端的连接列来查找哈希表中的匹配行。

关于Volcano模型和哈希连接的细节不在本文的范围内。本文重点讨论一个问题,即哈希连接的谓词没有附加到合适的哈希连接迭代器,该问题可能会导致严重的性能下降。请注意:这不是一个功能问题,因为尽管有显著的性能下降,但最终的查询结果是正确的。

华为云数据库内核专家林舒向MySQL官方提交了此错误报告,以及对应的补丁,具体信息请参考这里:https://bugs.mysql.com/?id=104760。在本文中,我们将通过一个示例查询,来说明此问题,并比较应用补丁前后的性能差异。

本文中的查询在MySQL 8.0.26上测试,使用100MB的TPC-H数据库。为了说明问题,在查询语句中使用了索引提示(Index Hint)来促使SQL优化器选择哈希连接。

2.   问题描述

该问题使用的查询及其执行计划如下:

问题查询:

explain format=tree
select avg(case ps_partkey when null then 1 else l_quantity end)
from lineitem left outer join
( partsupp ignore index (primary) join part ignore index (primary) on ps_partkey = p_partkey and p_name like '%snow%')
on ps_suppkey = l_suppkey and ps_partkey = l_partkey

执行计划:


-> Aggregate: avg((case partsupp.PS_PARTKEY when NULL then 1 else lineitem.L_QUANTITY end))  (cost=179829230844583.70 rows=899131908749360)
    -> Left hash join (part.P_PARTKEY = lineitem.L_PARTKEY), (partsupp.PS_PARTKEY = lineitem.L_PARTKEY), (partsupp.PS_SUPPKEY = lineitem.L_SUPPKEY)  (cost=89916039969647.67 rows=899131908749360)
        -> Table scan on lineitem  (cost=61043.00 rows=596410)
        -> Hash
            -> Filter: (part.P_NAME like '%snow%')  (cost=2849092735.78 rows=1507573496)
                -> Inner hash join (no condition)  (cost=2849092735.78 rows=1507573496)
                    -> Table scan on partsupp  (cost=0.23 rows=77726)
                    -> Hash
                        -> Table scan on part  (cost=0.01 rows=19396)

注意以上查询计划的内哈希连接(Inner hash join)部分,partsupp和part之间的连接是“无条件”的,而谓词(part.P_NAME like“%snow%”)是在内哈希连接完成之后才被应用来过滤结果集的。观察原始查询语句,我们会注意到,partsupp和part之间存在一个连接谓词(ps_partkey = p_partkey),这个谓词去哪里了呢?它隐含在外层的左哈希连接(Left hash join)的连接谓词中,即 (part.P_PARTKEY =lineitem.L_PARTKEY)和(partupp.PS_PartKEY=lineitem.L_PartKEY)这两个谓词描述里。在内哈希连接中缺少谓词会导致性能问题,因为它使得有谓词的连接操作被替换为笛卡尔积,由于缺少连接条件进行过滤,结果集会被放大。此外,本地谓词(part.P_NAME like“%snow%”),可以在内哈希连接之前被应用,提前过滤掉无效的行。

3.   原因分析

这个问题发生的场景是,一个语句使用了外连接,而这个外连接选用哈希连接来完成,并且这个外连接的一部分涉及到了多于一张表。当这些条件同时具备,就可能会引发此问题。

在哈希连接中,其构建端是无法访问探测端上的任何列,反之亦然。一个引用了双端的谓词只能放置在哈希连接迭代器上。当MySQL优化器为表分配谓词时,它假定谓词可以引用表前面出现的所有表,然而这显然不适用于哈希连接。因此,当优化器的计划转换为迭代器计划时,优化器到迭代器的转换代码需要做出额外的补救,现在MySQL的转换代码中缺少相关的处理,导致了本文的问题。

4.  如何修复

针对这个问题的修复主要专注在优化器结构到迭代器转换代码中的主函数:ConnectJoins()。基本的思路是让该函数知道哪些表在当前不是可用的,因为这些表位于哈希连接的另一边。当函数将谓词放置在迭代器上时,尚未应用的谓词将沿着迭代器向上推,并在所需的表可用后立即被应用。

以下是在MySQL 8.0.26之上应用修复后的执行计划。partupp和part之间的内哈希连接现在有一个连接谓词:partupp.PS_PARTKEY=part.P_KEY。另外 ,本地谓词(part.P_NAMElike“%snow%”)现在出现在内部连接下面,也就是先于内哈希连接而被应用。

-> Aggregate: avg((case partsupp.PS_PARTKEY when NULL then 1 else lineitem.L_QUANTITY end))  (cost=179829230844583.70 rows=899131908749360)
    -> Left hash join (part.P_PARTKEY = lineitem.L_PARTKEY), (partsupp.PS_SUPPKEY = lineitem.L_SUPPKEY)  (cost=89916039969647.67 rows=899131908749360)
        -> Table scan on lineitem  (cost=61043.00 rows=596410)
        -> Hash
            -> Inner hash join (partsupp.PS_PARTKEY = part.P_PARTKEY)  (cost=2849092735.78 rows=1507573496)
                -> Table scan on partsupp  (cost=0.23 rows=77726)
                -> Hash
                    -> Filter: (part.P_NAME like '%snow%')  (cost=0.01 rows=19396)
                        -> Table scan on part  (cost=0.01 rows=19396)

下面是应用补丁前后的查询时间比较:打补丁前,查询耗时需要11分37秒

打补丁后,查询耗时仅需0.49秒

11分37秒 vs 0.49秒,修改前后的性能差距有1400多倍,区别是巨大的。希望这个问题可以在下一个MySQL版本中得到解决。

我们知道,MySQL社区的发展离不开每个数据库领域从业人员的努力,华为云GaussDB也一直重视开源社区的发展,积极对社区版本进行优化和改进,为社区做贡献。本次MySQLVolcano模型迭代器的谓词位置优化,助力MySQL查询性能提升千倍,正是华为云GaussDB 对社区发展的积极反馈。

另外,告诉大家一个好消息,华为云数据库专场活动正在进行,云数据库MySQL包年19.9元起,助力企业无忧上云,更多活动详情戳阅读原文。

参考资料:

[1] G. Graefe, "Volcano— An Extensible and Parallel Query Evaluation System," IEEE Transactions on Knowledge and Data Engineering, pp. 120-135, 1994. [2] "WL#11785: Volcano iterator design," [Online]. Available: https://dev.mysql.com/worklog/task/?id=11785. [3] "WL#12074: Volcano iterator executor base," [Online]. Available: https://dev.mysql.com/worklog/task/?id=12074. [4] "WL#12470: Volcano iterator semijoin," [Online]. Available: https://dev.mysql.com/worklog/task/?id=12470. [5] "Hash Join Optimization," [Online]. Available: https://dev.mysql.com/doc/refman/8.0/en/hash-joins.html. [6] "WL#2241: Hash join," [Online]. Available: https://dev.mysql.com/worklog/task/?id=2241. "TPC-H Homepage," [Online]. Available: http://www.tpc.org/tpch/. [1] G. Graefe, "Volcano— An Extensible and Parallel Query Evaluation System," IEEE Transactions on Knowledge and Data Engineering, pp. 120-135, 1994.

```

本文由华为云发布。

华为云原生Kubernetes之运行Volcano高性能作业的深度使用和实践 一、Volcano 简介 ① 什么是 Volcano ? Volcano 是 CNCF 下首个也是唯一的基于 Kubernetes 的容器批量计算平台,主要用于高性能计算场景,提供了机器学习、深度学习、生物信息学、基因组学及其他大数据应用所需要而 Kubernetes 当前缺失的一系列特性。 Volcano 提供高性能任务调度引擎、高性能异构芯片管理、高性能任务运行管理等通用计算能力,通过接入 AI、大数据、基因、渲染等诸多行业计算框架服务终端用户。 Volcano 针对计算型应用提供了作业调度、作业管理 阅读详情

相关推荐

Token验证绕过 靶场实战

实验介绍 1.漏洞简介 在Web领域基于Token的身份验证随处可见。在大多数使用Web API的互联网公司中,tokens 是多用户下处理认证的最佳方式。 具有以下几点特性: 1)无状态、可扩展 2)支持移动设备 3)跨程序调用 4)安全 2.原理基于Token的验证原理 基于Token的身份验证是无状态的,我们不将用户信息存在服务器或Session中。 NoSession意味着你的程序可以根据需要去增减机器,而不用去担心用户是...

weixin_54771278的博客 2251

数据库查询引擎执行模型

数据库查询引擎执行模型

Shyllin的博客 1528

Halcon棋盘格畸变矫正

通常我们使用的相机都是带有一定的畸变的,只是畸变的大小不同。对于我们常见的测量项目来说,对测量精度的要求很高,通常从相机镜头上进行优化,但是即使镜头优化或者成本原因,造成图像仍有一定的畸变时,我们就可是使用棋盘格标定板,进行畸变矫正。

m0_51559565的博客 3396

云原生批量计算引擎 Volcano社区v1.8.0版本正式发布

北京时间2023年8月17日,Volcano 社区 v1.8.0 版本正式发布。

华为云官方博客 2959

小智AI MCP协议实战:从语音指令到设备响应的完整链路拆解

本文深入拆解了小智AI MCP协议在智能语音交互中的完整工作流程。通过一个“调节音量”的真实场景,详细阐述了从语音采集、云端AI意图理解与决策,到MCP协议下的工具调用、设备端执行,最终完成语音反馈的每一个技术环节。文章重点分析了MCP协议如何通过标准化的交互模型,解决AI意图与设备控制间的“最后一公里”通信难题,实现高效可靠的设备响应。

defi6farmer的博客 249

自建邮局服务器| 批量邮件群发系统PowerMTA+oem(mumara,mailwizz, interspire)

世界顶级自建邮局服务器PowerMTA+oem(mumara,mailwizz, interspire) PowerMTA4.5(最好用的 群发邮件软件)是用于大批量多ip开发的邮件传递邮寄。可按每小时发送数近百万条电子邮件,发送IP地址和域可以详细配置,加上目前流行前端oem,mumara,mailwizz, interspire等,可定时发送,定时重复发送,实现全自动化 邮件群发 方案。 官网(powermta4.5下载) https://www.sparkpost.com/powermta/ 使用Po

ytrsexpo的博客 6506

Kubernetes增强型调度器Volcano(适配大数据调度)

Volcano调度器背景 Volcano是基于Kubernetes的批处理系统,为华为开源。Volcano方便AI、大数据、基因、渲染等诸多行业通用计算框架接入,提供高性能任务调度引擎,高性能异构芯片管理,高性能任务运行管理等能力。 Volcano调度的意义 K8s自带的资源调度器,有一个明显的特点:依次调度每个容器。但是在AI训练或者大数据,这种必须多个容器同时配合...

CodeAsWind 7855

用友BIP培训资料-设计采购订单新增API接口开发

14.在子实体的String pkMeas = order_hhrSlave0VOJson.getString("pk_meas");Openapi路径:nccloud/api/pu/order_hhrmanage/order_hhrMaster/addAggOrder_hhrMasterVO。实现接口的开发部署,通过openAPI的test类,实现一条数据的插入。16.进入自己的Idea打开老师发的TestOpenApi并且编译完成后如下。12.编写检测是否字段中是否含有中文的方法。

m0_68497879的博客 1549

华为云Volcano:让企业AI算力像火山一样爆发

欢迎添加华为云小助手微信(微信号:HWCloud002或HWCloud003),输入关键字“加群”,加入华为云线上技术讨论群;输入关键字“最新活动”,获取华为云最新特惠促销。华为云诸多技术大咖、特惠活动等你来撩! 作者:TommyLike 序: 在今年6月上海的KubeCon2019上,作为开...

zhy_Learn的博客 165

粒子群优化与蚁群算法求解多旅行商问题

它要求在给定一组城市和旅行商之间的距离矩阵的情况下,找到一条最优的路径方案,使得所有旅行商可以分别从起始城市出发,途径其他城市,并最终回到起始城市,同时总旅行距离达到最小。这两种算法都是基于群体智能的优化算法,在求解组合优化问题时具有较好的性能表现。假设有n个城市需要被m个旅行商访问,城市间的距离由距离矩阵D表示,其中D(i,j)表示第i个城市到第j个城市的距离。粒子群优化算法是一种基于群体智能的优化算法,其中的粒子代表了潜在的解,并通过模拟粒子在解空间中的移动来搜索最优解。一、多旅行商问题建模。

m0_47037246的博客 553

推荐11个顶级的Claude Code Skills

ClaudeCode的Skills系统为程序员提供了11个强大的AI辅助工具,包括代码审查、重构建议、单元测试生成、API文档自动生成、性能分析、安全扫描、数据库迁移脚本生成、CI/CD配置、依赖管理、ER图生成和日志分析等功能。这些"技能包"可大幅提升开发效率,从代码质量到协作沟通全方位优化工作流程。用户可根据需求选择2-3个核心功能开始尝试,熟练后还可自定义Skills。该系统需要配合Anthropic的API使用,建议先在小型项目测试再应用于核心业务。

分享AI、区块链技术及应用,未来已来 1855

性能提升1400+倍,快来看MySQL Volcano模型迭代器的谓词位置优化详解

摘要:性能提升1400+倍,快来看MySQL Volcano模型迭代器的谓词位置优化详解。

华为云官方博客 1万+

13、数据可视化与分组操作:Danfo.js 实战指南

本文深入介绍了如何使用 Danfo.js 进行数据可视化与分组操作。内容涵盖多种图表的创建与配置,如折线图、散点图、箱线图、小提琴图、直方图和柱状图,并结合 Plotly.js 实现丰富的交互式可视化效果。同时,详细讲解了数据聚合的‘分割-应用-组合’模式,包括分组数据、遍历分组、apply 方法及 agg 聚合操作,帮助开发者高效处理和分析结构化数据。适用于 Dnotebook、HTML 及主流前端框架的应用场景。

o1p2q3r的博客 99

1-Volcano火山:容器与批量计算的碰撞

1-Volcano火山:容器与批量计算的碰撞 Volcano是基于Kubernetes的一个批处理调度系统,它为大数据、机器学习以及HPC等多种工作负载提供了作业生命周期的管理、调度以及资源管理一系列的功能,能够帮助弹性的工作负载以及批处理的工作负载更好的运行在云原生的环境里,同时能够提高性能、降低成本。 Volcano项目背景 当前容器技术的使用已经非常广泛,相对于虚拟机来讲,它提供了更好的资源使用效率,可以实现秒级扩缩容,最重要的一点就是它解决了生产、开发、测试三个环境的统一,提供了一致性的运行环境。C

琦彦 2844

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

mysql迭代器_迭代器 - 刘海子 - 博客园

一,三层装饰器import timedef outter1(func):def wrapper(*args, **kwargs):start = time.time()res = func(*args, **kwargs)stop = time.time()print(stop - start)return res​ return wrapper@函数的内存地址1(1,2,3,4,5) #...

weixin_39669075的博客 267

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

cube studio开源一站式云原生机器学习平台--volcano 多机分布式计算

volcano主要为我们提供index job, 也就是启动多个pod,并为每个pod提供index,role,以及其他role的访问地址。保留单机的代码,添加识别集群信息的代码(多少个worker,当前worker是第几个),添加分工(只处理归属于当前worker的任务),使用volcano这个模板,填上自己的worker数量,每个worker的镜像和启动命令就可以了。3、每个worker里面都判别一遍总共需要处理的数据,和当前worker需要处理的数据。1、单机器算力有限,核数不足。

2909

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

科普文:软件架构数据库系列之【MySQL8新特性--执行器之火山模型(Iterator Model)】

三种常见的数据库查询引擎执行模型:Iterator Model、Materialization Mod。火山模型是数据库查询执行最著名的模型,也是在各种数据库系统中应用最广泛的模型。SQL语句在数据库中经过语法解析生产 AST 语法树,然后遍历语法树,生成执行树。执行树的每个节点为代数运算符(Operator)。火山模型把Operator看成迭代器,每个迭代器都会提供一个next() 接口。一般Operator的next() 接口实现分为三步 (1)调用子节点Operator的next() 接口获取一行数据

为无为,事无事,味无味。 2802

从Volcano模型看Presto执行计划

关系代数是关系型数据库查询语言的基础,关系数据库的对外接口是SQL语句,所以SQL语句中的DML、DQL基于关系代数实现了关系的运算。关系模型由关系数据结构关系操作集合和关系完整性约束三部分组成。传统集合运算符。并UNION、交INTERSECTION、差DIFFERENCE、积EXTENDED CARTESIAN PRODUCT专门的关系运算符。选择SELECT、投影PROJECT、连接JOIN、除DIVEDE辅助运算符。包括算术比较符和逻辑运算符关系扩展运算符。

junerli的博客 1672

SQL 查询优化原理

随着大数据相关技术的发展,SQL 作为一种成熟的查询语言又逐渐回到人们视野的中心来,被称为 NewSQL 的新型关系型数据库更是蓬勃发展。 作为一种声明式编程语言,将 SQL 转化为可以高效执行的任务对于 OLAP 任务来说是至关重要的。 本文将尝试对相关的技术原理进行一次总结。 本文将重点着眼于对 Volcano(Cascades) Optimizer的详细介绍上,这是因为 Volcano 模型不但十分流行, 更是被Apache Calcite这一优秀的开源框架所实现了。 我们因此可以通过直接阅读 ..

Baron_ND的博客 1778

mysql迭代器_迭代器 - 御姐玫瑰 - 博客园

一、协程1、协程是Python语言独有的一种多任务方式。2、使用gevent模块实现协程。3、协程的实现过程(步骤)迭代器生成器yieldgreenletgevent二、迭代器1、迭代的定义:在原有的基础之上添加新的功能。2、迭代对象的定义:即一个对象中有包含了【__iter__】的方法。3、迭代器的定义:即:一个对象中既包含了【__iter__】方法,又包含了【__next__】方法通过它可以...

weixin_33219863的博客 394

数据库迭代模型扩展

在火山模型之上引入带外数据的概念,增强模型处理能力。

余璜的技术博客 860

23行为型设计模式——迭代器模式

迭代器(Iterator):定义了访问集合元素的接口,通常包括 next() (获取下一个元素)和First()(检查是否存在元素)方法。具体迭代器(Concrete Iterator):实现了迭代器接口,负责管理当前遍历的位置,并提供访问集合元素的具体实现。集合(Aggregate):定义一个创建迭代器对象的接口,通常包括一个CreateIterator()方法。具体集合(Concrete Aggregate):实现了集合接口,提供具体的集合对象,并返回相应的具体迭代器对象。

qq_55610255的博客 1101

Volcano 大规模场景性能调优:基于性能测试的瓶颈定位与参数调优实践

本文以 Volcano 在万级 Pod 规模下的性能测试项目为主线,系统梳理大规模批处理场景中的三大性能瓶颈——Webhook 超时与固有开销、Controller 工作线程数(`--worker-threads`)的"V 型"曲线、以及 Controller 与 Scheduler 在 API-Server/ETCD 层面的 CREATE/SCHEDULE 争用。读完本文,你将能够复现原文档的测

gitblog_00263的博客 862

Volcano:Kubernetes 生态的高性能批处理调度系统全解析

Volcano 是 K8s 生态中最成熟、功能最完备的批处理调度系统,其核心价值在于“让批处理任务在 K8s 集群中高效、有序、稳定执行”。它通过批处理专属调度算法、精细化资源管理、全生命周期任务管控,完美解决了 AI 训练、大数据计算、HPC 等场景的核心痛点。

保持热爱。 1806
上一篇: 新数科技加入华为云“沃土云创计划”,携手共创商业新机
下一篇: GaussDB数据库培训服务上线,技能进阶修炼正当时
华为云技术精粹
博客等级 码龄5年 73粉丝 107原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值