heap
Core table AM
本章说明 PostgreSQL 核心系统与管理表存储的 表访问方法 之间的接口。除这里规定的内容之外,核心系统对这些访问方法知之甚少,因此可以通过编写附加代码来开发全新的访问方法类型。 每个表访问方法都由系统目录 pg_am 中的一行描述。 pg_am 条目指定了该表访问方法的名称以及一个 处理器函数 。这些条目可以通过 CREATE ACCESS METHOD 和 DROP ACCESS METHOD SQL 命令创建和删除。 表访问方法的处理器函数必须声明为接受一个 internal 类型…
当前查看 PostgreSQL 18。
中文定义与说明
表访问方法 heap。
同版本中文手册节选
本章说明 PostgreSQL 核心系统与管理表存储的表访问方法之间的接口。除这里规定的内容之外,核心系统对这些访问方法知之甚少,因此可以通过编写附加代码来开发全新的访问方法类型。
每个表访问方法都由系统目录 pg_am 中的一行描述。pg_am 条目指定了该表访问方法的名称以及一个处理器函数。这些条目可以通过 CREATE ACCESS METHOD 和 DROP ACCESS METHOD SQL 命令创建和删除。
表访问方法的处理器函数必须声明为接受一个 internal 类型的参数,并返回伪类型
table_am_handler。这个参数只是一个占位值,用来防止处理器函数被 SQL 命令直接调用。
下面展示扩展 SQL 脚本文件如何创建表访问方法处理器:
说明
本章说明 PostgreSQL 核心系统与管理表存储的 表访问方法 之间的接口。除这里规定的内容之外,核心系统对这些访问方法知之甚少,因此可以通过编写附加代码来开发全新的访问方法类型。 每个表访问方法都由系统目录 pg_am 中的一行描述。 pg_am 条目指定了该表访问方法的名称以及一个 处理器函数 。这些条目可以通过 CREATE ACCESS METHOD 和 DROP ACCESS METHOD SQL 命令创建和删除。 表访问方法的处理器函数必须声明为接受一个 internal 类型的参数,并返回伪类型 table_am_handler 。这个参数只是一个占位值,用来防止处理器函数被 SQL 命令直接调用。 下面展示扩展 SQL 脚本文件如何创建表访问方法处理器:
- 接口类别
- 表访问方法
- 处理函数或例程
- heapam_methods
- 记录的回调
- 43
接口与能力边界
矩阵记录此源码构建实际注册的回调。注册表明实现了相应接口钩子;操作是否允许还取决于选项、查询形式、权限和提供方规则。
下方保留同版本完整手册,包括配置、约束和示例。不声称已进行运行时能力测试。
堆存储、可见性与 WAL
此清单从 PostgreSQL 12 引入的 Table AM 接口开始。不会将更早版本的 PostgreSQL 堆存储重新标为 Table AM 实现。
堆可见性遵循 PostgreSQL 快照。WAL 和崩溃恢复行为取决于关系的持久性;临时表、无日志表与永久表不同。索引访问方法与表存储接口分开。
核心源码中注册的实现
{
.type = T_TableAmRoutine,
.slot_callbacks = heapam_slot_callbacks,
.scan_begin = heap_beginscan,
.scan_end = heap_endscan,
.scan_rescan = heap_rescan,
.scan_getnextslot = heap_getnextslot,
.scan_set_tidrange = heap_set_tidrange,
.scan_getnextslot_tidrange = heap_getnextslot_tidrange,
.parallelscan_estimate = table_block_parallelscan_estimate,
.parallelscan_initialize = table_block_parallelscan_initialize,
.parallelscan_reinitialize = table_block_parallelscan_reinitialize,
.index_fetch_begin = heapam_index_fetch_begin,
.index_fetch_reset = heapam_index_fetch_reset,
.index_fetch_end = heapam_index_fetch_end,
.index_fetch_tuple = heapam_index_fetch_tuple,
.tuple_insert = heapam_tuple_insert,
.tuple_insert_speculative = heapam_tuple_insert_speculative,
.tuple_complete_speculative = heapam_tuple_complete_speculative,
.multi_insert = heap_multi_insert,
.tuple_delete = heapam_tuple_delete,
.tuple_update = heapam_tuple_update,
.tuple_lock = heapam_tuple_lock,
.tuple_fetch_row_version = heapam_fetch_row_version,
.tuple_get_latest_tid = heap_get_latest_tid,
.tuple_tid_valid = heapam_tuple_tid_valid,
.tuple_satisfies_snapshot = heapam_tuple_satisfies_snapshot,
.index_delete_tuples = heap_index_delete_tuples,
.relation_set_new_filelocator = heapam_relation_set_new_filelocator,
.relation_nontransactional_truncate = heapam_relation_nontransactional_truncate,
.relation_copy_data = heapam_relation_copy_data,
.relation_copy_for_cluster = heapam_relation_copy_for_cluster,
.relation_vacuum = heap_vacuum_rel,
.scan_analyze_next_block = heapam_scan_analyze_next_block,
.scan_analyze_next_tuple = heapam_scan_analyze_next_tuple,
.index_build_range_scan = heapam_index_build_range_scan,
.index_validate_scan = heapam_index_validate_scan,
.relation_size = table_block_relation_size,
.relation_needs_toast_table = heapam_relation_needs_toast_table,
.relation_toast_am = heapam_relation_toast_am,
.relation_fetch_toast_slice = heap_fetch_toast_slice,
.relation_estimate_size = heapam_estimate_rel_size,
.scan_bitmap_next_tuple = heapam_scan_bitmap_next_tuple,
.scan_sample_next_block = heapam_scan_sample_next_block,
.scan_sample_next_tuple = heapam_scan_sample_next_tuple
}注册的接口处理函数
| 接口操作 | 源码观察 | 回调 | 实现 |
|---|---|---|---|
| 元组槽 | 已注册处理函数;适用条件限制 | slot_callbacks | heapam_slot_callbacks |
| 开始扫描 | 已注册处理函数;适用条件限制 | scan_begin | heap_beginscan |
| 初始化并行扫描 | 已注册处理函数;适用条件限制 | parallelscan_initialize | table_block_parallelscan_initialize |
| 开始索引查找 | 已注册处理函数;适用条件限制 | index_fetch_begin | heapam_index_fetch_begin |
| 获取指定元组 | 已注册处理函数;适用条件限制 | index_fetch_tuple | heapam_index_fetch_tuple |
| 插入元组 | 已注册处理函数;适用条件限制 | tuple_insert | heapam_tuple_insert |
| 更新元组 | 已注册处理函数;适用条件限制 | tuple_update | heapam_tuple_update |
| 删除元组 | 已注册处理函数;适用条件限制 | tuple_delete | heapam_tuple_delete |
| 对关系执行 VACUUM | 已注册处理函数;适用条件限制 | relation_vacuum | heap_vacuum_rel |
| 分析数据块 | 已注册处理函数;适用条件限制 | scan_analyze_next_block | heapam_scan_analyze_next_block |
| TOAST 判定 | 已注册处理函数;适用条件限制 | relation_needs_toast_table | heapam_relation_needs_toast_table |
相关条目
文档与源码
- PostgreSQL 18 English manual
- src/backend/access/heap/heapam_handler.c:2616
- PostgreSQL 18 English manual
- PostgreSQL 18 English manual
- PostgreSQL 18 English manual
- PostgreSQL 18 English manual
来源构建
- 版本
- 18.6
- 构建
- PostgreSQL 18.6 source archive
- 来源指纹
555610c24d53e4316da5b7d3fc25c279d96856d5e0e23ee308c328c5fa881d9f
版本比较
PostgreSQL 13 → 14: 属性变化。
以下差异保留原始字段名与英文源描述。
--- PostgreSQL 13
+++ PostgreSQL 14
@@ -1,7 +1,7 @@
{
"callbacks": {
- "compute_xid_horizon_for_tuples": "heap_compute_xid_horizon_for_tuples",
"index_build_range_scan": "heapam_index_build_range_scan",
+ "index_delete_tuples": "heap_index_delete_tuples",
"index_fetch_begin": "heapam_index_fetch_begin",
"index_fetch_end": "heapam_index_fetch_end",
"index_fetch_reset": "heapam_index_fetch_reset",
@@ -28,9 +28,11 @@
"scan_bitmap_next_tuple": "heapam_scan_bitmap_next_tuple",
"scan_end": "heap_endscan",
"scan_getnextslot": "heap_getnextslot",
+ "scan_getnextslot_tidrange": "heap_getnextslot_tidrange",
"scan_rescan": "heap_rescan",
"scan_sample_next_block": "heapam_scan_sample_next_block",
"scan_sample_next_tuple": "heapam_scan_sample_next_tuple",
+ "scan_set_tidrange": "heap_set_tidrange",
"slot_callbacks": "heapam_slot_callbacks",
"tuple_complete_speculative": "heapam_tuple_complete_speculative",
"tuple_delete": "heapam_tuple_delete",
比较已记录的接口与属性,排除来源指纹和构建元数据。某个样本中没有记录,不能据此判断实际引入或移除的版本。
导出 JSON · 返回Table AM · 收录范围为 PostgreSQL 12 至 20;最早采样版本不一定是实际引入版本。