postgreSQL项目综述

2021SC@SDUSC

postgreSQL项目综述

目录

  • postgreSQL项目综述
    • **postgreSQL项目总体分析**
    • **核心代码分析**
    • **分工情况**
    • **我负责的部分**
    • **调试方法**
    • **结语**

postgreSQL项目总体分析

postgreSQL项目综述_第1张图片
主进程:Postmaster进程
辅助进程:SysLogger(系统日志)进程、BgWriter(后台写)进程、WALWrite(预写式日志)进程、PgArch(归档)进程、AutoVacuum(系统自动清理)进程、PgStat(统计收集)进程、CheckPoint()进程。

虽然主进程是Postmaster进程,但是postgresql处理查询请求(核心功能)都是依托postgres这个进程完成的。而查询请求处理的流程为:解析SQL语句->分析处理->语句重写->查询优化->执行计划。所以我们小组分析的postgre源码的核心是postgres这个进程

核心代码分析

经过上面的分析,可以定位核心代码的存放位置
postgreSQL项目综述_第2张图片

首先是src目录下的backend文件夹,这里面包含了所有后端源码。

postgreSQL项目综述_第3张图片

可以看到backend里面有很多文件夹,接下来我们逐个分析(借助文件夹里的README文件以及官方文档)。

文件夹 内容
access 包含各种存储访问方法、索引的实现***(重要)***
bootstrap 为数据库初始化时调用方法
catalog 系统目录
commands SQL命令***(重要)***
executor 执行器相关代码***(重要)***
foreign FDW相关代码,使得用户可以通过SQL访问没有存储在数据库中的数据(扩展)
jit Just-In-Time Compilation,为即时编译的相关代码,用于提高查询语句性能(扩展)
lib 通用函数
libpq c/cpp的库函数,处理与客户端的通信
main 主程序
nodes 链表、节点等数据结构,以及相关的方法。***(重要)***
optimize 优化器相关代码***(重要)***
parser 编译器相关代码***(重要)***
partitioning 分片相关代码,能够实现分布式存储(扩展)
po 语言文件配置
port 平台兼容性处理相关代码
postmaste postmaster进程,以及相关辅助进程的代码
regex 正则处理相关代码***(重要)***
replication 有关流复制的相关代码***(重要)***
rewrite 规则与视图相关的重写处理
snowball 全文检索相关(语干处理)代码
statisics 收集统计信息相关代码,与估算相关
storage 管理各种类型存储系统相关代码***(重要)***
tcop postgres服务进程的主要处理部分,即查询流程调用的相关代码***(重要)***
tsearch 全文检索(扩展)
utils 各种支持函数,如错误报告、各种初始化操作、内存管理等

分工情况

根据查询处理的流程以及关系型数据库的核心功能,将任务分为四个部分。

1查询的编译与执行
2索引的建立与使用
3事务和并发控制
4存储管理

我负责的部分

我负责postgreSQL查询的编译与执行

参考书籍:PostgreSQL数据库内核分析

postgreSQL项目综述_第4张图片

我阅读的主要文件夹:

postgreSQL项目综述_第5张图片

commands(重点)-不需要executor执行的命令
执行不需要复杂处理的SQL命令.包括vacuum, copy, alter, create table, create type以及许多其他未能例举的命令。调用这一部分代码时使用由parser生成的结构.大多数的函数先做一些处理,然后就调用catalog目录下的一些低层函数来做实际的工作

postgreSQL项目综述_第6张图片

optimizer(重点) - 创建查询路径和查询计划

postgreSQL项目综述_第7张图片
optimizer/path -使用parser的输出创建查询路径
它使用parser的输出生成所有可能的执行方法,它检查表的连接顺序,where子句限制和optimizer的表统计信息来评估每一个可能的执行方法,并赋予每个方法一个代价

optimizer/geqo - 遗传算法查询优化
optimizer/path对所有连接表的方法进行了评估。但是当表的数目变得很大时,检测测的数目也会变得很大。遗传算法查询优化对每一个表进行考虑,然后计算出最优的顺序来执行连接。如果只有几个表,这种方法花费较长的时间,但对于大量的表,这种方法就比较快了。系统有一个选项用于控制何时使用这个功能

optimizer/plan - 优化path输出
为optimizer/path的输出选择代价最小的路径并创建一个执行计划

optimizer/prep- 处理特殊的查询计划
对特殊的查询计划进行处理

optimizer/util - 优化器支持函数
供优化器其他部分使用的函数

postgreSQL项目综述_第8张图片
executor(重点) - 执行来自optimizer的复杂的节点形式的查询计划
处理select, insert, update,和delete语句. 处理这些语句的操作包括堆扫描、索引扫描、排序、连接表、分组、计算集函数和处理

postgreSQL项目综述_第9张图片regex - 正规表达式库
用于后台服务器的正规表达式处理如’~’.

postgreSQL项目综述_第10张图片rewrite - 规则系统
完成规则系统的处理

postgreSQL项目综述_第11张图片

tcop(重点) - 将请求分派到合适的模块
这是postgres后台服务进程的主要处理部分, 它调用parser, optimizer, executor, 和commands中的函数

postgreSQL项目综述_第12张图片
parser(重点) - 将SQL查询转化为查询树
将来自libpq的SQL查询转换为命令形式的结构供optimizer/executor或commands使用.首先对SQL语句进行词法分析,转换为关键字,标识符和常量,然后进行语法分析。语法分析生成命令形式的结构来表示查询的组成。然后这个命令形式的结构被分离、检查和传送给commands中的处理函数,或者转换为结点链表供optimizer和executor处理

调试方法

通过gdb调试了解函数调用过程,然后再深入阅读源码。

结语

以上是我的postgreSQL项目综述,欢迎大家批评指正!!

你可能感兴趣的:(postgresql,数据库,sql)