详解SQL优化必备:并行执行框架和执行计划
摘要:在关系型数据库中,优化器是数据库的核心组件之一,由于一些列因素都会影响语句的执行,优化器综合权衡各个因素,在众多的执行计划中选择认为是最佳的执行计划。
本文分享自华为云社区《华为云GaussDB(for openGauss)专场直播第5期:SQL优化解读》,原文作者:心机胖。
1.前言
在关系型数据库中,优化器是数据库的核心组件之一,由于一些列因素都会影响语句的执行,优化器综合权衡各个因素,在众多的执行计划中选择认为是最佳的执行计划。随着大数据时代的到来,像电商、游戏、电信等行业都大规模的应用,单一数据库节点是难以应对数据规模的不断增长并确保性能的需要,业务面临“存不下、算得慢、算不准”的问题。而GaussDB(for openGauss)采用了可横向扩展的分布式架构,可以很好满足大规模海量数据的存储和计算的需求,其通过目标SQL执行计划的CBO成本,从目标SQL的诸多执行计划中选取成本值最小的执行路径为其执行计划,各执行路径的成本值是根据目标SQL中涉及到的表、索引、列等相关对象的统计信息计算出来的,实际反应执行目标SQL所要消耗的I/O、CPU和网络资源的一个估计值。
- I/O资源:把表的数据从磁盘读入内存时所需代价
- CPU资源:处理内存中表的数据所需的代价
- 网络资源:需要DN间数据交互的分布式SQL,在实际执行时所需要的数据并不在本地DN中(需要从其他DN中取数据),便会将网络资源消耗折算成对等的I/O资源消耗再进行估算。
本文结合第5场直播内容从分布式并行执行框架、分布式执行计划等方面进行介绍。
2.分布式并行执行框架
2.1 执行器:PIPELINE模型

GaussDB(for openGauss)的执行器特点是:按照查询计划树从底往上执行,基于火山模型执行,即每个节点执行返回一行记录给父节点。
火山模型的最大优点就是可以按需请求,每次只取出一条元组,在处理本条元组后,系统将会取出下一条满足条件的元组,直到取出所有满足条件的元组为止。从这种方式的运行机制可以看出,其每次执行时对于系统资源的需求都非常小。
2.2 高性能分布式查询引擎

GaussDB(for openGauss)充分利用当前多核特点,通过多线程并发执行,提高系统吞吐量。众所周知,在传统的分布式 MPP 数据库中,因数据的重分布,也就是数据shuffle的代价非常昂贵,从而限制了用户使用场景范围。
GaussDB(for openGauss)能充分利用当前多核特点,采用并行执行机制,在SQL执行优化方面有多年的沉淀,并提供了三种stream流(广播流、聚合流和重分布流)来降低数据在DN节点间的流动,突破了传统分布式 MPP 数据库因为数据shuffle代价高昂带来的用户使用场景限制,即使是复杂的SQL、事务分析混合(HTAP)场景也能得到最佳执行。
GaussDB(for openGauss)的大致执行过程:
- 业务应用下发SQL给Coordinator ,SQL可以包含对数据的CRUD操作;
- Coordinator利用数据库的优化器生成执行计划,每个DN会按照执行计划的要求去处理数据;
- 数据基于一致性Hash算法分布在每个DN,因此DN在处理数据的过程中,可能需要从其他DN获取数据,GaussDB提供三种stream流(广播流、聚合流和重分布流)实现数据在DN间的流动,使得join无需抽取到CN执行;
- DN将结果集返回给Coordinate进行汇总;
- Coordinator将汇总后的结果返回给业务应用。
3.分布式执行计划
CN根据表的分布列信息和关联列信息进行判定,SQL语句是否可以直接在各个DN上执行而且不需要数据交流,如果是,CN采用LIGHT_QUERY或FQS_QUERY流程,保持了事不关己的态度,你发给我什么我就下发什么,直接将整个query命令下发给DN执行,执行完成后直接输出;如果需要在各个DN之间进行数据交互,则会选择使用stream算子;如果发现无法使用stream算子时,就回到了原始的PGXC流程。
3.1 LIGHT_QUERY
- 场景:语句可以直接在一个DN执行(单shard语句,点查场景)。
- 原理:CN直接下发语句QPBE报文到对应DN,这样的做的好处是,执行效率高,线性扩展比好。
create table t1 ( col1 int, col2 varchar ) distribute by hash(col1);
create table t2 ( col1 int, col2 varchar ) distribute by hash(col1);

3.2 FQS_QUERY
- 场景:当语句可以完全下推到多个DN上执行,且DN之间不需要数据交互时。
- 原理:CN不通过优化器,直接生成RemoteQuery计划,走执行器逻辑下发到DN,各DN根据下推语句生成执行计划并进行执行,执行结果在CN上进行汇总。
create table t1 ( col1 int, col2 varchar ) distribute by hash(col1);
create table t2 ( col1 int, col2 varchar ) distribute by hash(col1);

LIGHT_QUERY和FQS_QUERY的最大异同点在于,虽然CN都是经过判定后直接把收到的query下发给DN进行处理,但是LIGHT_QUERY只涉及到单DN进行操作,而FQS_QUERY涉及到多个DN分别进行操作,它们都不会涉及到DN间的数据交互。
3.3 STREAM GATHER
- 场景:需要各DN之间进行数据交互。
- 原理:CN根据原语句通过优化器生成带stream算子的执行计划,下发给DN进行执行,DN执行过程中存在数据交互(stream节点),stream算子在DN之间建立连接进行数据交互,CN汇总执行结果并承担大部分计算。
create table t1 ( col1 int, col2 varchar ) distribute by hash(col1);
create table t2 ( col1 int, col2 varchar ) distribute by hash(col2);

3.4 STREAM REDISTRIBUTE
- 场景:需要各DN之间进行数据交互。
- 原理:CN根据原语句通过优化器生成带stream算子的执行计划,下发给DN进行执行,各DN执行过程中存在数据交互(stream节点),stream算子在DN之间建立连接进行数据交互,CN汇总执行结果并承担大部分计算。
create table t1 ( col1 int, col2 varchar ) distribute by hash(col1);
create table t2 ( col1 int, col2 varchar ) distribute by hash(col2);

3.5 STREAM BROADCAST
- 场景:需要各DN之间进行数据交互。
- 原理:CN根据原语句通过优化器生成带stream算子的执行计划,下发给DN进行执行,各DN执行过程中存在数据交互(stream节点),stream算子在DN之间建立连接进行数据交互,CN汇总执行结果并承担大部分计算。
create table t1 ( col1 int, col2 varchar ) distribute by hash(col1);
create table t2 ( col1 int, col2 varchar ) distribute by hash(col2);

使用REDISTRIBUTE算子时,数据进行重分布可以充分利用多个节点的算力,而BROADCAST算子主要用于stream的子计划产生的数据量较少的情况,此时BROADCAST的代价较少。
3.6 PGXC
- 场景:不能满足前面处理方式的极端场景,性能非常差。
- 原理:CN通过优化器把原语句中的部分语句生成RemoteQuery计划,把每个RemoteQuery下发到DN,DN执行后把中间结果数据发送给CN,CN收集后进行剩余执行计划的执行计算,CN承担了大部分计算。

总结
综上所述,GaussDB(for openGauss)作为自主研发的新一代金融级分布式关系型数据库,采用可横向扩展的分布式架构,通过SQL优化器生成分布式算子以及分布式执行计划,提供了三种stream流(广播流、聚合流和重分布流)来降低数据在DN节点间的流动;执行引擎是一个分布式并行执行框架,支持节点间并行和节点内并行能力,充分利用当前多核特点,通过并发执行,提高系统吞吐量,具备大数据下高性能查询能力。
Ps:更多精彩内容,请点击回播链接进行观看:https://bbs.huaweicloud.com/live/cloud_live/202107061900.html
详解SQL优化必备:并行执行框架和执行计划的更多相关文章
- my.cnf 详解与优化【转】
MySQL配置文件my.cnf 例子最详细翻译,可以保存做笔记用. #BEGIN CONFIG INFO#DESCR: 4GB RAM, 只使用InnoDB, ACID, 少量的连接, 队列负载大#T ...
- 李洪强iOS经典面试题156 - Runtime详解(面试必备)
李洪强iOS经典面试题156 - Runtime详解(面试必备) 一.runtime简介 RunTime简称运行时.OC就是运行时机制,也就是在运行时候的一些机制,其中最主要的是消息机制. 对于C ...
- 李洪强iOS经典面试题155 - const,static,extern详解(面试必备)
李洪强iOS经典面试题155 - const,static,extern详解(面试必备) 一.const与宏的区别(面试题): const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽 ...
- [Android新手区] SQLite 操作详解--SQL语法
该文章完全摘自转自:北大青鸟[Android新手区] SQLite 操作详解--SQL语法 :http://home.bdqn.cn/thread-49363-1-1.html SQLite库可以解 ...
- 深入详解SQL中的Null
深入详解SQL中的Null NULL 在计算机和编程世界中表示的是未知,不确定.虽然中文翻译为 “空”, 但此空(null)非彼空(empty). Null表示的是一种未知状态,未来状态,比如小明兜里 ...
- 详解intellij idea搭建SSM框架(spring+maven+mybatis+mysql+junit)(下)
在上一篇(详解intellij idea 搭建SSM框架(spring+maven+mybatis+mysql+junit)(上))博文中已经介绍了关于SSM框架的各种基础配置,(对于SSM配置不熟悉 ...
- JS中的函数节流throttle详解和优化
JS中的函数节流throttle详解和优化在前端开发中,有时会为页面绑定resize事件,或者为一个页面元素绑定拖拽事件(mousemove),这种事件有一个特点,在一个正常的操作中,有可能在一个短的 ...
- apache配置文件详解与优化
apache配置文件详解与优化 一.总结 一句话总结:结合apache配置文件中的英文说明和配置详解一起看 1.apache模块配置用的什么标签? IfModule 例如: <IfModule ...
- tomcat常用配置详解和优化方法
tomcat常用配置详解和优化方法 参考: http://blog.csdn.net/zj52hm/article/details/51980194 http://blog.csdn.net/wuli ...
- SQL点滴27—性能分析之执行计划
原文:SQL点滴27-性能分析之执行计划 一直想找一些关于SQL语句性能调试的权威参考,但是有参考未必就能够做好调试的工作.我深信实践中得到的经验是最珍贵的,书本知识只是一个引导.本篇来源于<I ...
随机推荐
- vscode双击没反应,后台也看不到进程的解决方案
百度找的解决方案: cmd窗口执行 netsh winsock reset 重置命令. 删除Romaing下的Code文件夹 修改Code/User/locale.json(我没找到这个文件)中的&q ...
- jenkins实践篇(2)—— 自动打tag的可回滚发布模式
大家好,我是蓝胖子,在上一篇我简单介绍了如何基于特定分支做自动编译和发布,在生产环境中,为了更加安全和快速回滚,我采取的是通过对代码打tag的方式来进行部署,下面我将详细介绍整个发布过程的逻辑. 发布 ...
- IT运营与DevOps:有何不同?
IT 运营和 DevOps 满足许多现代企业密切相关的需求.然而,尽管这两种角色之间有许多相似之处,但也有重要的区别,将 IT 运营与 DevOps 混为一谈是错误的. 本文通过解释每种类型的角色是做 ...
- postgresql 标量子查询改写的各种姿势
同事提供一条SQL,原执行时间需要 3.6S ,反馈比较慢需要优化一下,废话不说贴SQL: 原SQL: select ((select count(1) FROM AAAAAAAAA wf join ...
- 开源模型 Zephyr-7B 发布——跨越三大洲的合作
最近我们刚刚发布了新的开源模型 Zephry-7B,这个模型的诞生离不开全球三大洲开源社区的协作 ️. 我们的 CSO Thomas 录了一个视频介绍了它的起源故事: 就在几个月前,巴黎的一个新团队发 ...
- STM32CUBEIDE中 Debug 和 Release 的作用/区别/使用场景
基本主流IDE都有该功能选项例如Keil MDK, IAR, Eclipse, VS等, 这里使用STM32CUBEIDE来举例 创建STM32CUBEIDE工程后默认有2个目标选项 Debug / ...
- [MDP.NetCore] 使用AzureAD+服務主體,快速建立兩個服務之間的Service身分認證
MDP.AspNetCore.Authentication.AzureAD.Services for Service Principal MDP.AspNetCore.Authentication.A ...
- (Good topic)哈希表:最长回文串(3.19 leetcode每日打卡)
给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串. 在构造过程中,请注意区分大小写.比如 "Aa" 不能当做一个回文字符串. 注意: 假设字符串的长度不 ...
- 【报错:For input string: ""报错: get connection error! 报错:java.lang.NullPointerException 报错:java.lang.NumberFormatException: For input string: "id"】解决方案
原因:没有input数据进入,但是当我填写数据进入的时候 get connection error! 这个消息,是我要抛出去的异常,源代码下 我一开始觉得是代码书写的问题,找.......... 应该 ...
- 时间复杂度为 O(n^2) 的排序算法
对于小规模数据,我们可以选用时间复杂度为 O(n2) 的排序算法.因为时间复杂度并不代表实际代码的执行时间,它省去了低阶.系数和常数,仅代表的增长趋势,所以在小规模数据情况下, O(n2) 的排序算法 ...