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. VirtualBox 虚拟机 从入门到入坑

                                                                                                        ...

  2. Java错误:找不到类文件或者未加载主类

    使用java命令执行.class文件时,java只会查找环境变量CLASSPATH中的目录,并会不查找当前目录,所以只要把当前目录”."加入到CLASSPATH中就可以了.

  3. 转载: Java虚拟机:运行时内存数据区域、对象内存分配与访问

    转载:  https://blog.csdn.net/a745233700/article/details/80291694  (虽然大部分内容都其实是深入理解jvm虚拟机这本书里的,不过整理的很牛逼 ...

  4. 详解隐马尔可夫模型(HMM)中的维特比算法

    笔记转载于GitHub项目:https://github.com/NLP-LOVE/Introduction-NLP 4. 隐马尔可夫模型与序列标注 第3章的n元语法模型从词语接续的流畅度出发,为全切 ...

  5. 那些 JavaScript 自带的奇妙 Bug

    米娜桑,哦哈哟~ 本章讲解关于 JavaScript 奇妙的 Bug,与其说是Bug,不如说是语言本身隐藏的奥秘.接下来就看看可能会影响到我们编程的那些Bug吧. typeof null === &q ...

  6. 《快乐编程大本营》java语言训练班 1课:第一个java程序:你好,范冰冰;

    1Java介绍 2安装java环境JDK 3安装web环境tomcat 4安装开发工具Idea2017 5编写第一个程序 ‘你好,范冰冰!’ 地址: http://code6g.com 1.Java介 ...

  7. centos7 配置虚拟交换机(物理交换机truck端口设置)(使用brctl)

    转自:http://blog.csdn.net/qq_21398167/article/details/46409503 虚拟交换机配置 inux VLAN配置(vconfig) 安装vlan(vco ...

  8. nginx的四个主要组成部分

    1.nginx二进制可执行文件 · 由各模块源码编译出的一个文件 2.nginx.conf配置文件 · 控制nginx的行为 3.access.log访问日志 . 记录每一条http请求信息 4.er ...

  9. mplayer的参数

    播放文件 使用 MPlayer 播放媒体文件最简单的方式是: mplayer <somefile>  MPlayer 会自动检测文件的类型并加以播放,如果是音频文件,则会在命令行中显示该播 ...

  10. JAVA String对象和字符串常量的关系解析

    JAVA String对象和字符串常量的关系解析 1 字符串内部列表 JAVA中所有的对象都存放在堆里面,包括String对象.字符串常量保存在JAVA的.class文件的常量池中,在编译期就确定好了 ...