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 计算机是如何工作的 个人理 ...
随机推荐
- Redis 通用方法 存储DataTable DataRow DataSet
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- Spring基于XML配置AOP
目录结构: D:\Java\IdeaProjects\JavaProj\SpringHelloWorld\src\cn\edu\bjut\service\StudentService.java pac ...
- C语言实现银行家算法
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdbool.h& ...
- *args 和 **kwargs 的区别
截取百度里的两个答案: 这是Python函数可变参数 args及kwargs *args表示任何多个无名参数,它是一个tuple **kwargs表示关键字参数,它是一个dict 测试代码如下: de ...
- 《Python学习手册 第五版》 -第9章 元组、文件与其他核心类型
本章的主要内容是介绍了元组和文件的使用,同时作为介绍数据类型的最后一个章节,本章也总结和复习了前面所介绍的核心数据类型,总结的部分在此不多介绍,因为前面章节都有,在此就重点介绍以下两点内容 1.元组 ...
- 转AngularJS路由插件
AngularJS学习笔记--002--Angular JS路由插件ui.router源码解析 标签: angular源码angularjs 2016-05-04 13:14 916人阅读 评论(0) ...
- LeetCode#26 | Remove Duplicates from Sorted Array 删除有序数组中的重复元素
一.题目 Description Given a sorted array, remove the duplicates in-place such that each element appear ...
- 【Bullet引擎】复杂碰撞体 —— btCompoundShape
说明 API文档:http://bulletphysics.org/Bullet/BulletFull/classbtCompoundShape.html btCompoundShape可用于创建不规 ...
- android 基础学习笔记3
1.XML解析 与 Json 解析 (文件读取一般较耗时 可将相应的解析做成方法 用线程调用) 一.XML解析 (pull解析)res/xml(资源文件 需用到Resources) Xml文本 ...
- O准备如何苟进复赛圈?华为软挑开挂指南(附赛题预测)
事先声明,这不是华为软挑的软广,我也不是海军. 这篇文章纯粹是心血来潮,原因是去年上传到github的参赛代码,前几天又有两个人star和fork了. 记得star热潮还是去年4月复赛刚结束的那几天, ...