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 计算机是如何工作的 个人理 ...
随机推荐
- centos最小化安装时网络配置
查看网卡: ip addr 修改网络配置文件 vi /etc/sysconfig/network-scripts/ifcfg-enp33 BOOTPROTO=dhcp ONBOOT=yes 重启网络服 ...
- springmvc中applicationapplicationContext头部代码
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...
- Java数据类型及对应取值范围
Java数据类型及对应取值范围 在Java中,数据类型分为两大种:基本数据类型(值类型)和包装类型(引用数据类型).基本数据类型不是对象,不能调用toString().hashCode().getCl ...
- javabst1an
(单选题)下列概念中不包括任何实现,与存储空间没有任何关系的是() A)类 B)接口 C)抽象类 D)对象 正确答案为:B解析:接口是一种只含有抽象方法或常量的一种特殊的抽象类,因为接口不包括任何实现 ...
- C++ traits技法的一点理解
为了更好的理解traits技法.我们一步一步的深入.先从实际写代码的过程中我们遇到诸如下面伪码说起. template< typename T,typename B> void (T a, ...
- Codeforces_851
A.分三种情况. #include<bits/stdc++.h> using namespace std; int n,k,t; int main() { ios::sync_with_s ...
- HDU_1455_dfs
http://acm.hdu.edu.cn/showproblem.php?pid=1455 int dfs(int all,int sum,int now),all代表剩余总长,sum,代表每段长, ...
- ARTS Week 8
Dec 16, 2019 ~ Dec 22, 2019 Algorithm Problem 53 Maximum Subarray 最大子数组 题目链接 题目描述:给定一个数组,在所有连续的子数组中, ...
- Java7循环结构综合练习
import java.util.Scanner; public class jh_01_学员操作_选择游戏 { public static void main(String[] args) { Sc ...
- 五种编程语言解释数据结构与算法——顺序表1(理论与C语言实现)
1.线性表的分类 2.线性表的定义及其基本操作 2.1.定义:线性表是具有相同类型的n(n>=0)个元素的有序序列,其中n为表长,当n=0时,该表为空表. 2.3.线性表的逻辑结构为: 2.4. ...