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

这篇具有很好参考价值的文章主要介绍了PgSQL内核特性 - push-based pipeline 执行引擎。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

push vs. pull-based loop fusion in query engines

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的项目,基本思想是遍历执行计划树,找到叶子节点,从叶子节点开始获取数据,然后推送给各个父节点。

push vs. pull-based loop fusion in query engines

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

push vs. pull-based loop fusion in query engines

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

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

pushTupleToSeqScan(SeqScanState *node)
  heappushtups(...,node->ss.ps.parent,node)
    |--  get a tuple in the page
      SeqPushHeapTuple(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 dest
            return SendReadyTuple(slot, pusher);
          }

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

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

push vs. pull-based loop fusion in query engines

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

3、效果

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

push vs. pull-based loop fusion in query engines

4、总结

push vs. pull-based loop fusion in query engines

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文章来源地址https://www.toymoban.com/news/detail-829818.html

到了这里,关于PgSQL内核特性 - push-based pipeline 执行引擎的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 制作基于ubuntu-base的文件系统,用于sudo,网络内核cve调试

    主机是 ubuntu 20.04 macos 下使用 orbStack软件,耗能较低,能充分利用本地硬件资源 参考 : https://blog.csdn.net/u012563853/article/details/125295985 参考 : https://www.cnblogs.com/faqbug/p/12484958.html https://www.cnblogs.com/xyztank/articles/16919180.html 查看已拉取的images 确定要编译内核的存放位置 比如,我这里

    2024年01月22日
    浏览(45)
  • git中每次执行push都需要输入账号密码问题

    每次在执行 时需要重复输入账号和密码问题,这样子比较浪费时间和重复操作 可以使用如下操作 亲测有效 之后查看效果,会发现有一条 credential.helper=store 之后push操作只需要输入一次账号和密码之后就可以不需要重复输入了

    2024年02月13日
    浏览(57)
  • k8s上部署jenkins 执行pipeline docker时出现script.sh: 1: docker: not found

    部署jenkins在k8s上 pipeline内容: 报错: 排查: 进入jenkins容器 进入后执行 提示: 所以报错原因,在jenkins容器中没有安装docker 解决方案: 把docker 配置到容器中,在jenkins的yaml中添加以下内容 如果还不行,在jenkins插件管理中安装docker相关插件

    2024年02月13日
    浏览(50)
  • 【PostgreSQL内核学习(十)—— 查询执行(可优化语句执行)】

    声明 :本文的部分内容参考了他人的文章。在编写过程中,我们尊重他人的知识产权和学术成果,力求遵循合理使用原则,并在适用的情况下注明引用来源。 本文主要参考了《PostgresSQL数据库内核分析》一书    可优化语句 的共同特点是它们 被查询编译器处理后都会生成

    2024年02月15日
    浏览(53)
  • 【PostgreSQL内核学习(九)—— 查询执行(数据定义语句执行)】

    声明 :本文的部分内容参考了他人的文章。在编写过程中,我们尊重他人的知识产权和学术成果,力求遵循合理使用原则,并在适用的情况下注明引用来源。 本文主要参考了《PostgresSQL数据库内核分析》一书    数据定义语言(DDL,Data Definition Language) 是一类 用于定义数

    2024年02月16日
    浏览(44)
  • 随笔录--git push 命令执行后无任何反应的解决方法

    在使用 Git 进行版本控制和代码管理时, git push  是一个常用且关键的命令,它用于将本地仓库的更改推送到远程仓库。然而,在实际操作中,有时候执行  git push  后会发现命令似乎卡住,没有任何反应。这种情况可能会让人感到困惑,特别是对于 Git 新手来说。本文将探讨

    2024年04月09日
    浏览(42)
  • v8-tc39-ecma262:数组push执行了什么?

    v8开发文档介绍 v8新特性 tc39-ecma262-push函数执行步骤 上图步骤,解释如下: 如果是对象,则当作对象调用设置该值 如果是类数组,则执行类数组调用设置该值 如果参数有多个参数,则: 如果,参数长度+原数组长度后,数组的总长度超限,则抛出异常 否则,循环操作如下:

    2024年02月11日
    浏览(32)
  • Linux 内核 ASoC DMA 引擎驱动程序

    Linux 内核 ASoC 框架,在概念上将嵌入式音频系统拆分为多个可复用的组件驱动程序,包括 Codec 类驱动程序、平台类驱动程序和机器类驱动程序。在实现上,机器类驱动程序用 struct snd_soc_card 和 struct snd_soc_dai_link 结构描述,属于平台类驱动程序的 DMA 引擎驱动程序由 struct snd

    2024年02月11日
    浏览(45)
  • 如何使用现代C++特性构建游戏引擎

    游戏引擎是用来设计、开发和构建计算机游戏的软件框架。它们由一些基本的工具和程序构成,可帮助游戏设计师和开发者轻松地创建、管理和优化游戏。基本上,游戏引擎是实现游戏的所有技术的一个集合。 现代C++(指C++11、C++14和C++17)为游戏引擎的开发提供了强大的功能

    2024年02月05日
    浏览(47)
  • 【参天引擎】华为参天引擎内核架构源码架构,多线程服务,数据节点管理,多节点间元数据管理

    ​ 专栏内容 : 参天引擎内核架构 本专栏一起来聊聊参天引擎内核架构,以及如何实现多机的数据库节点的多读多写,与传统主备,MPP的区别,技术难点的分析,数据元数据同步,多主节点的情况下对故障容灾的支持。 手写数据库toadb 本专栏主要介绍如何从零开发,开发的

    2024年02月03日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包