Chapter 40. PostgreSQL 内部概貌

Table of Contents
40.1. 查询经过的路径
40.2. 联接是如何建立起来的
40.3. 分析器阶段
40.3.1. 分析器
40.3.2. 转换处理
40.4. PostgreSQL 规则系统
40.5. 规划器/优化器
40.6. 执行器

作者: 本章最初是 Enhancement of the ANSI SQL Implementation of PostgreSQL 的一部分, 它是 Stefan Simkovics 在维也纳理工大学写的硕士论文, 是由 O.Univ.Prof.Dr. Georg Gottlob和Univ.Ass. Mag. Katrin Seyr 指导的。

本章给出了 PostgreSQL 后端服务器的内部结构的一个概貌。 在阅读完毕下面的章节后,你应该对查询是如何处理的有一个概念了。 本章并不准备提供对 PostgreSQL 内部操作的详细描述,因为这样的一份文档将会非常庞大。 本章只是试图帮助读者了解从后端收到查询后到结果返回给客户端之间一般操作顺序。

40.1. 查询经过的路径

下面是一个简短的描述,描述一个查询从开始到得到结果要经过的阶段。

  1. 首先必须先建立起从应用程序到 PostgreSQL 服务器的联接。应用程序向服务器发送查询然后接收从服务器返回的结果。

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

  3. 重写系统接收分析阶段来的查询树且搜索任何应用到查询树上的规则, (规则存储在系统表里)并根据给出的规则体 进行转换。

    重写系统的一个应用就是实现 视图。 当一个查询访问一个视图时(也就是说,一个虚拟表),重写系统改写用户的查询, 使之成为一个访问在 视图定义 里给出的基本表的查询。

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

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

  5. 执行器递归地走过规划树并且按照规划指定的方式检索数据行。 执行器在对关系进行扫描时使用存储系统, 进行排序连接, 计算 条件并且最终交回生成的数据行。

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