44.1. 查询路径

下面是查询为了得到结果不得不经过的阶段的简短描述。

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

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

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

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

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

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

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

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