作为开源数据库的新手,近日有兴对比了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为二元操作符;分组、排序等为一元操作符;集合运算,水平分区表相关操作,相关子查询过滤等可能存在多个子节点。例如,每个相关子查询生成一个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重用

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

  1. PostgreSQL的backuplabel file 初步学习

    磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面:PostgreSQL内部结构与源代码研究索引页    回到顶级页面:PostgreSQL索引页 看代码: /* File path names ...

  2. 浏览器中js执行机制学习笔记

    浏览器中js执行机制学习笔记 RiverSouthMan关注 0.0772019.05.15 20:56:37字数 872阅读 291 同步任务 当一个脚本第一次执行的时候,js引擎会解析这段代码,并 ...

  3. JS学习笔记:(三)JS执行机制

    首先我们先明确一点:JavaScript是一门单线程语言.单线程也就是说同一时间只能执行一个任务,所有的任务都必须排队顺序执行.那么如果一个任务耗时很长,阻塞了其它任务的执行,就会给用户造成不友好的体 ...

  4. javascript执行机制

    文的目的就是要保证你彻底弄懂javascript的执行机制,如果读完本文还不懂,可以揍我. 不论你是javascript新手还是老鸟,不论是面试求职,还是日常开发工作,我们经常会遇到这样的情况:给定的 ...

  5. 彻底弄懂 JavaScript 执行机制

    本文的目的就是要保证你彻底弄懂javascript的执行机制,如果读完本文还不懂,可以揍我. 不论你是javascript新手还是老鸟,不论是面试求职,还是日常开发工作,我们经常会遇到这样的情况:给定 ...

  6. JavaScript 执行机制

    一.宏任务与微任务 macro-task(宏任务):包括整体代码script,setTimeout,setInterval micro-task(微任务):Promise,process.nextTi ...

  7. 转载---JavaScript执行机制

    很好的一篇文章,原地址 JavaScript执行机制 这一次,彻底弄懂 JavaScript 执行机制 本文的目的就是要保证你彻底弄懂javascript的执行机制,如果读完本文还不懂,可以揍我. 不 ...

  8. 【js】javaScript 执行机制

    javascript 是一门单线程语言(按照语句一行一行的执行) let a = '1'; console.log(a); let b = '2'; console.log(b); 这样子正常执行是没 ...

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

    本文转自https://juejin.im/post/59e85eebf265da430d571f89#heading-4 本文的目的就是要保证你彻底弄懂javascript的执行机制,如果读完本文还 ...

随机推荐

  1. while语句字符串的基本操作

    1,编码:对现在通用文字编码成计算机文字,便于储存,传递,交流. 最早的计算机编码是ACSII美国人创建的,包含英文字母,数字,以及特殊符号.总共是128个码位:2**7,因为计算机的底层只能识别:& ...

  2. AndroidEventBus总结

    什么是AndroidEventBus? android事件总线,是一个发布 / 订阅的事件总线 github地址:https://github.com/greenrobot/EventBus Andr ...

  3. Deep Learning 29: caffe入门学习

    1.跑教程:深度学习(六)caffe入门学习,上面有比较好的注释 .prototxt文件:网络结构文件 solver.prototxt:网络求解文件 net: "examples/mnist ...

  4. JDBC连接数据库核心代码

    1.Oracle数据库   Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();   String url ...

  5. POJ3020 Antenna Placement —— 最大匹配 or 最小边覆盖

    题目链接:https://vjudge.net/problem/POJ-3020 Antenna Placement Time Limit: 1000MS   Memory Limit: 65536K ...

  6. bleve搜索引擎源码分析之索引——mapping真复杂啊

    接下来看看下面index部分的源码实现: data := struct { Name string Des string }{ Name: "hello world this is bone ...

  7. 使用C#开发HTTP服务器系列之实现Get和Post

     各位朋友大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是http://qinyuanpei.com.在我们这个Web服务器有了一个基本的门面以后,我们是时候来用它做点实际的事情了.还记得我们 ...

  8. BZOJ_3448_[Usaco2014 Feb]Auto-complete_Trie树

    BZOJ_3448_[Usaco2014 Feb]Auto-complete_Trie Description Bessie the cow has a new cell phone and enjo ...

  9. 【HDU 1599】 Find the mincost route

    [题目链接] 点击打开链接 [算法] 弗洛伊德求最小环模板 我们知道,在一个环上,一定有一个有且仅有一个编号最大的点,设这个点为k,起点为i,终点为j,那么 mincost = dist[i][j] ...

  10. bzoj 3609: [Heoi2014]人人尽说江南好【博弈论】

    参考:https://blog.csdn.net/Izumi_Hanako/article/details/80189596 胜负和操作次数有关,先手胜为奇,所以先手期望奇数后手期望偶数,最后一定能达 ...