Adaptive Execution of Compiled Queries 论文解读

简介: 本篇是TUM的内存数据库HyPer针对compile-based执行框架的改进。其中涉及到HyPer的动态编译和并行执行框架动态编译文章的结尾提到了编译执行系统存在的2个问题,其中之一就是:不可控的编译时间。

本篇是TUM的内存数据库HyPer针对compile-based执行框架的改进。其中涉及到HyPer的动态编译和并行执行框架

动态编译文章的结尾提到了编译执行系统存在的2个问题,其中之一就是:不可控的编译时间。

背景

在具体的应用中,基于LLVM的compiler framework虽然已经是比较快速的了,但对于复杂的查询语句,其编译的时间还是很长的,如果处理的数据量比较少,导致执行时间很短,则编译/执行的比例将会非常高,产生非常差的用户体验,可能不如解析执行的响应速度快。有些非常复杂的(自动生成)SQL,甚至无法编译出来,因此如果没有自适应编译执行的能力,compile-based的系统在实用性上是有很大缺陷的。

image.png

可以看到,整个optimize的过程+code generation的过程,相对于LLVM opt+compile,占比极低,大概是50 - 100倍的差异。

总体思路

为此HyPer中引入了解析执行的能力,它总是要先把query plan通过Codegen生成LLVM IR的表示,但可以通过快速的translation转换成一种自定义的LLVM bytecode,然后使用解析器进行解析执行,从而避免编译过程。

基于这种机制,提出了自适应切换execution mode的framework,可以有3种执行mode:

  1. 基于LLVM bytecode解析执行(高效),这是默认模式。
  2. 基于LLVM IR做无优化的编译,生成machine code
  3. 基于LLVM IR做有优化的编译,生成更高效的machine code

image.png

可以看到,3种执行模式,bytecode的translation是很快的,而非优化编译/优化+编译,则要慢很多。

这样其实编译执行 vs 解析执行,本质就是吞吐量 vs 延迟, 编译时间会增加单条query的rt,但编译的代码执行效率更高可以产生更高计算吞吐,解析执行可以快速响应因此对rt影响更小,但代码效率低会影响吞吐。

此外,由于HyPer的mosel-driven的并行执行框架,在compile期间是串行的,所有worker thread都要等待直到编译完成,而解析方式可以立即开始并行执行。

理想情况下,应该是:

  • 对于小型的query(数据量小),使用解析执行,保证低延迟
  • 对于大型的query,使用优化编译执行,保证高吞吐量
  • 对于中型的query,使用非优化编译执行,相当于前两者的折中

自适应方案

HyPer中基于动态编译 + morsel驱动的并行执行可以用下图理解:

image.png

plan会被优化器编译为多个pipeline job(上图中右侧各颜色所示),每个线程Tx针对各个morsel粒度的数据,执行编译生成的一个个的pipeline job。

在执行过程中,针对每个pipeline job,动态利用feedback进行推断,选择后续是否需要切换到编译模式来更快速的的执行,这种基于morsel的方式是细粒度的,这样可以使一个query中,长时间的part和短时间的part,使用不同的execution mode,效率达到最优。

为了实现自适应编译框架,需要3个基本组件:

  1. 高效的bytecode 解析器
  2. Track 执行过程中的信息,从而动态决定是否切换,而不是提前利用optimizer的cost/card estimation来静态决定
  3. 根据推断动态切换execution mode

基本模式是,所有query总是以解析模式开始,多worker threads并行执行,在执行中通过收集+推断,当判断后续采用compile方式更有益时,则使用一个worker thread开始异步编译过程,其他worker继续解析执行,当编译完成时,后续所有worker都切换到compiled function继续执行。这种处理方式是以pipeline为单元的,并以morsel为监控+推断+切换的基本单位。

  • Track Query progress

基于HyPer morsel-driven的并行执行方式,一个pipeline一个pipeline的处理,每个pipeline中,各个worker thread在处理完一个morsel后,要更新相关的执行timing信息,而由一个特定的worker thread,在完成每个morsel后,要进行推断过程。

  • 切换

由于各个worker thread在处理morsel时是相互独立的,他们各自使用什么mode来来执行时无关的,因此只要执行的语义相同,切换就会很自然,各种执行方式都是等价的,HyPer中使用一个handle结构来做了抽象,其中包含了不同execution mode的执行函数,通过切换执行函数的指针,即可很自然完成切换,如下图所示

image.png

  • 切换规则

在每个morsel处理完成时,一个worker thread要判断是否进行切换,就是通过feedback估计当前pipeline中,tuple的处理速率,由于每个pipeline的起点 -> 终点都是物化点,morsel的数据量已知,因此可以根据当前速率,预估剩余的执行时间,也会估计compilation time + compiled code的执行加速比(经验估计),然后计算其他2种mode的执行时间,如果更优则开始启动编译。在编译的同时,其他worker thread继续解析执行,具体算法如下:

image.png

这里r0/r1/r2是处理tuple的速率,c1/c2是编译时间,t0/t1/t2是计算的剩余执行时间。

  • 高效的解析执行

HyPer使用了一种对LLVM IR进行对等translation的方式,转换为bytecode的形式(类似informix stored procedure),解析器通过对OPCODE的解析来做switch case的执行逻辑,相当于java的VM。

image.png

上图是HyPer VM中解析OPCODE并执行的代码片段,可以看到有大量的指令类型。

性能

image.png

上图是对TPCH Q11的3种执行mode下的性能profiling,optimized compilation没有给出因为编译时间实在太长。从图中可以看到这种细粒度(morsel)的控制,可以让长的执行部分(scan partsupp1, scan partsupp2) 使用compiled code,短的(hash table scan)则是解析执行,混合起来得到最佳效果。

目录
相关文章
|
SQL 机器学习/深度学习 分布式计算
Apache Spark 3.0.0重磅发布 —— 重要特性全面解析
开发了近两年(自2018年10月份至今)的Apache SparkTM 3.0.0正式发布! Apache SparkTM 3.0.0版本包含3400多个补丁,是开源社区做出巨大贡献的结晶,在Python和SQL功能方面带来了重大进展并且将重点聚焦在了开发和生产的易用性上。同时,今年也是Spark开源10周年,这些举措反映了Spark自开源以来,是如何不断的满足更广泛的受众需求以及更多的应用场景
Apache Spark 3.0.0重磅发布 —— 重要特性全面解析
阿里云商标注册申请官方入口(附商标自助申请流程)
阿里云商标分为商标智能注册申请、商标安心注册申请和商标顾问注册申请
33611 4
阿里云商标注册申请官方入口(附商标自助申请流程)
|
安全 网络安全 定位技术
华为基础数通知识
了解基本的数通知识,成为更好的自己
|
12月前
|
存储 安全 Shell
Linux Shell变量删除(从零开始掌握变量清理技巧)
本文介绍如何在Linux Shell中删除变量,涵盖普通变量、环境变量及批量删除方法,强调使用`unset`命令管理变量生命周期,提升脚本安全与健壮性,适用于Shell脚本开发与系统管理。
|
7月前
|
监控 安全 大数据
信息系统规划
本文系统梳理信息系统规划全体系:涵盖规划价值、组织方法、核心原则、发展阶段、总体框架、分系统划分、组织与技术体系、任务及保障部署,并详解需求挖掘、场景建模、一致性检查与持续改进等11项工作要点,集成SST、BSP、CSF等五大经典战略方法。
798 0
|
11月前
|
DataWorks 监控 数据可视化
数据可视化大屏项目
数据可视化大屏是数据价值具象化的核心工具,广泛应用于企业实时监控、运营分析与大型活动指挥。本文系统解析从多源数据整合、DataWorks加工、DataV可视化设计,到WebSocket实时推送、权限控制与性能优化的全链路实践,并结合双11实战案例,揭示高并发、高实时场景下的技术落地逻辑,助力企业构建高效、安全、流畅的决策中枢。(238字)
853 0
|
存储 缓存 监控
什么是线程池?它的工作原理?
我是小假 期待与你的下一次相遇 ~
714 1
|
安全 Windows
应用程序错误,该内存不能为read
遇到"内存不能为read"错误时,可以按照以下步骤排查和解决:
|
存储 人工智能 缓存
DeepSeek 3FS解读与源码分析(1):高效训练之道
本文从设计文档和源码,深入对 3FS 在文件系统和 AI workload 方面做一系列的解读。如有错误欢迎指正。
|
API 开发工具 开发者
HarmonyOS NEXT实战:拨打电话
本课程介绍如何在HarmonyOS SDK中使用Telephony Kit实现拨打电话功能。通过CallPhoneDemoPage示例,讲解如何输入电话号码并调用makeCall接口拨号,涉及call模块的使用及设备通话能力检测。
8262 0