每次都需要解释大量指令?使用 PolarDB-X 向量化引擎

简介: 向量化引擎为PolarDB-X的表达式计算带来了显著的性能提升。

 

介绍

 

PolarDB-X是阿里巴巴自研的云原生分布式数据库,采用了计算-存储分离的架构,其中计算节点承担着大量的表达式计算任务。这些表达式计算涉及到SQL执行的各个环节,对性能有着重要的影响。为此PolarDB-X引入向量化执行引擎,为表达式计算带来了几十倍的性能提升。

 

传统数据库执行器的缺陷

 

现代数据库系统的执行引擎,大多采用一次计算一行数据(Tuple-at-a-time)的处理方式,并且需要在运行时对数据类型进行解析和判断,来适应复杂的表达式结构。我们称之为“标量(scalar)表达式”。这种方式虽然易于实现、结构清晰,但是当需要处理的数据量增大时,它具有显著的缺陷:

 

为了适应复杂的表达式结构,计算一条表达式往往需要引入大量的指令;对于行式执行来说,处理单条数据需要算子树重新进行指令解释(instruction interpretation),从而带来了大量的指令解释开销。据论文《MonetDB/X100: Hyper-Pipelining Query Execution》统计,在MySQL执行TPC-H测试集的 Query1 时,指令解释就耗费了90%的执行时间。

 

此外,在最初的Volcano结构设计中,算子内部逻辑并没有避免分支预测(branch prediction)。错误的分支预测需要CPU终止当前的流水线,将ELSE语句中的指令重新载入,我们将这一过程称为pipeline flush或pipeline break。频繁的分支预测错误会严重影响数据库的执行性能。

 

向量化执行系统

 

数据库向量化执行系统最早由论文《MonetDB/X100: Hyper-Pipelining Query Execution》提出,它有以下几个要点:

  1. 采用vector-at-a-time的执行模式,即以向量(vector)为数据组织单位。
  2. 使用向量化原语(vectorization primitives)来作为向量化算子的基本单位,从而构建整个向量化执行系统。原语中避免产生分支预测。
  3. 使用code generation(代码生成)技术来解决静态类型带来的code explosion(代码爆炸)问题。

 

向量化引擎为PolarDB-X的表达式计算带来了显著的性能提升。在下图中,横轴为向量大小,纵轴为吞吐量,不同标量表达式和向量化表达式的性能测试对比结果如下:

 

case表达式性能测试对比结果如下:

 

整体流程

 

PolarDB-X中,向量化表达式的执行分为以下几个阶段:

  1. 用户SQL经解析后,在validator中进行校验,推导和修正表达式的类型信息;这一阶段为向量化运算提供正确的、静态的类型信息;
  2. 在优化器形成执行计划之后,需要对表达式树进行表达式绑定,实例化对应的向量化原语,同时分配好向量下标,供运行时内存分配;
  3. 执行阶段,依据Volcano式的结构,自顶向下的触发执行向量化原语,并将向量作为运行时数据结构。

 

 

运行时结构

 

数据结构

 

在PolarDB-X向量化执行系统中,采用以下的数据结构来存放数据:

 

向量化表达式执行时,所有的数据都会存放在batch这一数据结构中。batch由许多向量(vector)和一个selection数组而组成。其中,向量vector包括一个存储特定类型的数值列表(values)和一个标识null值位置的null数组组成,它们在内存中都是连续存储的。null数组中的bit位以0和1来区分数值列表中的某个位置是否为空值。

 

我们可以用vector(type, index)来标识batch中一个向量。每个向量有其特定的下标位置(index),来表示向量在batch中的顺序;类型信息(type)来指定向量的类型。在进行向量化表达式求值之前,我们需要遍历整个表达式树,根据每个表达式的操作数和返回值来分配好下标位置,最后根据下标位置统一为向量分配内存。

 

延迟物化

 

selection数组的设计体现了延迟物化的思想,参考论文《Materialization Strategies in a Column-Oriented DBMS》。所谓延迟物化,就是尽可能地将物化(matrialization)这一过程后推,减少内存访问带来的开销。在执行表达式计算时,往往会先经过Filter表达式过滤一部分数据,再对过滤后的数据执行求值处理;每次过滤都会影响到batch中所有的向量。以上图中的batch为例,如果我们针对第0个向量设置 vector(int, 0) != 1这一过滤条件,假设vector(int, 0)中有90%的数据满足该过滤条件(选择率selectivity = 0.9),那么我们需要将batch中所有向量90%的数据重新物化到另一块内存中。而如果我们只记录满足该过滤条件的位置,存入selection数组,我们就可以避免这一物化过程。相应的,以后每次向量化求值过程中,都需要参考此selection数组。

 

向量化原语

 

向量化原语是向量化执行系统中的执行单位,它最大程度限制了执行期间的自由度。原语不用关注上下文信息,也不用在运行时进行类型解析和函数调用,只需要关注传入的向量即可。它是类型特定(Type-Specific)的,即一类原语只能处理特定类型。

 

向量化原语的主体是Tight-Loop的代码结构。在一个循环体内部,只需要进行取值和运算即可,没有任何的分支运算和函数调用。一个简单的向量化原语结构如下所示:

 

map_plus_double_col_double_col(int n,
double*__restrict__ res,
double*__restrict__ vector1, double*__restrict__ vector2,
int*__restrict__ selection)
{if (selection) {for(int j=0;j<n; j++) {int i = selection[j];res[i] = vector1[i] + vector2[i];} } else {for(int i=0;i<n; i++)res[i] = vector1[i] + vector2[i];}   
}

注:*左右滑动阅览

 

其运算过程利用了selection数组,逐步对向量进行取值、运算和存值,如下图所示:

 

向量化原语带来了以下优点:

  1. Type-Specific以及Tight-Loop的结构,大大减少了指令解释的开销;
  2. 避免分支预测失败和虚函数调用对CPU流水线的干扰,同时也能有利于 loop pipeline 优化【论文引用】
  3. 从向量中存取数据,有利于触发cache prefetch,减少cache miss带来的开销。

 

我们为各种标量化表达式提供相应的原语实现,从而完成从标量到向量化的转变。例如将加法运算 plus(Object, Object) 针对不同操作数类型生成原语,包括plus(double,double),plus(long, long)等。

 

短路求值

 

在向量化原语的基础上,我们可以进一步对分支运算(也称为控制流运算 Control-Flow)进行短路求值(short-circuit calculation)优化,提升表达式计算的性能。

 

例如,case 表达式由n个when表达式、n-1个then表达式、1个else表达式构成。对于表达式

 

select case when a > 1 then a * 2when b > 1 then b * 2else a * b

 

具有以下树形结构:

 

由于标量化表达式按照volcano结构编排,并提供了统一的next()的接口,case表达式必须执行完所有的子表达式a>1,a*2,b>1,b*2和a*b之后,将全部结果汇总到一起,最后做case语义处理。这种执行方式不能根据when表达式的处理结果及时终止计算过程,而是对全部子表达式无差别执行。

 

引入向量化执行器以后,我们可以设计短路求值来优化此问题,每一个子表达式需要被提供合适的selection数组,从而正确选择列中合适的位置来进行向量运算。

 

作者:君启

原文链接​​​​​​​

本文为阿里云原创内容,未经允许不得转载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/514116.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

稳定性保障6步走:高可用系统大促作战指南!

简介&#xff1a; 年年有大促&#xff0c;大家对于大促稳定性保障这个词都不陌生&#xff0c;业务场景尽管各不相同&#xff0c;“套路”往往殊路同归&#xff0c;全链路压测、容量评估、限流、紧急预案等&#xff0c;来来去去总少不了那么几板斧。跳出这些“套路”&#xff0c…

观测云品牌正式亮相,携手通信院共推国内可观测性概念与技术发展!

2021年9月17日&#xff0c;由中国信息通信研究院、中国通信标准化协会联合主办的“2021 OSCAR 开源产业大会”在北京中关村拉开序幕。会上正式发布了《开源治理标准与评估结果》《开源法则》等多项重要成果&#xff0c;而由通信院主导、驻云科技参与制定的《中国可观测性标准》…

闲鱼如何建设技术舆情治理体系 (多图多代码)

简介&#xff1a; 从日志、监控、性能检测几个方面建设了有日志可查、有数据可依的排查体系 现状和问题 闲鱼的舆情治理&#xff0c;依托阿里集团的设施建设&#xff0c;有以下能力&#xff1a; 崩溃异常、性能在线聚合查询&#xff1b;本地日志&#xff1a;TLog&#xff1b;在…

全球企业KVM开源贡献榜发布,腾讯云、华为、阿里巴巴等入围

9月16日晚&#xff0c;在全球虚拟化顶级技术峰会 KVM Forum 上&#xff0c;2021年度全球企业 KVM 开源贡献榜正式发布&#xff0c;华为、腾讯云、阿里巴巴等中国公司纷纷入围。其中&#xff0c;腾讯云更是连续第五年入围&#xff0c;成为唯一取得这一成就的中国企业。 据了解&a…

使用MQTT与函数计算做热力图的实践

简介&#xff1a; 在各类场景中&#xff0c;关于上报数据的处理无处不在&#xff0c;而以上提到的场景都可以通过本方案的MQTTFCAPI Gateway的方式参考优化来实现。 前言 最近几年&#xff0c;我们在一些商场、图书馆、机场或港口环境里&#xff0c;经常可以看到一些机器人在转…

Google 宣布推出隐私计算核心服务;Amazon Managed Grafana正式可用……

NEWS本周新闻回顾Google 宣布推出隐私计算核心服务今年 5 月 Google I/O 开发者大会发布 Android 12 的同时&#xff0c;宣布了隐私计算核心&#xff08;Private Compute Core&#xff09;。这是一项开源计划&#xff0c;提供了一个沙盒式的安全环境&#xff0c;将智能回复、实…

谈身份管理之基础篇 - 保障云上安全,从[规范账号使用]开始

简介&#xff1a; 身份和密钥的管理&#xff0c;是企业上云的重中之重&#xff1b;每年国内外都有因为身份和密钥的管理不善&#xff0c;或泄露&#xff0c;或误操作导致严重的生产事故或者数据泄露。本期小编将重点聊聊云上身份的那些值得关注的事儿。 引言 2021年初&#xf…

开课啦 dubbo-go 微服务升级实战

简介&#xff1a; 杭州开课啦教育科技有限公司是一家致力于为中小学生提供学习辅导的在线教育公司&#xff0c;目前公司后端服务基础设施主要依托于阿里云原生&#xff0c;其中包含计算、网络、存储以及 Kubernetes 服务。 技术选型背景 2020 年是开课啦公司发展壮大的一年&am…

gui界面设计心得体会 python_Python笔记-GUI界面设计(tkinter)

文章目录前言相关介绍一、函数方法介绍二、导入tkinter库三、窗口[1]. 创建[2]. 设置标题[3]. 设置大小[4]. 设置背景色[5]. 删除窗口四、按钮[1]. 创建[2]. 放置按钮(绝对位置)[3]. 放置按钮(相对位置)[4]. 代码五、单行文本[1]. 创建[2]. 代码前言此篇文章介绍的是有关图形用…

阿里云科技驱动“数字化转型”,助力中小企业发展“突围”

2020年至2021年的新冠疫情&#xff0c; 让全世界进入了困难模式&#xff0c;国家的经济运行不得不放缓脚步。这不仅给每个人造成了很多不便&#xff0c;更是给人们所依赖的企业组织&#xff0c;造成了巨大的影响。每一个微观个体所感受的只是自己身边肉眼可见的影响&#xff0c…

这些中秋礼盒绝了,悄悄惊艳互联网人

整理 | 王晓曼出品 | 程序人生 &#xff08;ID&#xff1a;coder _life&#xff09;来了来了它们来了&#xff0c;2021年腾讯、阿里、百度、字节等诸多互联网大厂带着他们的中秋礼盒来了&#xff01;“八月十五月儿圆&#xff0c;中秋月饼香又甜”&#xff0c;没有月饼的中秋节…

想成为全栈工程师,要做到哪几点?

简介&#xff1a; 如何成为一名全栈工程师&#xff1f;需要具备哪些技术积累&#xff1f;成为全栈工程师有哪些好处&#xff1f;希望本文能为期望成为全栈工程师的同学提供一点帮助&#xff0c;和同学们一起分享交流。 作为开发者&#xff0c;我们不过度区分服务端 server 客户…

DDD as Code:如何用代码诠释领域驱动设计?

简介&#xff1a; 相较于常规的MVC架构&#xff0c;DDD更抽象、更难以理解&#xff0c;各个开发者对DDD的解释也不尽相同。那么哪种设计方式才更好&#xff1f;在学习时如何知道哪种DDD更正统&#xff0c;没有被别人带歪&#xff1f;本文尝试使用“DDD as Code”的概念&#xf…

谈身份管理之进阶篇 - 快速了解从管理到治理的最佳方案

简介&#xff1a; 云上身份安全是当今企业管理者和云上运维团队所面临的挑战之一&#xff0c;针对云上身份管理不全面所产生的风险究竟又哪些&#xff1f;又应当如何应对&#xff1f;本文将结合案例和最佳实践与您分享。 引言 云上身份安全是当今企业管理者和云上运维团队所面…

报名倒计时 | TeaTalk 深圳站邀您共话安全云世界

对越发复杂的网络环境&#xff0c;保障网络安全势不可挡&#xff0c;为此国家也对应颁布了系列规章政策。除相关政策外&#xff0c;网络安全及云安全也同时被列入国家规划重点发展方向&#xff0c;随着“十三五”规划逐渐落实&#xff0c;“十四五”规划制定实施&#xff0c;推…

KubeNode:阿里巴巴云原生 容器基础设施运维实践

简介&#xff1a; 目前 KubeNode 已经覆盖了阿里巴巴集团的所有的 ASI 集群&#xff0c;接下来&#xff0c;将随着阿里巴巴集团“统一资源池”的项目&#xff0c;推进 KubeNode 覆盖更大的范围、更多的场景&#xff0c;让云原生的容器基础设施运维架构发挥更大的价值。 阿里巴巴…

扫盲贴|如何评价一款App的稳定性和质量?

简介&#xff1a; 我们不应该为了掩盖代码质量问题&#xff0c;通过手动try catch去规避某些问题&#xff0c;这样有可能会打断用户的正常使用&#xff0c;并造成感知性的阻断反馈&#xff0c;应该从用户使用APP时的真实感知出发&#xff0c;当出现问题时及时捕获和处理问题。 …

聊聊 5G 云专线

作者|小枣君来源|鲜枣课堂通过本文&#xff0c;和大家分享探讨一下 5G 云专线。我们从今天文章的标题开始说起吧。5G、云、专线&#xff0c;分开的3个词&#xff0c;作为通信人&#xff0c;大家应该都懂&#xff08;专线可能陌生一点&#xff09;。但是&#xff0c;合起来之后&…

谈AK管理之基础篇 - 如何进行访问密钥的全生命周期管理?

简介&#xff1a; 我们也常有听说例如AK被外部攻击者恶意获取&#xff0c;或者员工无心从github泄露的案例&#xff0c;最终导致安全事故或生产事故的发生。AK的应用场景极为广泛&#xff0c;因此做好AK的管理和治理就尤为重要了。本文将通过两种AK使用不安全的典型案例&#x…

2021信服云创新峰会:托管云成上云第三种选择

9月17日&#xff0c;以“万物皆可云”为主题的信服云创新峰会成功举办。中国工程院院士、中国科学院计算技术研究所研究员倪光南&#xff0c;IDC咨询&#xff08;北京&#xff09;有限公司副总裁/首席分析师武连峰&#xff0c;深信服科技股份有限公司创始人、CEO何朝曦&#xf…