第六十一章. PostgreSQL 内部概貌

内容
查询的过程
联接是如何建立起来的
分析器阶段
Postgres 规则系统
规划器/优化器
执行器
作者:本章最初是做为 Simkovics, 1998 的一部分出现的,它是 Stefan Simkovics 在 维也纳理工大学准备的硕士论文,是由 O.Univ.Prof.Dr. Georg Gottlob 和 Univ.Ass. Mag. Katrin Seyr 指导的。
本章给出了 Postgres 后端服务器的内部情况的一个概貌。在阅读完毕下面的章节后,你应该对如何处理查询有一个概念了。不过别指望我们在这里有详细的描述(我想,要对Postgres 里面所有的数据结构和函数都做这样的详细描述可能要超过 1000 页的内容!)。本章只是试图帮助我们了解在后端里面从受到查询到发出结果之间的通常的控制和数据的流动。

查询的过程

下面是一个简短的描述一个查询从开始到得到结果要经过的阶段。
    首先必须先建立起从应用程序到 Postgres 服务器的联接。应用程序想服务器发送查询然后接收从服务器收到的结果。

    分析阶段parser stage)检查从应用程序(客户端)发送过来的查询,核对语法并创建一个查询树query tree)。

    重写系统(rewrite system)接收分析阶段来的查询树并且搜索任意应用到查询树上的规则rules)(存储在系统表里)并根据给出的规则体rule bodies)进行转换。重写系统的一个应用在视图views)的实现里给出了。

    当一个查询访问一个视图时(也就是说,一个虚拟表virtual table)),重写系统改写用户的查询,使之成为一个访问带有视图定义view definition)的基本表base tables)的查询。

    规划器/优化器planner/optimizer)接收(改写的)查询树然后创建一个查询规划queryplan),这个查询规划是执行器executor)的输入。

    它(规划器/优化器)首先创建所有得出相同结果的可能的 路径paths)。例如,如果待扫描的关系上有一个索引,那么扫描的路径就有两个。一个可能是简单的顺序查找,而另一个可能就是使用索引的那个。下一步是计算出每个索引执行的开销,并且选择和返回开销最少的那个。

    执行器递归地走过规划树plan tree)并且在这个过程中检索规划所代表的记录。执行器在对关系进行扫描时使用存储系统storage system),进行排序sorts)和联接joins),计算条件qualifications)并且最终交回生成的记录。

在随后的章节里,我们将对上面的每一个步骤进行更详细的讨论,以便让我们对Postgres 的内部控制和数据结构有一个更准确的理解。