51.1. 查询的路径

在这里,我们简要概述了查询必须经过的阶段才能获得结果。

  • 必须构建从应用程序到 PostgreSQL 服务器的连接。应用程序将查询发送到服务器,并 await 接收服务器发送回的结果。

    • parser 阶段检查应用程序发送的查询的语法是否正确,并创建 query tree *。
    • rewrite system 接受解析器阶段创建的查询树,并查找任何 rules (存储在 system catalogs 中)以应用于查询树。它执行规则实体*中给出的转换。

重写系统的一种应用是* views 的实现。每当针对视图(即虚拟表*)进行查询时,重写系统都会将用户的查询重写为访问视图定义中提供的基本表的查询。

    • planner/optimizer 获取(重写)查询树并创建一个 query plan ,它将作为 executor *的 Importing。

通过首先创建所有可能的* path *导致相同的结果来做到这一点。例如,如果要扫描的关系上有索引,则有两个扫描路径。一种可能性是简单的 Sequences 扫描,另一种可能性是使用索引。接下来,估计每个路径的执行成本,并选择最便宜的路径。最便宜的路径被扩展为执行者可以使用的完整计划。

  • 执行程序递归地浏览“计划树”,并以计划表示的方式检索行。执行程序在扫描关系时利用存储系统,执行* sort joins ,评估 qualifications *,最后交回派生的行。

在以下各节中,我们将更详细地介绍上述每个项目,以更好地理解 PostgreSQL 的内部控制和数据结构。