支持的版本:当前17)/ 16 / 15 / 14 / 13
开发版本:devel
不支持的版本:12

第 61 章 表访问方法接口定义

本章解释了核心 PostgreSQL 系统和表访问方法之间的接口,表访问方法管理表的存储。核心系统对这些访问方法的了解仅限于此处指定的,因此可以通过编写附加代码来开发全新的访问方法类型。

每个表访问方法在 pg_am 系统目录中由一行描述。pg_am 条目指定表访问方法的名称和处理函数。可以使用 CREATE ACCESS METHODDROP 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 实现,以了解其实现的详细信息。

提交更正

如果您在文档中看到任何不正确、与您使用特定功能的体验不符或需要进一步澄清的地方,请使用此表单报告文档问题。