PostgreSQL执行机制的初步学习

作为开源数据库的新手,近日有兴对比了Pg和MySQL的查询计划。

通过Pg源码目录下的src\backend\executor\README文件,加上一些简单调试,就能对Pg的执行机制产生一个初步印象;
而MySQL的代码可读性比Pg差了不少,可能还要花些时日去了解先。

原本想写一篇执行机制对比的文章,现在只能谈谈对Pg的体会,不足和错误之处敬请指正。

  • Pg算是学院派的开源数据库代表产品,其基于关系代数的优化、操作符的实现看起来十分亲切。相较于MySQL扁平的计划,Pg的执行计划让人一目了然。
  • Pg的执行计划静态只读,这是为了重用计划方便。在具体执行某计划时,会有一个包含只读计划指针 + 执行所需信息的State操作符树(对应Plan Trees and State Trees)。类似的表达式也包括Expr和ExprState。
  • Pg的执行计划为操作符树,连接如Merge Join,Hash Join为二元操作符,其它为一元操作符。一个特例是相关的semi join过滤,子查询会生成一个SubPlan挂载到过滤条件上,如果过滤条件有n个相关子查询那么就会在scan下方得到n个SubPlan,这一点倒是和Oracle类似(注:12c相关查询处理会更多地进行unnest,在子查询中加了分组才构造出来)。
  • 操作符的执行是基于状态的,操作符之间用元组来传递数据。控制权由上而下,数据的传递由下而上。操作符对数据的处理以元组为单位,目前没有批量的优化。
  • 操作符中可能涉及表达式计算(接口ExecMakeFunctionResultNoSets),如投影、过滤。根据表达式类型如整型比较、整型相加,会有不同的ExpreState对应。ExprState包含了整型加法或比较用的函数指针,也包含有操作数。 如int_col1 + int_col2,首先加载ExprState的两个操作数:从Tuple中的第n个字段获取值并存放到ExprState的参数中, 接下来使用ExprState的函数指针,结合两个参数进行加法运算并返回结果。

总结:

Pg的执行器代码逻辑很清晰,但是以tuple为单位的处理会使得CPU资源得不到充分利用;
表达式重用优化现在只看到了9.6引入的聚合OP重用

时间: 2024-10-25 19:19:25

PostgreSQL执行机制的初步学习的相关文章

初步学习C++:C++的基本概念

开始学习C++,先从最基本的概念开始,让自己有一个系统的知识概念. 1.对象: 在面向对象程序设计中,对象是描述其属性的数据以及对这些数据施加的一组操作封装在一起构成的统一体.对象可以认为是:数据+操作(对象所能完成的操作表示它的动态行为,也成为方法). 2.类: 在面向对象程序设计中,类就是具有相同的数据和相同的操作的一组对象的集合,类是对具有相同数据结构和相同操作的一类对象的描述. 3.消息: 在面向对象程序设计中,一个对象向另一个对象发出的请求被称为"消息".当对象接收到发向它的

Java深度历险(三) Maven初步学习

这几天接触这个词,很多遍了,只是浅显的体会到它在GXPT中的好处,功能之强大,又通过网络查询了资料进一步的认识学习了,和大家分享. Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具. 在gxpt中的体现 1. 父子关系 一个多模块项目通过一个父POM 引用一个或多个子模块来定义. a. 在父目录中分别创建子项目 b. 父项目,通过以下配置,将子项目关联: 如下: <span style="font-size:18px;"

彻底弄懂 JavaScript 执行机制

本文的目的就是要保证你彻底弄懂javascript的执行机制,如果读完本文还不懂,可以揍我. 不论你是javascript新手还是老鸟,不论是面试求职,还是日常开发工作,我们经常会遇到这样的情况:给定的几行代码,我们需要知道其输出内容和顺序.因为javascript是一门单线程语言,所以我们可以得出结论: javascript是按照语句出现的顺序执行的 看到这里读者要打人了:我难道不知道js是一行一行执行的?还用你说?稍安勿躁,正因为js是一行一行执行的,所以我们以为js都是这样的: let a

这一次,彻底弄懂 JavaScript 执行机制

本文的目的就是要保证你彻底弄懂javascript的执行机制,如果读完本文还不懂,可以揍我. 文章转自:https://juejin.im/post/59e85eebf265da430d571f89 不论你是javascript新手还是老鸟,不论是面试求职,还是日常开发工作,我们经常会遇到这样的情况:给定的几行代码,我们需要知道其输出内容和顺序.因为javascript是一门单线程语言,所以我们可以得出结论: javascript是按照语句出现的顺序执行的 看到这里读者要打人了:我难道不知道js

JavaScript 执行机制

一.宏任务与微任务 macro-task(宏任务):包括整体代码script,setTimeout,setInterval micro-task(微任务):Promise,process.nextTick 二.JavaScript 执行机制 本文的目的就是要保证你彻底弄懂javascript的执行机制,如果读完本文还不懂,可以揍我. 不论你是javascript新手还是老鸟,不论是面试求职,还是日常开发工作,我们经常会遇到这样的情况:给定的几行代码,我们需要知道其输出内容和顺序.因为javasc

LinQ的初步学习与总结

嘿嘿,说起来ORM和LinQ,就感觉离我好遥远的,在学校是没有学习的,所以总感觉学习了LinQ就是大神,现在嘛,终于也体会一点,感觉LinQ只是初步学习,没有太难,当然以后使用在项目中就没有这样的简单啦,下面就全面的总结一下LinQ的其中一部分,LinQ有三部分:LinQ TO Object:LinQ TO SQL ;LinQ TO XML.而在这里我先来总结一下LinQ TO Object的学习吧 一.初步认识LinQ to Object static void Main(string[] a

第十九篇 jQuery初步学习

jQuery 初步学习 jQuery可以理解为是一种脚本,需要到网上下载,它是一个文件,后缀当然是js的文件,它里面封装了很多函数方法,我们直接调用即可,就比方说,我们用JS,写一个显示与隐藏,通常是:div.style.display="none/block"这一类,即为显示或者隐藏,而jQuery,它里面做了处理,我们直接这样:$("div").hide() 隐藏,$("div").show() 显示,它在js里就处理了hide和show两个

深入理解JVM_java代码的执行机制01

本章学习重点: 1.Jvm: 如何将java代码编译为class文件. 如何装载class文件及如何执行class文件. jvm如何进行内存分配和回收. jvm多线程:线程资源同步机制和线程之间交互的机制. 3.1 java代码的执行机制 java源码编译机制. 1.三个步骤: 分析和输入到符号表(Parse and Enter) Parse过程所做的为词法和语法分析. 词法分析:将代码字符串转变为Token序列. 语法分析:根据语法由Token序列生成抽象语法树. Enter过程为将符合好输入

C#中面向对象编程机制之继承学习笔记

继承反应了类和类之间的关系. 世界上很多事物都是有共性的,共性的那一部分我们就抽象为基类,用于派生其它类,这样提高了代码的复用性,使得代码的结构清晰易读,而且易于代码的扩展和维护. C#的继承只能继承自一个基类,这一点不同于C++的继承. C#的继承具有传递性,即B继承自A,C继承自B,则C具有A的所有特性. C#的继承隐式为public的. 假如不在派生类构造器中显示调用一个基类构造器,编译器会自动插入对基类的默认构造器的一个调用,然后才会执行派生类构造器中的代码, 如果基类没有默认的构造器,