本章介绍核心 PostgreSQL 系统与 表访问方法 之间的接口,表访问方法管理表的数据存储。核心系统对这些访问方法了解甚少,仅限于此处说明的内容,因此可以通过编写附加代码来开发完全新的访问方法类型。
每个表访问方法都由 pg_am
系统目录中的一行描述。 pg_am
条目指定名称和 处理函数 用于表访问方法。可以使用 CREATE ACCESS METHOD 和 DROP ACCESS METHOD SQL 命令创建和删除这些条目。
表访问方法处理函数必须声明为接受一个类型为 internal
的参数,并返回伪类型 table_am_handler
。参数是一个虚拟值,它仅仅是为了防止处理函数被直接从 SQL 命令调用。函数的结果必须是指向类型为 TableAmRoutine
结构的指针,该结构包含核心代码所需的所有信息以使用表访问方法。返回值需要具有服务器的生命周期,通常可以通过将其定义为全局范围内的 static const
变量来实现。 TableAmRoutine
结构(也称为访问方法的 API 结构)使用回调定义访问方法的行为。这些回调是指向普通 C 函数的指针,在 SQL 层面上不可见或不可调用。所有回调及其行为都在 TableAmRoutine
结构中定义(结构内部的注释定义了回调的要求)。大多数回调都有包装函数,这些函数从表访问方法用户的角度(而不是实现者)进行文档化。详细信息,请参阅 src/include/access/tableam.h
文件。
要实现访问方法,实现者通常需要实现一种AM- 特定的元组表槽类型(请参阅 src/include/executor/tuptable.h
),这允许访问方法外部的代码持有 AM 元组的引用,并访问元组的列。
目前,AM 实际存储数据的方式相当不受限制。例如,可以使用 postgres 的共享缓冲区缓存,但这并非必需。如果使用,则使用 PostgreSQL 的标准页面布局(如 第 65.6 节 所述)可能更有意义。
表访问方法 API 的一个相当大的限制是,当前如果 AM 想要支持修改和/或索引,则每个元组都必须具有元组标识符(TID),由块号和项目号组成(另请参见 第 65.6 节)。TID的子部分不必与例如 heap
的含义相同,但如果需要位图扫描支持(可选),则块号需要提供局部性。
为了确保崩溃安全,AM 可以使用 postgres 的 WAL,或自定义实现。如果WAL被选择,可以使用 通用 WAL 记录,或者可以实现 自定义 WAL 资源管理器。
为了以允许在单个事务中访问不同的表访问方法的方式实现事务支持,可能需要与 src/backend/access/transam/xlog.c
中的机制紧密集成。
任何新 表访问方法
的开发者都可以参考 src/backend/access/heap/heapam_handler.c
中现有的 heap
实现来了解其实现细节。
如果您在文档中发现任何不正确、与您在特定功能上的经验不符或需要进一步说明的内容,请使用 此表格 报告文档问题。