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

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

百科 / 执行计划节点 / 控制

Result

Result

计算投影和可选的一次性条件,可带或不带输入计划。

当前查看 PostgreSQL 18.6。

说明

计算投影和可选的一次性条件,可带或不带输入计划。

核心节点标签
T_Result
结构化 EXPLAIN 节点类型
Result
输入
可选的子计划
输出
投影后的元组
执行器初始化函数
ExecInitResult
内存机制
unclassified

EXPLAIN 名称与属性

结构化格式使用上述 Node Type。文本格式名称还可能包含操作、策略、连接类型、扫描方向或聚合阶段属性。

此源码记录的文本名称:Result.

并行感知与并行安全是不同的计划属性。在并行工作进程内运行的节点不一定是并行感知节点。

内存与临时存储

本次抽取不为此节点设定统一的内存上限或落盘策略。请查看同一构建的实现、相关表达式或提供方。

并行执行与运行信息采集

以下源码回调可以协调执行或收集工作进程的测量数据。回调存在不代表该节点普遍支持共享并行扫描或共享状态。

此构建的回调:none extracted from this node implementation.

同版本手册说明

rows 容易令人误解:它表示节点输出的行数,而不是处理或扫描的行数。节点应用 WHERE 条件筛选后,输出行数通常小于扫描行数。理想情况下,顶层 rows 估计应接近查询实际返回、更新或删除的行数。

与普通排序相比,增量排序可在整个结果集尚未排完时就返回元组,尤其有利于优化带 LIMIT 的查询。它还可能减少内存用量和排序溢写磁盘的概率,但代价是将结果集拆成多个排序批次所带来的额外开销。

在这个计划中,有一个嵌套循环连接节点,它的两个输入,也就是两个子节点,都是表扫描。节点摘要行的缩进反映了计划树结构。连接的第一个子节点,也就是 “ 外侧 ” 子节点,是一个与前面见过的位图扫描类似的节点。它的代价和行计数与 SELECT ... WHERE unique1 < 10 得到的结果相同,因为 WHERE 子句 unique1 < 10 正是在该节点上应用的。 t1.unique2 = t2.unique2 子句此时还无关,因此不会影响外侧扫描的行计数。嵌套循环连接节点会对从外侧子节点得到的每一行执行一次第二个,也就是 “ 内侧 ” 子节点。当前外侧行中的列值可以代入内侧扫描;这里外侧行的 t1.unique2 值可用,因此得到的计划和代价与前面看到的简单 SELECT ... WHERE t2.unique2 = constant 情形类似。(由于预期在对 t2 反复执行索引扫描期间会发生缓存命中,估计代价实际上比前面看到的略低一些。)随后,循环节点的代价建立在外侧扫描代价之上,再加上每个外侧行都要执行一次内侧扫描的代价(这里是 10 * 7.90),以及少量连接处理的 CPU 时间。

这个刻意构造的示例说明了两点:外层计划的值可传入子计划(这里传入 t.four),子查询结果也可供外层计划使用。EXPLAIN 用 (subplan_name).col N 一类记号显示这些结果值,表示子 SELECT 的第 N 个输出列。

可使用 EXPLAIN 的 ANALYZE 选项检查规划器估算是否准确。使用此选项时,EXPLAIN 会实际执行查询,然后显示每个计划节点累计的真实行数和真实运行时间,以及普通 EXPLAIN 所显示的估算值。例如,可能得到如下结果:

由于每个工作进程都会将计划的并行部分执行到底,因此不能简单地拿一个普通查询计划并让多个工作进程同时运行。那样每个工作进程都会生成完整输出结果集的一份副本,所以查询不仅不会比平常更快,反而会产生错误结果。相反,计划的并行部分必须是查询优化器内部所说的 部分计划 ;也就是说,它必须被构造为使执行该计划的每个进程只生成输出行的一个子集,并且保证每一条所需输出行都恰好由某个协作进程生成一次。一般来说,这意味着查询驱动表上的扫描必须是并行感知扫描。

本版手册中的示例

示例摘自 PostgreSQL 18.6 手册;本百科未实际执行此示例。

如果子 SELECT 不仅不引用外层查询的任何变量,而且最多只会返回一行,那么它还可能被实现成一个 初始计划 :

EXPLAIN VERBOSE SELECT unique1
FROM tenk1 t1 WHERE t1.ten = (SELECT (random() * 10)::integer);

                             QUERY PLAN
--------------------------------------------------------------------
 Seq Scan on public.tenk1 t1  (cost=0.02..470.02 rows=1000 width=4)
   Output: t1.unique1
   Filter: (t1.ten = (InitPlan 1).col1)
   InitPlan 1
     ->  Result  (cost=0.00..0.02 rows=1 width=4)
           Output: ((random() * '10'::double precision))::integer

执行器实现说明

nodeResult.c:支持需要特殊代码的常量节点。

Result 节点用于不扫描任何关系的查询,例如:

(请记住,INSERT 或 UPDATE 需要一棵生成新行的计划树。)

Result 节点也用于优化带有常量条件(即不依赖扫描数据的条件)的查询,例如:

运行时,Result 节点只计算一次常量条件,EXPLAIN 将其显示为 One-Time Filter。如果条件为假,无需运行受控计划便可返回空结果集;如果为真,则正常运行受控计划并传回结果。

核心源码中的 EXPLAIN 标识

case T_Result:
			pname = sname = "Result";
			break;

本构建中的 EXPLAIN 标签

文本格式标签结构化节点标识
ResultResult

相关条目

文档与源码

来源构建
版本
18.6
构建
PostgreSQL 18.6 source archive
来源指纹
555610c24d53e4316da5b7d3fc25c279d96856d5e0e23ee308c328c5fa881d9f

版本比较

PostgreSQL 17 → 18: 无变化。

比较已记录的接口与属性,排除来源指纹和构建元数据。某个样本中没有记录,不能据此判断实际引入或移除的版本。

相关条目

导出 JSON · 返回执行计划节点 · 收录范围为 PostgreSQL 10 至 20;最早采样版本不一定是实际引入版本。