postgreSQL项目综述

Posted weixin_47373497

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了postgreSQL项目综述相关的知识,希望对你有一定的参考价值。

2021SC@SDUSC

postgreSQL项目综述

postgreSQL项目总体分析


主进程:Postmaster进程
辅助进程:SysLogger(系统日志)进程、BgWriter(后台写)进程、WALWrite(预写式日志)进程、PgArch(归档)进程、AutoVacuum(系统自动清理)进程、PgStat(统计收集)进程、CheckPoint()进程。

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

核心代码分析

经过上面的分析,可以定位核心代码的存放位置

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

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

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

分工情况

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

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

我负责的部分

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

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

我阅读的主要文件夹:

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

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


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

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

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

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

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


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

regex - 正规表达式库
用于后台服务器的正规表达式处理如’~’.

rewrite - 规则系统
完成规则系统的处理

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


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

调试方法

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

结语

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

以上是关于postgreSQL项目综述的主要内容,如果未能解决你的问题,请参考以下文章

某电商项目PostgreSQL数据库备份恢复方案

Django:将项目从 sqlite 迁移到 PostgreSQL 的最佳实践是啥

在新的 Rails 项目中从 SQLite 更改为 PostgreSQL

vue3+SpringBoot+postgresql 项目前后端传参

如何使用 Sequelize + PostgreSQL 将项目附加到数组值

Babelfish for PostgreSQL