46.1. 查询经过的路径

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

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

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

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

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

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

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

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

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