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 | 系统目录 |
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数据库内核分析
我阅读的主要文件夹:
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项目综述的主要内容,如果未能解决你的问题,请参考以下文章
Django:将项目从 sqlite 迁移到 PostgreSQL 的最佳实践是啥
在新的 Rails 项目中从 SQLite 更改为 PostgreSQL
vue3+SpringBoot+postgresql 项目前后端传参