如何从0深入PostgreSQL内核写一个执行器算子?

news2025/1/10 2:34:58

如何从0深入PostgreSQL内核写一个执行器算子?

大家好,我叫光城,昨天分享了一个主题:如何从0深入PostgreSQL内核写一个执行器算子?今天来总结一下,本篇文章的直播回放可以在b站观看,点击原文或者识别下方二维码即可!

97d22bde560874f5e9fc94004b18e0d6.jpeg

1bf62c73599a14aef97bf52f166a249c.jpeg

b2959f5ab606ba031ad412b5465a86fa.jpeg






1.执行器概论

执行器作为连接查询计划和存储引擎的桥梁,负责从存储引擎读取数据,并基于查询计划树执行对应的算子,并得到最终的查询结果。

执行器的处理模型主要分为两大类:基于拉操作的模型和基于推操作的模型。

1.1 Pull模型

也被称为火山模型,是指从最顶层的输出节点开始,不断从下层节点拉取数据,因此是一种自顶向下的执行方式。

优点

  • 通用性:拉模型不受数据及规模的限制,可以处理任意规模的数据集。

  • 灵活性:拉模型可以灵活控制输出的数量,比如Limit算子及时短路。

不足

  • 阻塞节点:对于排序节点,需要首先读取下层节点所有数据,并根据数据量,选择合适的算法进行内排序或者外排序。

  • 函数调用开销:每条元组在节点之间流动的过程中都会涉及大量的函数调用。

  • 缓存不友好:过多的控制语句、函数调用容易导致缓存失效。

  • 并行不友好。

7c5f3bc65e5d77df48d5df83b7514f5c.jpeg

1.2 Push模型

Push模型:从最底层的节点开始,不断生成数据,并向上层节点进行数据推送,因此是一种自底向上的执行方式。推模型本质是一种基于物化的操作,每一个节点处理所有的输入数据,并将处理后的数据进行物化,并传递给上层节点。

优点

  • 并行友好。

  • 推模型解决了拉模型中函数调用过多和缓存切换过多的问题。由于每个节点内部的处理逻辑相同,缓存使用率也更高。

不足

  • 内存占用大

b68efe68215f7ca673c0e61f6ba4a555.jpeg

1.3 向量化执行引擎

除了拉模型和推模型两大基础模型之外,还引入向量化执行引擎。

  • 每次一个 batch数据而非一行数据,减少函数调用。

  • 配合列式存储 + SIMD指令,提升性能。

2.执行器执行流程

2.1 执行器与上下游的关联关系

1.执行器与算子如何关联?

通过三部曲:ExecutorStart、ExecutorRun、ExecutorEnd。

bb399e92adf56f30455d1f3332c76ec9.jpeg

ea0f1a666d1d1dab75447b39fb47e7b9.jpeg

60a21d12a3d2b9aa07a9c6730a660cf8.jpeg

078f9e1d9312ecfb9e36dfbe8836f3f0.jpeg

afcb7971980429f45e740be0e82d412c.jpeg

c5f8c931a187acb2005d5ea6d83452a5.jpeg

25f8cb3285b6be1e0d34751ca1578cdc.jpeg

2.查询计划与执行器如何关联?

通过Portal。

Portal记录了与执行相关的所有信息,例如查询树、计划树和执行状态。对于用户提交的普通查询语句,执行器会创建一个匿名的Portal对象。游标语句,执行器会创建一个对应的命名Portal对象。

b2bb40420fd7912d10ff592058511eba.jpeg

cf522d6f2bb4aa7325db99de588fd8b8.jpeg

ffed7792141d8e30b7b200e2d957f219.jpeg

3.执行器与存储层如何关联?

通过table am与scan/modifyTable算子进行关联。

2.2 表达式与投影

SQL语句中除了SELECT、FROM、WHERE、GROUP BY等关键字之外的部分,都可以被认为是某种表达式。

例如:a列,a + 1,a * b等等。

表达式名示例
常量表达式10
列引用i, j
位置参数引用$1
下标arr[i]
域选择表达式table.column
运算符表达式a  > b, x and y, x or y
函数表达式upper(name),  now()
聚集表达式coumt(*),  avg(salary)
窗口函数sum(salary)  over (partition by department)
标量子查询select (select  max(age) from students) from student;
数组表达式select  array[1, 2, 3]
Row表达式select  row(1, 'John Doe')

2.3 表达式实现原理

  • ExprContext

记录下每次表达式评估所需要的tuple,可能来自scan、outer、inner。

TupleTableSlot *ecxt_scantuple;
TupleTableSlot *ecxt_innertuple;
TupleTableSlot *ecxt_outertuple;
  • ExprState

ExprState 是表达式求值的顶级节点,它包含:

  • 计算表达式的指令(steps)

  • 存储评估的结果slot

  • 存储空值结果

  • 存储scalar表达式评估的结果

  • 实际计算表达式的函数

对于一个表达式树,每个node初始化为ExprEvalOp,ExprEvalStep 存储每一步表达式评估的结果。

3eba9673af4f9fe727241c98ce1ec249.jpeg

c969d8db02f9849962354e06c447af53.jpeg

7dec014823832fdff11f1b36bbc6ad71.jpeg

3.如何写一个执行器算子?

假设有一个数据库需求,需要添加一个数据检查的功能,会检查其输入的数据,并对数据进行验证,如果发现数据不符合条件,则会抛出错误或者警告。

例如:plan如下

-> Assert
  Assert Cond: (i = 1)
  -> Seq Scan

我们如何为数据库新增一个AssertOp算子呢?(不考虑优化器,只考虑执行器)

6c599099ea9162186db50cc2bc1627ec.jpeg

6867950caf9a52561f762dd94d43aa54.jpeg

c7e2b769b0c8269e3ddf259de06de0ef.jpeg

dbeaedf3d75020fa2d001db6d7bbf252.jpeg

f5c9f006b37d29b9d83df8889d88acbe.jpeg

f46b30ab7c8f3d8dca7477a45112b184.jpeg

d0542124fe3e3f6412022543cc58a540.jpeg

7d0b81601c0d540dc05b49ee2e73a364.jpeg

b14350f6ad3b93522c6c13e46d5cceff.jpeg

以上就是本次的分享,欢迎转发与收藏。

674732c040ae3710351a2553e578ea3d.jpeg

1a90fecdbe3a471dabe5d69d8fd7caae.jpeg

a4c958684a16793f1107bb85a451014a.jpeg

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

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

相关文章

【图论】图论基础

图论不同地方讲的不太一样,本文仅限作者的理解 定义 图是一般由点集 V V V 和边集 E E E 组成。 对于 v ∈ V v\in V v∈V,称 v v v 为该图的一个节点。 对于 e ∈ E e\in E e∈E,一般用二元组 ( u , v ) (u,v) (u,v) 表示 e e e&am…

Android 音视频播放器 Demo(二)—— 音频解码与音视频同步

音视频编解码系列目录: Android 音视频基础知识 Android 音视频播放器 Demo(一)—— 视频解码与渲染 Android 音视频播放器 Demo(二)—— 音频解码与音视频同步 RTMP 直播推流 Demo(一)—— 项目…

HFSS19 官方案例教程W03 - SMA接头与微带分支

SMA接头与微带分支 1►射频接头简介 连接器是电子测量中必不可少的重要部件,无论测试仪表还是DUT,无论线缆还是附件,处处都有形形色色的不同连接器的身影。对于射频工程师而言,经常用到的连接器有N型、BNC型、SMA型、3.5 mm、2.…

【docker 】 IDEA 安装 Docker 工具

打开File->Settings->Plugins 配置 Docker 的远程访问连接 Engine APIURL :tcp://192.168.0.1:2375 (换成自己的docker开放端口) 使用diea的docker插件 查看已有的镜像 创建一个容器 下面是最近更新的文章: 【docker 】 …

sgg_ssm学习--前端搭建遇到的问题

目录 问题1:由于我是解压缩软件nodejs,没有添加系统路径 解决:添加nodejs的路径 到系统 path中 问题2:vscode 终端输入npm命令 报错 解决(如图所示在vscode打开前端工程,终端修改如下配置): 问题1&…

【学习vue 3.x】(二)组件应用及单文件组件

文章目录 章节介绍本章学习目标学习前的准备工作Vue.js文件下载地址 组件的概念及组件的基本使用方式组件的概念组件的命名方式与规范根组件局部组件与全局组件 组件之间是如何进行互相通信的父子通信父子通信需要注意的点 组件的属性与事件是如何进行处理的组件的属性与事件 组…

VitePress 构建的博客如何部署到 Netlify 平台?

VitePress 构建的博客如何部署到 Netlify 平台? 前言 之前写了篇文章【使用 Vitepress 构建博客并部署到 github 平台】,有个老哥说 github page 访问太慢了,希望放到 Netlify 平台上面。 咱也没部署过,就试了一下,发…

SpringCloud 学习笔记 —— 六、Ribbon:负载均衡(基于客户端)

SpringCloud 学习笔记 —— 一、背景-CSDN博客 SpringCloud 学习笔记 —— 二、微服务与微服务架构-CSDN博客 SpringCloud 学习笔记 —— 三、SpringCloud 入门概述-CSDN博客 SpringCloud 学习笔记 —— 四、SpringCloud Rest 学习环境搭建:服务提供者-CSDN博客 …

Postgresql源码(127)投影ExecProject的表达式执行分析

无论是投影还是别的计算,表达式执行的入口和计算逻辑都是统一的,这里已投影为分析表达式执行的流程。 1 投影函数 用例 create table t1(i int primary key, j int, k int); insert into t1 select i, i % 10, i % 100 from generate_series(1,1000000…

深度学习之基于Tensorflow卷积神经网络公共区域行人人流密度可视化系统

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 在公共区域,如商场、火车站、地铁站等,人流密度的监控和管理对于确保公共安全…

备忘录模式(行为型)

目录 一、前言 二、备忘录模式 三、总结 一、前言 备忘录模式(Memento Pattern)是一种行为型设计模式,在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在之后将该对象恢复到原…

笔记-PPT绘图导出高清无失真图片

问题描述:PPT绘图已经用了高清图(jpg、tif格式),但论文图片还是不清晰,打印出来还是有点糊 以下是PPT导出高清不失真图片(emf格式)的具体描述。 目录 一、绘图工具二、操作步骤 一、绘图工具 …

anaconda的安装和Jupyter Notebook修改默认路径

anaconda的安装 就一个注意事项:在结尾时候记得配置系统环境变量 要是没有配置这个环境变量,后面就不能cmd启动Jupyter Notebook Jupyter Notebook修改默认路径 我们要找到Jupyter Notebook的配置文件 输入下面指令 jupyter notebook --generate-config就可以找到存放配置文…

搭建和配置Stable Diffusion环境,超详细的本地部署教程

跃然纸上的创意、瞬息万变的想象,Stable Diffusion以AI的力量赋予您无限创作可能。在这篇详尽的本地部署教程中,我们将携手走进Stable Diffusion的世界,从零开始,一步步搭建和配置这个强大的深度学习环境。无论您是热衷于探索AI艺…

UNI-APP_拨打电话权限如何去掉,访问文件权限关闭

uniapp上架过程中一直提示:允许“app名”拨打电话和管理通话吗? uniapp配置文件:manifest.json “permissionPhoneState” : {“request” : “none”//拨打电话权限关闭 }, “permissionExternalStorage” : {“request” : “none”//访…

vue3、element-plus递归实现动态菜单

vue3、element-plus递归实现动态菜单 使用场景:动态菜单为什么使用递归递归在动态菜单中的实现 使用场景:动态菜单 动态菜单是指菜单项的数量和层次结构可能是动态的,通常来自后端或用户输入。这些菜单的特征包括: 多层嵌套&…

scikit-learn:Python中的机器学习-1

简介:问题设置 什么是机器学习? 机器学习是关于构建具有可调参数的程序,这些参数可以自动调整,以便通过适应先前看到的数据来改善其行为。机器学习可以被认为是人工智能的一个子领域,因为这些算法可以被视为构建模块…

AnomalyGPT——使用大型视觉语言模型进行工业异常检测的算法解析与应用

1.概述 工业缺陷检测是工业自动化和质量控制中的一个重要环节,其目的是在生产过程中识别和分类产品或组件中的缺陷,以确保最终产品的质量满足既定标准。这项技术的应用可以显著提高生产效率,降低成本,并减少由于缺陷产品导致的潜…

c#数据库: 8.在窗体上显示学生信息

以上一章学生信息表为例,首先将查询的学生信息存储到数据集中,然后将数据集与数据显示控件绑定,从而实现学生信息在窗体上的显示 (1)创建一个名为StudentGridView的窗体应用程序,为窗体添加一个DataGridVi…

SpringCloud学习笔记(二)Ribbon负载均衡、Nacos注册中心、Nacos与Eureka的区别

文章目录 4 Ribbon负载均衡4.1 负载均衡原理4.2 源码解读4.3 负载均衡策略4.3.1 内置的负载均衡策略4.3.2 自定义负载均衡策略4.3.2.1 方式一:定义IRule4.3.2.2 方式二:配置文件 4.4 饥饿加载 5 Nacos注册中心5.1 认识和安装Nacos5.2 服务注册到Nacos5.3…