PgSQL内核特性 - push-based pipeline 执行引擎

PgSQL内核特性 - push-based pipeline 执行引擎

数据库的SQL执行引擎负责处理和执行SQL请求。通常情况下,查询优化器会输出物理执行计划,一般由一系列的算子组成。当前,有两种算子流水线构建方式:1)需求驱动的流水线,由算子不断从下级算子拉取数据;2)数据驱动的流水线,由算子将每个数据推送给父算子。

论文《Push versus pull-based loop fusion in query engines》说明了push和pull执行引擎的区别:

8c18a067865b3b72bc404f5e55b3ded6.png

Pull流水线基于经典的火山迭代器模型,将每个操作抽象成一个算子。整个SQL语句构成一个算子树,从树顶递归调用next接口,向下层算子请求数据,直到查询计划树的叶子节点。优缺点:

1)以行为单位处理数据,每一行数据的处理都会调用next接口(当然也可以基于pull模型改造成以batch为单位处理数据)

2)以行为单位处理,会导致CPU缓存使用效率低下

3)火山模型接口看起来干净且易懂

论文《Efficiently compiling efficient query plans for modern hardware》提出的Push模型采用Pipeline来组合算子,自底而上Push调度。Pipeline的目的:1) 降低计算节点的任务调度代价;2) 提升 CPU 利用率;3)充分利用多核计算能力,提升查询性能、自动设置并行度、消除人为设置并行度的不准确性。

1、PgSQL的pipeline执行引擎

GSoC 2017中有个改造pipeline的项目,基本思想是遍历执行计划树,找到叶子节点,从叶子节点开始获取数据,然后推送给各个父节点。

a5f26d7aae987eb5983308fe8bf162a6.png

执行器中,使用RunNode函数递归调用,得到叶子节点:先遍历右节点,然后再遍历左节点;当然若没有右节点,则直接遍历左节点;当没有左右子节点时,就到了叶子节点,那么通过pushTuple来推送数据。

20c4d9a62648ddac5a190030b6aaaf0f.png

pushTuple根据父节点类型调用各自推送函数,将数据推送给父节点,比如上面流程:当父节点是LimitState时,调用pushTupleToLimit进行推送。

我们看下SeqScan:其实就是从存储引擎获取数据,进行过滤和投影,然后根据父节点类型,推送给父节点。

pushTupleToSeqScan(SeqScanState *node)heappushtups(...,node->ss.ps.parent,node)|--  get a tuple in the pageSeqPushHeapTuple(HeapTuple tuple, PlanState *node,SeqScanState *pusher)|--  slot = SeqStoreTuple(pusher, tuple);|--  ExecQual && ExecProject|--  return pushTuple(slot, node, (PlanState *) pusher);|--  if (!node){//pusher top level node, send to destreturn SendReadyTuple(slot, pusher);}

对于hash join来说,需要先构建hash表,然后外表数据从hash表中进行探测;pipeline引擎中怎么推送完成hash join呢?

从RunNode函数中可以也可以看到,他是先从内表分支开始推送数据,推送给Hash节点构建hash表,然后推送给父节点。pushTuple函数中,当hash join的右分支推送上来时,pushTupleToHashJoinFromInner函数仅获取hash表,并不继续向上推送;而是HashJoin的左子分支推送上来的数据进入pushTupleToHashJoinFromOuter,进行hash探测,找到符合条件的数据,并向上层父节点推送join结果:

e851bc93932fa5917db0f59154604da2.png

可以得知,该改造并没有充分利用各个叶子分支并行,未来可以向整个方向进行优化。

3、效果

TPCH的 q1, q3, q4, q5,q10, q12 and q14:

9d647d6545ac716f0406a30a79a5d3e1.png

4、总结

78be103c5d8b333839e551f428290f57.png

1)红色线:找叶子节点递归方向;蓝色线:数据推送方向

2)物理执行计划被执行器ExecInitNode初始化时,参数带入父节点,从而将执行计划构建为子节点-->父节点的关系

3)通过RunNode递归调用,找到叶子节点SeqScan。获取数据后推送给父节点Hash

4)Hash节点构建hash表,推送给父节点HashJoin。因为数据处于HashJoin的右分支,所以通过pushTupleToHashJoinFromInner仅获取hash表,到此该分支推送执行就结束了

5)左分支SeqScan获取数据后推送给HashTable,HashJoin由pushTupleToHashJoinFromOuter执行,进行hash探测并将join的结果推送给上层父节点,若无上层父节点,则推送给用户,至此push-based pipeline执行结束。

6)该改造,并没有将pipeline依据叶子节点进行并行执行,仍旧有提升空间;当然,仅作为一个初次尝试,验证push-based pipeline执行。和clickhouse、starrocks等相比,仍旧有很大不足。

5、参考

https://postgrespro.com/list/thread-id/2309959

https://wiki.postgresql.org/wiki/GSoC_2017#Implementing_push-based_query_executor

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【大厂AI课学习笔记】【1.6 人工智能基础知识】(4)深度学习和机器学习

关于深度学习和机器学习,出来包含关系之外,还有如上总结的知识点。 分别从特征处理、学习方法、数据依赖、硬件依赖等4个方面,进行了总结。 从特征处理上看:深度学习从数据中习得高级特征,并自行创建新的特征。这比普…

python入门篇11-面向对象的基础使用

全文目录,一步到位 1.前言简介1.1 专栏传送门1.1.1 上文小总结1.1.2 上文传送门 2. python基础使用2.1 面向对象的基础使用2.1.1 创建类2.1.2 使用对象(定义成员变量)2.1.3 成员方法的定义与使用2.1.4 构造方法的使用2.1.5 常用魔术方法 2.2 面向对象思想核心2.2.1 面向对象_私…

立体视觉几何 (三)

立体视觉系统概述 误差分析 考虑对应于深度 Z 的视差 d 的匹配对。我们想要评估 ΔZ,即视差误差引起的深度误差。将 Z 对 d 求导,得到: 立体视觉中基线(baseline)、焦距(focal length)和立体重…

游泳时可以听歌的耳机有哪些?戴游泳耳机有哪些好处?

游泳和跑步在某种程度上相似,特别是在短距离冲刺时,大脑似乎变得空白,而在中长距离的有氧运动中,身体感到疲劳,但大脑却异常清晰,时间却显得格外漫长。如何打发时间,让游泳锻炼变得不无聊&#…

中国电子学会2020年12月份青少年软件编程Scratch图形化等级考试试卷三级真题(编程题)

编程题(共3题,共30分) 36.绘制图形 1. 准备工作: (1)保留默认小猫角色,隐藏角色; (2)背景为白色背景。 2. 功能实现: (1)绘制如下图所示的图案; &…

点云标注工具

目录 3d手势识别 c 3d关键点,Bounding Box Labels Rectangle Labels KITTI 3D Ground Truth Annotator c标注工具 3d手势识别 GitHub - 99xtaewoo/Automated-Hand-3D-pose-annotation-Tool: Automated Hand 3D pose annotation Tool c 3d关键点,Bou…

【办公类-23-02】20240212徐迟《江南小镇(南浔古镇)》“水晶晶”和景物”数量提取66个

作品展示 背景需求: 2024年春节前夕,我与家人前往浙江湖州、南浔旅行。探寻母亲、外婆外公、曾外婆的祖籍南浔的风土人情。在古镇上看到了”著名诗人“徐迟”的介绍。 母亲说:我的姑母就是在南浔读了小学和中学,她小学时的老师就…

机器学习系列——(十三)多项式回归

引言 在机器学习领域,线性回归是一种常见且简单的模型。然而,在某些情况下,变量之间的关系并不是线性的,这时候我们就需要使用多项式回归来建模非线性关系。多项式回归通过引入高次项来扩展线性回归模型,从而更好地拟…

Github 2024-02-12 开源项目日报 Top10

根据Github Trendings的统计,今日(2024-02-12统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目3Python项目3JavaScript项目1TypeScript项目1C项目1C项目1PowerShell项目1非开发语言项目1 SubQuery…

Elasticsearch:使用查询规则(query rules)进行搜索

在之前的文章 “Elasticsearch 8.10 中引入查询规则 - query rules”,我们详述了如何使用 query rules 来进行搜索。这个交互式笔记本将向你介绍如何使用官方 Elasticsearch Python 客户端来使用查询规则。 你将使用 query rules API 将查询规则存储在 Elasticsearc…

docker之centos7容器常用命令和服务安装

一、前言 以前我们如果想在windows环境下使用linux系统,最早的是一台主机上安装双机系统,再后来我们有了VMware,可以通过workstations虚拟化平台安装虚拟机。现在我们还可以通过docker安装linux容器,容器更轻量也更便捷。不过凡事…

工业级加固平板丨亿道三防平板电脑丨安卓工业平板丨改善车队管理

在现代物流和运输行业中,车队管理是一个复杂而重要的任务。为了更好地管理车队,提高工作效率和减少成本,许多企业正在采用新技术和工具。其中,三防平板电脑作为一种功能强大且适应恶劣环境的设备,已经在车队管理中得到…

C++联合体详解!

个人主页:PingdiGuo_guo 收录专栏:C干货专栏 大家伙新年快乐,今天我们来了解一下C联合体。 文章目录 1.联合体 1.1联合体的概念 1.2联合体的思想 1.3联合体的作用 1.3.1内存优化 1.3.2二进制数据操作 1.3.3类型转换 1.3.4解决特定问…

交叉熵损失函数基本概念及公式

Cross-Entropy Loss 1.二分类2. 对于多类别分类问题,其公式可以表示为:3. 公式深度挖掘解释——交叉熵损失函数公式中(log)的解释总结 交叉熵损失函数(Cross-Entropy Loss)是在机器学习和深度学习中常用的一…

Ainx-V0.2-简单的连接封装与业务绑定

📕作者简介: 过去日记,致力于Java、GoLang,Rust等多种编程语言,热爱技术,喜欢游戏的博主。 📗本文收录于Ainx系列,大家有兴趣的可以看一看 📘相关专栏Rust初阶教程、go语言基础系列…

【EAI 020】Diffusion Policy: Visuomotor Policy Learning via Action Diffusion

论文标题:Diffusion Policy: Visuomotor Policy Learning via Action Diffusion 论文作者:Cheng Chi, Siyuan Feng, Yilun Du, Zhenjia Xu, Eric Cousineau, Benjamin Burchfiel, Shuran Song 作者单位:Columbia University, Toyota Research…

MATLAB知识点: unique函数 提取数组中的唯一值

​讲解视频:可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇(数学建模清风主讲,适合零基础同学观看)_哔哩哔哩_bilibili 节选自第3章 3.4.5 集合运算 unique函数可用来提取数组中的唯…

Stable Diffusion 模型下载:majicMIX lux 麦橘辉耀 - V3

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十

算法沉淀——位运算(leetcode真题剖析)

算法沉淀——位运算 常用位运算总结1.基础位运算2.确定一个数中第x位是0还是13.将一个数的第x位改成14.将一个数的第x位改成05.位图6.提取一个数最右边的17.删掉一个数最右边的18.异或运算9.基础例题 力扣题目讲解01.面试题 01.01. 判定字符是否唯一02.丢失的数字03.两整数之和…

LeetCode Python - 11.盛最多水的容器

文章目录 题目答案运行结果 题目 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&a…