47.1. 查询经过的路径

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

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

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

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

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

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

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

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

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