Redrock Postgres 搜索 英文
版本: 12 / 13 / 14 / 15 / 16 / 17

第 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的子部分有同样的含义并不完全必要,例如,对于 来说,但是如果需要位图扫描支持(它是可选的),则块号需要提供局部性。

为了实现防崩溃,AM 可以使用 postgres 的 WAL,或者自定义实现。如果WAL已选择,可以使用 通用 WAL 记录 或者可以实施 自定义 WAL 资源管理器

要以允许在单次事务中访问不同表访问方法的方式实施事务支持,可能必须紧密集成 src/backend/access/transam/xlog.c 中的机制。

任何新 表访问方法 的开发者都可以参考 src/backend/access/heap/heapam_handler.c 中现有的 实现,以了解其实现详细信息。