↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1
历史版本PostgreSQL 7.2 已于 2007 年 2 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本。

2.6. 执行器 #

执行器接收由规划器/优化器创建的计划,并开始处理其顶层节点。对于我们的例子(例 \ref{simple_select} 中给出的查询)来说,顶层节点是一个 MergeJoin 节点。

在执行归并之前,必须先取到两个元组(每个子计划各一个)。因此执行器会递归调用自身去处理这些子计划(从挂接在 lefttree 上的子计划开始)。新的顶层节点,也就是左子计划的顶层节点,是一个 SeqScan 节点,而在处理该节点本身之前又必须先取得一个元组。于是执行器再次递归调用自身,去处理 SeqScan 节点的 lefttree 上挂接的子计划。

现在新的顶层节点是一个 Sort 节点。由于排序必须在整个关系上进行,当 Sort 节点第一次被访问时,执行器开始从 Sort 节点的子计划取元组,并把它们排序后放入一个临时关系(内存中或文件中)。(之后再检查 Sort 节点时,总是只从排好序的临时关系中返回一个元组。)

每当 Sort 节点的处理需要一个新元组时,执行器就会被递归调用,去处理作为子计划挂接的 SeqScan 节点。在关系(内部通过 scanrelid 字段给出的值引用)中扫描下一个元组。如果该元组满足挂接在 qpqual 上的树所给出的限定条件,就把它交回;否则继续取下一个元组,直到限定条件被满足。如果关系中的最后一个元组已被处理完毕,就返回一个 NULL 指针。

在 MergeJoin 的 lefttree 交回一个元组之后,righttree 会以同样的方式被处理。如果两个元组都已就绪,执行器就处理 MergeJoin 节点。每当需要来自某个子计划的一个新元组时,都会递归调用执行器来取得它。如果能够构造出一个连接后的元组,就把它交回,至此计划树的一次完整处理就结束了。

上述步骤会对每个元组执行一次,直到对 MergeJoin 节点的处理返回一个 NULL 指针,表明处理已经完成。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。