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

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

百科 / 执行计划节点 / 连接

Nested Loop

NestLoop

针对外侧行重新扫描内侧计划,并计算连接条件。

当前查看 PostgreSQL 18.6。

说明

针对外侧行重新扫描内侧计划,并计算连接条件。

核心节点标签
T_NestLoop
结构化 EXPLAIN 节点类型
Nested Loop
输入
外侧和内侧子计划
输出
按所选连接类型生成的连接元组
执行器初始化函数
ExecInitNestLoop
内存机制
unclassified

EXPLAIN 名称与属性

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

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

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

内存与临时存储

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

并行执行与运行信息采集

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

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

同版本手册说明

与非并行计划一样,驱动表可以通过嵌套循环、哈希连接或归并连接与一个或多个其他表连接。连接的内侧可以是规划器支持的任何类型的非并行计划,只要它能够安全地在并行工作进程中运行。根据连接类型,内侧也可以是并行计划。

在 嵌套循环连接 中,内侧始终是非并行的。尽管它会被完整执行,但如果内侧是索引扫描,这种方式仍然是高效的,因为外侧元组以及在索引中查找值的循环会分摊到多个协作进程上。

本版手册中的示例

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

使用前面讨论的列,尝试连接两个表:

EXPLAIN SELECT *
FROM tenk1 t1, tenk2 t2
WHERE t1.unique1 < 10 AND t1.unique2 = t2.unique2;

                                      QUERY PLAN
--------------------------------------------------------------------------------------
 Nested Loop  (cost=4.65..118.50 rows=10 width=488)
   ->  Bitmap Heap Scan on tenk1 t1  (cost=4.36..39.38 rows=10 width=244)
         Recheck Cond: (unique1 < 10)
         ->  Bitmap Index Scan on tenk1_unique1  (cost=0.00..4.36 rows=10 width=0)
               Index Cond: (unique1 < 10)
   ->  Index Scan using tenk2_unique2 on tenk2 t2  (cost=0.29..7.90 rows=1 width=244)
         Index Cond: (unique2 = t1.unique2)

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

本例中,连接的输出行数等于两次扫描行数的乘积,但并非总是如此:可能存在同时引用两个表的额外 WHERE 子句,只能在连接时应用,无法应用到任何单侧输入扫描。示例如下:

EXPLAIN SELECT *
FROM tenk1 t1, tenk2 t2
WHERE t1.unique1 < 10 AND t2.unique2 < 10 AND t1.hundred < t2.hundred;

                                         QUERY PLAN
---------------------------------------------------------------------------------------------
 Nested Loop  (cost=4.65..49.36 rows=33 width=488)
   Join Filter: (t1.hundred < t2.hundred)
   ->  Bitmap Heap Scan on tenk1 t1  (cost=4.36..39.38 rows=10 width=244)
         Recheck Cond: (unique1 < 10)
         ->  Bitmap Index Scan on tenk1_unique1  (cost=0.00..4.36 rows=10 width=0)
               Index Cond: (unique1 < 10)
   ->  Materialize  (cost=0.29..8.51 rows=10 width=244)
         ->  Index Scan using tenk2_unique2 on tenk2 t2  (cost=0.29..8.46 rows=10 width=244)
               Index Cond: (unique2 < 10)

执行器实现说明

旧注释:返回由内外侧元组连接产生且满足筛选条件的元组。

扫描内侧关系,将其与当前外侧元组连接。

如果未找到匹配项,则从外侧关系获取下一个元组,再从头扫描内侧关系,与该外侧元组进行连接。

尝试了所有剩余外侧元组且都无法与内侧元组连接时,返回 NULL。

内侧关系没有元组时也返回 NULL。

核心源码中的 EXPLAIN 标识

case T_NestLoop:
			pname = sname = "Nested Loop";
			break;

本构建中的 EXPLAIN 标签

文本格式标签结构化节点标识
Nested LoopNested Loop

相关条目

文档与源码

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

版本比较

PostgreSQL 17 → 18: 无变化。

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

相关条目

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