PostgreSQL内核学习笔记四(SQL引擎)
PostgreSQL实现了SQL Standard2011的大部分内容,SQL处理是数据库中非常复杂的一部分内容。
本文简要介绍了SQL处理的相关内容。
简要介绍
SQL文的处理分为以下几个部分:
- Parser阶段(词法分析,语法解析)
对应于source中的parser模块 - analyzer阶段(语义分析)
对应于source中的analyzer模块
内部处理中将Parser阶段生成的Parser tree转换为Query tree - rewriter阶段(查询重写)
安装规则系统进行查询重写,还有视图重新
对应于source中的rewriter模块 - Planner阶段(生成最优查询计划)
对应于source中planner模块 - Executor阶段(查询计划执行)
对应于source中executor模块

上图显示了SQL文处理的5个阶段。
Parser阶段
利用flex,bison等工具进行语法和语义分析,最终生成Parser tree。
输入:SQL文
输出:Parser tree
以下图为例,介绍下parser tree长什么样子

根据上图可以清晰的看到select的列对应于parser tree的target list
select 文的from部分对应于parser tree的from clause
select 文的where部分对应于parser tree的where clause
select文的order by部分对应于parser tree的sort clause
analyzer阶段
对于parser阶段的生成parser tree进行语义分析,生成Query tree
输入:Parser tree
输出:Query tree
以下图为例,介绍下Query tree长什么样子

targetlist 是select文的查询结果的list。以上图为例select文查询的列有两个id和data,则targetlist有两个元素,每个元素对应于一个TargetEntry。
rtable表示范围表range table,是所有表的list。
jointree 存储了from clause和where clause。
rewriter阶段
根据pg_rule系统catalog中的规则将改变Query tree。
输入:Query tree
输出:Query tree
以视图为例
sampledb=# CREATE VIEW employees_list
sampledb-# AS SELECT e.id, e.name, d.name AS department
sampledb-# FROM employees AS e, departments AS d WHERE e.department_id = d.id;
sampledb=# SELECT * FROM employees_list

根据上图所示,Querytree中范围表rtable中的内容进行了转变。
Planner
根据rewriter阶段的Query tree生成最优查询计划树Plan tree,然后通过执行器executor进行执行。
PostgreSQL中Plan tree可以通过EXPLAIN命令进行显示
testdb=# EXPLAIN SELECT * FROM tbl_a WHERE id < 300 ORDER BY data;
QUERY PLAN
---------------------------------------------------------------
Sort (cost=182.34..183.09 rows=300 width=8)
Sort Key: data
-> Seq Scan on tbl_a (cost=0.00..170.00 rows=300 width=8)
Filter: (id < 300)
(4 rows)
下图显示了Plan tree和EXPLAIN执行结果的关系

plan tree的类型有很多种,上图中是SortNode类型,source文件 plannodes.h中定义了所有的类型。
执行器在执行时先从Plan tree的底部开始执行,最后到顶部。
以上图为例,先对table_a进行顺序扫描,然后再进行排序获得最终结果。
Executor
执行器执行plan tree的过程中,通过buffer manager进行table和index的读写。执行时也需要一些内存比如:temp_buffers, work_mem,包括一些临时文件。
此外在存取元组时,PostgreSQL会用到mvcc机制保证并发时事务的一致性和隔离性

参考文档:
http://www.interdb.jp/pg/pgsql03.html#_3.ref.1
PostgreSQL内核学习笔记四(SQL引擎)的更多相关文章
- Activiti工作流学习笔记(四)——工作流引擎中责任链模式的建立与应用原理
原创/朱季谦 本文需要一定责任链模式的基础,主要分成三部分讲解: 一.简单理解责任链模式概念 二.Activiti工作流里责任链模式的建立 三.Activiti工作流里责任链模式的应用 一.简单理解责 ...
- Oracle学习笔记四 SQL命令(二):SQL操作语言类别
SQL分为下列语言类别 1.数据定义语言(DDL) Create.Alter.Drop 2.数据操纵语言(DML) Insert.Select.Delete.Update 3.事务控制语言(TCL) ...
- PostgreSQL内核学习笔记十一(索引)
Index Scan涉及到两部分的内容Heap Only Tuple和index-only-scan. 什么是Heap Only Tuple(HOT)? 例如:Update a Row Without ...
- 零拷贝详解 Java NIO学习笔记四(零拷贝详解)
转 https://blog.csdn.net/u013096088/article/details/79122671 Java NIO学习笔记四(零拷贝详解) 2018年01月21日 20:20:5 ...
- Oracle学习笔记三 SQL命令
SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)
- EPROCESS 进程/线程优先级 句柄表 GDT LDT 页表 《寒江独钓》内核学习笔记(2)
在学习笔记(1)中,我们学习了IRP的数据结构的相关知识,接下来我们继续来学习内核中很重要的另一批数据结构: EPROCESS/KPROCESS/PEB.把它们放到一起是因为这三个数据结构及其外延和w ...
- Linux内核学习笔记二——进程
Linux内核学习笔记二——进程 一 进程与线程 进程就是处于执行期的程序,包含了独立地址空间,多个执行线程等资源. 线程是进程中活动的对象,每个线程都拥有独立的程序计数器.进程栈和一组进程寄存器 ...
- muduo网络库学习笔记(四) 通过eventfd实现的事件通知机制
目录 muduo网络库学习笔记(四) 通过eventfd实现的事件通知机制 eventfd的使用 eventfd系统函数 使用示例 EventLoop对eventfd的封装 工作时序 runInLoo ...
- 20135316王剑桥Linux内核学习笔记
王剑桥Linux内核学习笔记 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 计算机是如何工作的 个人理 ...
随机推荐
- VirtualBox 虚拟机 从入门到入坑
...
- Java错误:找不到类文件或者未加载主类
使用java命令执行.class文件时,java只会查找环境变量CLASSPATH中的目录,并会不查找当前目录,所以只要把当前目录”."加入到CLASSPATH中就可以了.
- 转载: Java虚拟机:运行时内存数据区域、对象内存分配与访问
转载: https://blog.csdn.net/a745233700/article/details/80291694 (虽然大部分内容都其实是深入理解jvm虚拟机这本书里的,不过整理的很牛逼 ...
- 详解隐马尔可夫模型(HMM)中的维特比算法
笔记转载于GitHub项目:https://github.com/NLP-LOVE/Introduction-NLP 4. 隐马尔可夫模型与序列标注 第3章的n元语法模型从词语接续的流畅度出发,为全切 ...
- 那些 JavaScript 自带的奇妙 Bug
米娜桑,哦哈哟~ 本章讲解关于 JavaScript 奇妙的 Bug,与其说是Bug,不如说是语言本身隐藏的奥秘.接下来就看看可能会影响到我们编程的那些Bug吧. typeof null === &q ...
- 《快乐编程大本营》java语言训练班 1课:第一个java程序:你好,范冰冰;
1Java介绍 2安装java环境JDK 3安装web环境tomcat 4安装开发工具Idea2017 5编写第一个程序 ‘你好,范冰冰!’ 地址: http://code6g.com 1.Java介 ...
- centos7 配置虚拟交换机(物理交换机truck端口设置)(使用brctl)
转自:http://blog.csdn.net/qq_21398167/article/details/46409503 虚拟交换机配置 inux VLAN配置(vconfig) 安装vlan(vco ...
- nginx的四个主要组成部分
1.nginx二进制可执行文件 · 由各模块源码编译出的一个文件 2.nginx.conf配置文件 · 控制nginx的行为 3.access.log访问日志 . 记录每一条http请求信息 4.er ...
- mplayer的参数
播放文件 使用 MPlayer 播放媒体文件最简单的方式是: mplayer <somefile> MPlayer 会自动检测文件的类型并加以播放,如果是音频文件,则会在命令行中显示该播 ...
- JAVA String对象和字符串常量的关系解析
JAVA String对象和字符串常量的关系解析 1 字符串内部列表 JAVA中所有的对象都存放在堆里面,包括String对象.字符串常量保存在JAVA的.class文件的常量池中,在编译期就确定好了 ...