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

如何从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如下

-> AssertAssert 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.mzph.cn/news/831137.shtml

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

相关文章

[PS小技能学习]抠图和切图

详情见视频教程:PS小技巧--抠图与切图 今天我们来学习如何使用PS对表情包合辑进行抠图和裁剪保存 1、首先,将图片导入,双击图层新建一个图层 2、然后点击工具栏的魔棒工具,再点击顶部菜单栏的添加到选区 3、点击图片的空白区域即…

IMU状态预积分功能实现与测试

IMU状态预积分功能实现与测试 前言实现IMU状态预积分类测试程序验证预积分与直接积分的效果结果 前言 预积分:是一种十分常见的IMU数据处理方法。 与传统的IMU运动学积分不同,预积分可以将一段时间内的IMU测量数据累积,建立预积分测量&#…

两院院士泌尿外科专家吴阶平教授

吴阶平(1917-2011),男,江苏常州人,1933年天津汇文中学毕业,保送到北平燕京大学医预科,1937年毕业于北平燕京大学获理学士学位,1942年毕业于北平协和医学院获医学博士学位&#xff0c…

银行卡归属地查询API接口快速对接

银行卡归属地查询API接口指的是通过银行卡号查询该银行卡详细信息,包括银行卡名称、卡种、卡品牌、发卡行、编号以及归属地等信息,支持一千多家银行返回归属地信息,那么银行卡归属地查询API接口如何快速对接呢? 首先找到有做银行…

SpringBoot集成Kafka开发

4.SpringBoot集成Kafka开发 4.1 创建项目 4.2 配置文件 application.yml spring:application:name: spring-boot-01-kafka-basekafka:bootstrap-servers: 192.168.2.118:90924.3 创建生产者 package com.zzc.producer;import jakarta.annotation.Resource; import org.spri…

Thread类及常见方法

目录 1.Thread类概念 2.Thread的常见构造方法 3.Thread的几个常见属性 4.启动一个线程—start( ) 5.中断一个线程 1.使用自定义的变量来作为标志位 2.使用interrupt() 3.观察标志位是否被清除 6.等待一个线程-join() 7.获取当前线程引用 8.休眠当前线程 1.Thread类概…

GitHub Copilot 简单使用

因为公司安全原因,并不允许在工作中使用GitHub Copilot,所以,一直没怎么使用。最近因为有一些其它任务,所以,试用了一下,感觉还是很不错的。(主要是C和Python编程) 一:常…

探索洗牌算法的魅力与杨辉三角的奥秘:顺序表的实际运用

目录 目录 前言~🥳🎉🎉🎉 洗牌算法 准备工作 买一副牌 洗牌 发牌 测试整体 🎯🎯很重要的一点 杨辉三角 总结 前言~🥳🎉🎉🎉 Hello, Hello~ …

06_电子设计教程基础篇(学习视频推荐)

文章目录 前言一、基础视频1、电路原理3、模电4、高频电子线路5、电力电子技术6、数学物理方法7、电磁场与电磁波8、信号系统9、自动控制原理10、通信原理11、单片机原理 二、科普视频1、工科男孙老师2、达尔闻3、爱上半导体4、华秋商城5、JT硬件乐趣6、洋桃电子 三、教学视频1…

分布式与一致性协议之Raft算法与一致哈希算法(一)

Raft算法 Raft与一致性 有很多人把Raft算法当成一致性算法,其实它不是一致性算法而是共识算法,是一个Multi-Paxos算法,实现的是如何就一系列值达成共识。并且,Raft算法能容忍少数节点的故障。虽然Raft算法能实现强一致性&#x…

相机知识的补充

一:镜头 1.1MP的概念 相机中MP的意思是指百万像素。MP是mega pixel的缩写。mega意为一百万,mega pixel 指意为100万像素。“像素”是相机感光器件上的感光最小单位。就像是光学相机的感光胶片的银粒一样,记忆在数码相机的“胶片”&#xff…

如何使用Go语言进行并发安全的数据访问?

文章目录 并发安全问题的原因解决方案1. 使用互斥锁(Mutex)示例代码: 2. 使用原子操作(Atomic Operations)示例代码: 3. 使用通道(Channels) 在Go语言中,进行并发编程是常…

buuctf-misc-23.FLAG

23.FLAG 题目:stegsolve得出PK-zip文件,改后缀名为zip,解压后查看文件类型为ELF 使用kali-strings或者ida获取flag 点击Save Bin将其另存为一个zip文件 而后解压我们另存的这个1234.zip文件后,可以得到 我们用ida打开它,打开后就…

《QT实用小工具·五十》动态增删数据与平滑缩放移动的折线图

1、概述 源码放在文章末尾 该项目实现了带动画、带交互的折线图,包含如下特点: 动态增删数值 自适应显示坐标轴数值 鼠标悬浮显示十字对准线 鼠标靠近点自动贴附 支持直线与平滑曲线效果 自定义点的显示类型与大小 自适应点的数值显示位置 根据指定锚点…

stm32f103c8t6学习笔记(学习B站up江科大自化协)-PWR电源控制

PWR简介 PVD可用在电池供电或安全要求比较高的设备,如果供电电压在逐渐下降,在电压过低的情况下可能会导致内外电路出现不确定的错误。为了避免不必要的错误,可以在电源电压过低的情况下,提前发出警告并关闭较为危险的设备 关闭的…

Java发送请求-http+https的

第一步:建议ssl连接对象,信任所有证书 第二步:代码同时支持httphttps 引入源码类 是一个注册器 引入这个类,和它的方法create 注册器,所以对http和https都进行注册,参数为id和item,其中http的…

【C++题解】1039. 求三个数的最大数

问题:1039. 求三个数的最大数 类型:多分支结构 题目描述: 已知有三个不等的数,将其中的最大数找出来。 输入: 输入只有一行,包括3个整数。之间用一个空格分开。 输出: 输出只有一行&#…

uni-app scroll-view隐藏滚动条的小细节 兼容主流浏览器

开端 想写个横向滚动的列表适配浏览器,主要就是隐藏一下滚动条在手机上美观一点。 但是使用uni-app官方文档建议的::-webkit-scrollbar在目标标签时发现没生效。 .scroll-view_H::-webkit-scrollbar{display: none; }解决 F12看了一下,原来编译到浏览…

Day27:阻塞队列、Kafka入门、发送系统通知、显示系统

阻塞队列BlockingQueue BlockingQueue 解决线程通信的问题。阻塞方法:put、take。 生产者消费者模式 生产者:产生数据的线程。消费者:使用数据的线程。 (Thread1生产者,Thread2消费者) 实现类 ArrayBlockingQueueLinkedBlockingQueuePr…

firebase:一款功能强大的Firebase数据库安全漏洞与错误配置检测工具

关于firebase firebase是一款针对Firebase数据库的安全工具,该工具基于Python 3开发,可以帮助广大研究人员针对目标Firebase数据库执行安全漏洞扫描、漏洞测试和错误配置检测等任务。 该工具专为红队研究人员设计,请在获得授权许可后再进行安…