当前位置:Linux教程 - Linux文化 - 分析Postgresql源代码

分析Postgresql源代码


在dbms的实现中,查找是一个要频繁进行的动作,有根据用户的请求而需要进行的外部数据库中数据的查找,也有dbms对自己所使用的内部数据的查找。索引可以大大加快查找的速度,hash表在没有冲突或者冲突较少时绝对是一种最佳的索引。postgresql的实现中包含了两个类型的hash表,一个是用做存取方法的外存hash表,另一个是用于内布数据查找的内存hash表。本篇将对后者进行讨论,源代码在utils/hash之下,仍然是我先发言如下。

我学过数据结构的人,也看过数据库管理系统实现一书,我总是觉得hash表这个东西说来简单,但却似乎没有什么用途。不过在我粗粗了解了postgresql的实现之后,不能不惊呼,hash表真是太有用了!如果你没有写过hash表的实现算法,建议你一定要认真读读postgresql的内存hash表的实现代码。读这部分代码花了我两个多星期,中间还因为上班迟到被老板k了一顿,但是读懂以后我觉得非常的快乐,从理论到实现再到应用,全部都走一遍,哈哈,爽!

这部分代码的关键之处在于它实现的是可动态增长hash表,很容易知道,有两种动态hash表,那么,postgresql实现的是哪一种呢?

首先说查询优化主要所涉及的数据类型:

.\SRC\INCLUDE\NODES中的几个文件均包括了

----> ParseNodes.H 语法分析之后所形成数据结构的类型 ----> PlanNodes.H 这个是经过优化之后的查询计划数据结构的类型 ----> ExecNodes.H 这个是执行器在执行查询计划时使用的数据结构的类型

等等,可以说,数据库系统执行的主线,主要就是这几个数据结构的生成和转换。

然后说几个主要的入口点:

Pgl的Core的几个主要的入口点都在:

.\SRC\BACKEND\EXECUTOR\SPI.C 中,所谓的SPI就是“Server Programming Interface”(服务器编程接口)

比如:_SPI_execute主要是由SQL语句转换为AccessPlan

就主要的查询语句而言:_SPI_execute调用了

pg_parse_and_rewrite :这个是SQL语句语法分析,语义检查和基于规则的重写。 planner:这个是Pgl查询优化器的入口点。 (当然pg_parse_and_rewrite进一步调用了pg_parse_query和pg_analyze_and_rewrite,而pg_analyze_and_rewrite调用了parse_analyze和QueryRewrite)

而: _SPI_execute_plan 则主要是对AccessPlan的执行

基本框架差不多就是这样了

·如果你的linux安装盘不止一张光盘,那么可能其中一张会带有postgresql的源代码

·我通常直接到http://www.postgresql.org/或者ftp://ftp.postgresql.org/pub/下载源代码

·可以用教育网的天网搜索引擎http://e.pku.edu.cn搜索postgresql来寻找国内的下载站点,不过这些下载站点多属于教育网,我们访问起来有点慢


摘自:linuxforum.net