2021SC@SDUSC

目录

  • 综合分析
  • 安装过程
  • 主要源码
  • 分工情况
  • 我的任务
  • 分析方式

综合分析

经过小组讨论和分析,大家一致认为postgreSQL的核心部分在于对SQL功能的实现。而postgreSQL的核心代码则在于其后端的完成实现。

由上图,可以看出postgresql处理查询请求(核心功能)都是依托postgres这个进程完成的。而查询请求处理的流程为:解析SQL语句->分析处理->语句重写->查询优化->执行计划。所以,源码的核心部分也就在这个流程中。

安装过程

在官网上下载源码,并利用虚拟机在linux上进行安装调试,具体步骤与链接: 网页链接相同,调试过程安装了readline,zlib等多个库才完成。


(进行了数据库的创建并查看进程状态可知安装成功)

主要源码

经过小组分析我们认为核心代码在于src的backend文件夹中。因此接下来的工作都是对它来展开分析。

backend文件夹包含了所有的后端源码

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

分工情况

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

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

我的任务

我负责索引的建立与使用这一步部分的内容
首先来说PostgreSQL提供了多种索引类型,B-tree、Hash、GiST、SP-GiST 、GIN 和 BRIN。每一种索引类型使用了 一种不同的算法来适应不同类型的查询。默认情况下, CREATE INDEX命令创建适合于大部分情况的B-tree 索引。
PostgreSQL关于索引的建立和使用主要在backend的access文件夹中因此我的重点主要聚焦在该部分,我也会对B-tree,Hash,GiST,GiN的源码展开重点分析,涉及到其中的数据结构以及算法。

其中各种存储访问方法(在各个子目录下)
1mon(共同函数)
2.gin (Generalized Inverted Index通用逆向索引)(我的重点)
3.gist (Generalized Search Tree通用索引)(我的重点)
4.hash (哈希索引)(我的重点)
5.heap (heap的访问方法)
6.index (通用索引函数)
7.nbtree (Btree函数)(我的重点)
8.transam (事务处理)
可见这几个文件下的源码是我研究的重点。我也初步确定根据索引的类型来进行分析源码,比较异同点。
同时我也会关注到其他的文件夹中的源码来对索引的建立与使用做到更好的分析。

include包含了关于索引的数据结构,因此也是我分析的重点
在backend文件夹中,除了access文件夹还有executor文件夹- 执行来自optimizer的复杂的节点形式的查询计划,optimizer文件夹-创建查询路径和查询计划。

分析方式

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

更多推荐

postgreSQL源码分析综述