PostgreSQL实现了SQL Standard2011的大部分内容,SQL处理是数据库中非常复杂的一部分内容。

本文简要介绍了SQL处理的相关内容。

简要介绍

SQL文的处理分为以下几个部分:

  1. Parser阶段(词法分析,语法解析)

    对应于source中的parser模块
  2. analyzer阶段(语义分析)

    对应于source中的analyzer模块

    内部处理中将Parser阶段生成的Parser tree转换为Query tree
  3. rewriter阶段(查询重写)

    安装规则系统进行查询重写,还有视图重新

    对应于source中的rewriter模块
  4. Planner阶段(生成最优查询计划)

    对应于source中planner模块
  5. 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引擎)的更多相关文章

  1. Activiti工作流学习笔记(四)——工作流引擎中责任链模式的建立与应用原理

    原创/朱季谦 本文需要一定责任链模式的基础,主要分成三部分讲解: 一.简单理解责任链模式概念 二.Activiti工作流里责任链模式的建立 三.Activiti工作流里责任链模式的应用 一.简单理解责 ...

  2. Oracle学习笔记四 SQL命令(二):SQL操作语言类别

    SQL分为下列语言类别 1.数据定义语言(DDL) Create.Alter.Drop 2.数据操纵语言(DML) Insert.Select.Delete.Update 3.事务控制语言(TCL) ...

  3. PostgreSQL内核学习笔记十一(索引)

    Index Scan涉及到两部分的内容Heap Only Tuple和index-only-scan. 什么是Heap Only Tuple(HOT)? 例如:Update a Row Without ...

  4. 零拷贝详解 Java NIO学习笔记四(零拷贝详解)

    转 https://blog.csdn.net/u013096088/article/details/79122671 Java NIO学习笔记四(零拷贝详解) 2018年01月21日 20:20:5 ...

  5. Oracle学习笔记三 SQL命令

    SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)  

  6. EPROCESS 进程/线程优先级 句柄表 GDT LDT 页表 《寒江独钓》内核学习笔记(2)

    在学习笔记(1)中,我们学习了IRP的数据结构的相关知识,接下来我们继续来学习内核中很重要的另一批数据结构: EPROCESS/KPROCESS/PEB.把它们放到一起是因为这三个数据结构及其外延和w ...

  7. Linux内核学习笔记二——进程

    Linux内核学习笔记二——进程   一 进程与线程 进程就是处于执行期的程序,包含了独立地址空间,多个执行线程等资源. 线程是进程中活动的对象,每个线程都拥有独立的程序计数器.进程栈和一组进程寄存器 ...

  8. muduo网络库学习笔记(四) 通过eventfd实现的事件通知机制

    目录 muduo网络库学习笔记(四) 通过eventfd实现的事件通知机制 eventfd的使用 eventfd系统函数 使用示例 EventLoop对eventfd的封装 工作时序 runInLoo ...

  9. 20135316王剑桥Linux内核学习笔记

    王剑桥Linux内核学习笔记 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 计算机是如何工作的 个人理 ...

随机推荐

  1. Docker扩展内容之容器开机自启

    前言 部署项目服务器时,为了应对停电等情况影响正常web项目的访问,会把Docker容器设置为开机自动启动. 在使用docker run启动容器时,使用--restart参数来设置,具体参数如下详解 ...

  2. Educational Codeforces Round 80 (Rated for Div. 2)部分题解

    A. Deadline 题目链接 题目大意 给你\(n,d\)两个数,问是否存在\(x\)使得\(x+\frac{d}{x+1}\leq n\),其中\(\frac{d}{x+1}\)向上取整. 解题 ...

  3. tomcat 持久区溢出

    知识点:堆内存设置(JVM堆内存)java的堆内存分为两块:permantspace(持久带) 和 heap spaceOOM1.年老代溢出,表现为:java.lang.OutOfMemoryErro ...

  4. DOCKER 学习笔记7 Docker Machine 建立虚拟机实战,以及错误总结

    前言 通过以上6小节的学习,已经可以使用DOCKER 熟练的部署应用程序了.大家都可以发现使用 DOCKER 带来的方便之处,因为现在的话,只是在一台服务器上部署,这样部署,我们只需要一条命令,需要的 ...

  5. Codeforces 1296F Berland Beauty

    题目链接:http://codeforces.com/problemset/problem/1296/F 思路: 1————2————3————4————5————6 1->3 2 2-> ...

  6. sqlserver check running process 1

    check process script 1, check which is current running: use master SELECTspid,ER.percent_complete,CA ...

  7. git命令清单 摘自 阮老师

    常用 Git 命令清单   作者: 阮一峰 日期: 2015年12月 9日 我每天使用 Git ,但是很多命令记不住. 一般来说,日常使用只要记住下图6个命令,就可以了.但是熟练使用,恐怕要记住60- ...

  8. 杂记 -- 关于vue-router样式、vuecli引用全局js函数、vue.slot用法

    1.routerLinkTo 样式设置 首先,点击routerlink标签如下图:添加:router-link-active,router-link-exact-active两个类的样式 router ...

  9. postman之设置token

    在做接口测试的时候,很多业务的接口是有依赖性的,下一个接口需要上一个接口的token依赖,例如余额查询接口,需要先登录,才能查询余额.那么,这种接口如何使用postman进行测试呢?今天让我来给小伙伴 ...

  10. ubuntu docker中crontab任务不执行的问题

    problem of task of crontab in docker of ubuntu do not working! 由于各种原因,要在Ubuntu docker上部署crontab任务,如 ...