Bitmap Heap Scan
BitmapHeapScan
访问位图选中的堆页,并执行必要的重检。
当前查看 PostgreSQL 18.6。
说明
访问位图选中的堆页,并执行必要的重检。
- 核心节点标签
- T_BitmapHeapScan
- 结构化 EXPLAIN 节点类型
- Bitmap Heap Scan
- 输入
- 元组位置位图及关系
- 输出
- 满足条件的堆元组
- 执行器初始化函数
- ExecInitBitmapHeapScan
- 内存机制
- unclassified
EXPLAIN 名称与属性
结构化格式使用上述 Node Type。文本格式名称还可能包含操作、策略、连接类型、扫描方向或聚合阶段属性。
此源码记录的文本名称:Bitmap Heap Scan.
并行感知与并行安全是不同的计划属性。在并行工作进程内运行的节点不一定是并行感知节点。
内存与临时存储
本次抽取不为此节点设定统一的内存上限或落盘策略。请查看同一构建的实现、相关表达式或提供方。
使用有损信息时,必须对每个元组重新检查条件。
并行执行与运行信息采集
以下源码回调可以协调执行或收集工作进程的测量数据。回调存在不代表该节点普遍支持共享并行扫描或共享状态。
此构建的回调:ExecBitmapHeapEstimate, ExecBitmapHeapInitializeDSM, ExecBitmapHeapInitializeWorker, ExecBitmapHeapReInitializeDSM, ExecBitmapHeapRetrieveInstrumentation.
同版本手册说明
在 并行位图堆扫描 中,会选择一个进程作为领导者。该进程执行一个或多个索引扫描,并构建一个位图,以指示需要访问哪些表块。然后这些块会像并行顺序扫描那样分配给协作进程。换句话说,堆扫描是并行执行的,但底层索引扫描不是。
本版手册中的示例
示例摘自 PostgreSQL 18.6 手册;本百科未实际执行此示例。
现在进一步收紧条件:
EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 100;
QUERY PLAN
------------------------------------------------------------------------------
Bitmap Heap Scan on tenk1 (cost=5.06..224.98 rows=100 width=244)
Recheck Cond: (unique1 < 100)
-> Bitmap Index Scan on tenk1_unique1 (cost=0.00..5.04 rows=100 width=0)
Index Cond: (unique1 < 100)示例摘自 PostgreSQL 18.6 手册;本百科未实际执行此示例。
现在向 WHERE 子句再添加一个条件:
EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 100 AND stringu1 = 'xxx';
QUERY PLAN
------------------------------------------------------------------------------
Bitmap Heap Scan on tenk1 (cost=5.04..225.20 rows=1 width=244)
Recheck Cond: (unique1 < 100)
Filter: (stringu1 = 'xxx'::name)
-> Bitmap Index Scan on tenk1_unique1 (cost=0.00..5.04 rows=100 width=0)
Index Cond: (unique1 < 100)执行器实现说明
nodeBitmapHeapscan.c:支持关系位图扫描的例程。
注意:此计划类型必须仅使用符合 MVCC 的快照,即普通快照,而非 SnapshotAny 或其他特殊快照。索引扫描与堆扫描相互分离,访问某个堆 TID 时,无法保证促成该访问的索引元组仍然存在。堆元组可能已经消失(heap_fetch 能处理这种情况),更严重的是,其位置可能已被更新的元组复用。使用 MVCC 快照时,新元组必定无法通过时间可见性检查,因此不会错误返回;使用其他快照则可能返回不符合索引条件的元组。
执行底层索引扫描并构建位图,设置并行工作进程迭代位图所需的并行状态,以及底层表扫描描述符。
领导进程会立即退出该函数,其他进程则阻塞,直到领导进程填充 TBM 并唤醒它们。
准备遍历 TBM,返回迭代器状态的 dsa_pointer,供多个进程共同遍历。
核心源码中的 EXPLAIN 标识
case T_BitmapHeapScan:
pname = sname = "Bitmap Heap Scan";
break;本构建中的 EXPLAIN 标签
| 文本格式标签 | 结构化节点标识 |
|---|---|
| Bitmap Heap Scan | Bitmap Heap Scan |
相关条目
文档与源码
- src/backend/commands/explain.c:1453
- src/backend/executor/execProcnode.c:234
- src/backend/executor/nodeBitmapHeapscan.c
- src/include/nodes/plannodes.h
- PostgreSQL 18.6 · parallel-plans
- PostgreSQL 18.6 · using-explain
来源构建
- 版本
- 18.6
- 构建
- PostgreSQL 18.6 source archive
- 来源指纹
555610c24d53e4316da5b7d3fc25c279d96856d5e0e23ee308c328c5fa881d9f
版本比较
PostgreSQL 17 → 18: 属性变化。
以下差异保留原始字段名与英文源描述。
--- PostgreSQL 17
+++ PostgreSQL 18
@@ -6,7 +6,8 @@
"ExecBitmapHeapEstimate",
"ExecBitmapHeapInitializeDSM",
"ExecBitmapHeapInitializeWorker",
- "ExecBitmapHeapReInitializeDSM"
+ "ExecBitmapHeapReInitializeDSM",
+ "ExecBitmapHeapRetrieveInstrumentation"
],
"partial_modes": [],
"strategies": [],
比较已记录的接口与属性,排除来源指纹和构建元数据。某个样本中没有记录,不能据此判断实际引入或移除的版本。
相关条目
CTE ScanCteScanFunction ScanFunctionScanIndex Only ScanIndexOnlyScanIndex ScanIndexScanNamed Tuplestore ScanNamedTuplestoreScanSample ScanSampleScanSeq ScanSeqScanSubquery ScanSubqueryScanTable Function ScanTableFuncScanTid Range ScanTidRangeScanTid ScanTidScanValues ScanValuesScan
导出 JSON · 返回执行计划节点 · 收录范围为 PostgreSQL 10 至 20;最早采样版本不一定是实际引入版本。