PostgreSQL执行机制的初步学习
2024-09-06 17:44:43
作为开源数据库的新手,近日有兴对比了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重用;
最新文章
- 浅谈JSP注释
- Trading
- Spire.Doc组件读取与写入Word
- 他们在军训,我在搞 OI(四)
- webpages框架中使用Html.TextArea()在前台显示多行信息时,如何进行大小、样式的设置
- sql里将重复行数据合并为一行,数据用逗号分隔
- java_SSH整合1
- oc 基础知识
- hdu4976 贪心+dp
- 【VMware混合云】掀起你的盖头来
- 最简单的epoll的使用范例 : 监听 标准输入 ,并将数据回显到终端
- javaweb项目中发布webservices服务
- 开涛spring3(12.3) - 零配置 之 12.3 注解实现Bean定义
- attr和prop的区别以及在企业开发中应该如何抉择
- Fullcalendar改版后发布到IIS或者tomcat里面前端加载数据不显示的问题
- winform窗体退出
- mysql一列相同另一列相加
- 使用Swagger2时遇到的问题
- LeetCode难度与出现频率
- core net 2 nuget的数据源包
热门文章
- java8--多线程(java疯狂讲义3复习笔记)
- #啃underscore源码 一、root对象初始化部分
- c# 32位机和64位机 读取Excel内容到DataSet
- URAL1099 Work Scheduling —— 一般图匹配带花树
- 【monkey】
- BZOJ_2819_Nim_树状数组维护出栈入栈序
- HDU1429:胜利大逃亡(续)
- bzoj 1296: [SCOI2009]粉刷匠【dp+背包dp】
- 浅谈KMP算法——Chemist
- iOS 上传APP到AppStore 卡在 Authenticating with the iTunes store 提示