↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 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.3 已结束支持。 请参阅 当前版本手册.

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 指针,表明处理已经完成。

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.