第 61 章 PostgreSQL 内部概述
目录
作者
本章最初是 Simkovics, 1998 (Stefan Simkovics 在维也纳技术大学完成的硕士论文,由 O.Univ.Prof.Dr. Georg Gottlob 和 Univ.Ass. Mag. Katrin Seyr 指导)的一部分。
本章概述 Postgres 后端的内部结构。阅读以下各节之后,你应该能够大致了解一个查询是如何被处理的。不要期望在这里看到详细的描述(我认为,一份涵盖 Postgres 中使用的所有数据结构和函数的描述将超过 1000 页!)。本章旨在帮助读者理解后端从收到一个查询到发送结果为止,其内部总体上的控制流和数据流。
61.1. 查询的路径
这里将简要概述一个查询为得到结果必须经过的各个阶段。
必须先建立从应用程序到 Postgres 服务器的连接。应用程序将查询发送给服务器,并接收服务器返回的结果。
解析器阶段检查应用程序(客户端)传来的查询是否具有正确的语法,并创建一棵查询树。
重写系统接收由解析器阶段创建的查询树,并查找任何可应用于该 querytree 的规则(存储在系统目录中),然后执行这些规则体中给出的转换。重写系统的一个应用在于视图的实现。
每当对一个视图(即虚拟表)发出查询时,重写系统都会将用户的查询重写成一个改为访问视图定义中给出的基表的查询。
规划器/优化器接收(重写后的)querytree,并创建一个将作为执行器输入的 queryplan。
它首先生成所有能得到同一结果的可能路径。例如,如果待扫描的某个关系上有一个索引,那么该扫描就有两条路径:一种是简单的顺序扫描,另一种是使用该索引。接着会估算执行每个计划的代价,选出代价最低的计划并交回。
执行器递归地遍历计划树,并以计划所表示的方式提取元组。执行器在扫描关系时会使用存储系统,执行排序和连接,计算限定条件,最后返回得到的元组。
在后续各节中,我们将更详细地介绍上述列出的每一项内容,以便更好地理解 Postgres 的内部控制和数据结构。